From 95a1cc8c918ec1bdafdf6110439aa14e82a84543 Mon Sep 17 00:00:00 2001 From: Ray Slakinski Date: Mon, 20 Jul 2009 15:34:38 -0400 Subject: [PATCH] first commit --- .gitignore | 5 + BitTorrent/Choker.py | 157 ++ BitTorrent/ClientIdentifier.py | 156 ++ BitTorrent/Connecter.py | 337 +++ BitTorrent/ConvertedMetainfo.py | 288 +++ BitTorrent/CurrentRateMeasure.py | 48 + BitTorrent/Desktop.py | 33 + BitTorrent/Downloader.py | 363 +++ BitTorrent/DownloaderFeedback.py | 139 + BitTorrent/Encoder.py | 185 ++ BitTorrent/GUI.py | 773 ++++++ BitTorrent/GetTorrent.py | 82 + BitTorrent/HTTPHandler.py | 188 ++ BitTorrent/LaunchPath.py | 54 + BitTorrent/NatCheck.py | 101 + BitTorrent/NewVersion.py | 249 ++ BitTorrent/PiecePicker.py | 138 + BitTorrent/RateLimiter.py | 183 ++ BitTorrent/RateMeasure.py | 63 + BitTorrent/RawServer.py | 472 ++++ BitTorrent/RawServer_magic.py | 63 + BitTorrent/RawServer_twisted.py | 621 +++++ BitTorrent/Rerequester.py | 291 +++ BitTorrent/Storage.py | 273 ++ BitTorrent/StorageWrapper.py | 408 +++ BitTorrent/TorrentQueue.py | 810 ++++++ BitTorrent/Uploader.py | 97 + BitTorrent/__init__.py | 123 + BitTorrent/bencode.py | 130 + BitTorrent/bitfield.py | 77 + BitTorrent/btformats.py | 140 + BitTorrent/configfile.py | 217 ++ BitTorrent/controlsocket.py | 312 +++ BitTorrent/defaultargs.py | 267 ++ BitTorrent/defer.py | 56 + BitTorrent/download.py | 583 +++++ BitTorrent/launchmanycore.py | 260 ++ BitTorrent/makemetafile.py | 263 ++ BitTorrent/obsoletepythonsupport.py | 33 + BitTorrent/parseargs.py | 187 ++ BitTorrent/parsedir.py | 150 ++ BitTorrent/platform.py | 290 +++ BitTorrent/prefs.py | 88 + BitTorrent/selectpoll.py | 68 + BitTorrent/track.py | 874 +++++++ BitTorrent/zurllib.py | 164 ++ Foundation/Conversion.py | 10 + Foundation/_Foundation.so | Bin 0 -> 439824 bytes Foundation/__init__.py | 49 + Foundation/protocols.py | 1856 ++++++++++++++ LICENSE | 1 + README | 4 + btlocale/fr/LC_MESSAGES/bittorrent.mo | Bin 0 -> 18488 bytes btlocale/fr/LC_MESSAGES/bittorrent.po | 2625 +++++++++++++++++++ btlocale/he_IL/LC_MESSAGES/bittorrent.mo | Bin 0 -> 2602 bytes btlocale/he_IL/LC_MESSAGES/bittorrent.po | 2583 +++++++++++++++++++ btlocale/it/LC_MESSAGES/bittorrent.mo | Bin 0 -> 59106 bytes btlocale/it/LC_MESSAGES/bittorrent.po | 2802 ++++++++++++++++++++ btlocale/no/LC_MESSAGES/bittorrent.mo | Bin 0 -> 55054 bytes btlocale/no/LC_MESSAGES/bittorrent.po | 2766 ++++++++++++++++++++ btlocale/pt_BR/LC_MESSAGES/bittorrent.mo | Bin 0 -> 57953 bytes btlocale/pt_BR/LC_MESSAGES/bittorrent.po | 2783 ++++++++++++++++++++ feedparser.py | 2591 +++++++++++++++++++ iPXAgent.py | 177 ++ iPXClass.py | 1334 ++++++++++ iPXDownloader.py | 662 +++++ iPXFileSwap.py | 32 + iPXQuotaManager.py | 218 ++ iPXSettings.py | 241 ++ iPXTools.py | 1206 +++++++++ khashmir/KRateLimiter.py | 75 + khashmir/__init__.py | 0 khashmir/actions.py | 349 +++ khashmir/cache.py | 52 + khashmir/const.py | 65 + khashmir/hammerlock.py | 37 + khashmir/inserter.py | 49 + khashmir/khash.py | 120 + khashmir/khashmir.py | 442 ++++ khashmir/knet.py | 76 + khashmir/knode.py | 82 + khashmir/krpc.py | 243 ++ khashmir/kstore.py | 119 + khashmir/ktable.py | 340 +++ khashmir/node.py | 95 + khashmir/setup.py | 70 + khashmir/test.py | 21 + khashmir/test_khashmir.py | 166 ++ khashmir/test_krpc.py | 161 ++ khashmir/test_kstore.py | 91 + khashmir/unet.py | 84 + khashmir/util.py | 69 + khashmir/utkhashmir.py | 218 ++ locale/af/LC_MESSAGES/bittorrent.mo | Bin 0 -> 31424 bytes locale/af/LC_MESSAGES/bittorrent.po | 2749 ++++++++++++++++++++ locale/bg/LC_MESSAGES/bittorrent.mo | Bin 0 -> 79754 bytes locale/bg/LC_MESSAGES/bittorrent.po | 2875 +++++++++++++++++++++ locale/ca/LC_MESSAGES/bittorrent.mo | Bin 0 -> 64549 bytes locale/ca/LC_MESSAGES/bittorrent.po | 2930 +++++++++++++++++++++ locale/cs/LC_MESSAGES/bittorrent.mo | Bin 0 -> 48881 bytes locale/cs/LC_MESSAGES/bittorrent.po | 2820 +++++++++++++++++++++ locale/da/LC_MESSAGES/bittorrent.mo | Bin 0 -> 59170 bytes locale/da/LC_MESSAGES/bittorrent.po | 2849 +++++++++++++++++++++ locale/de/LC_MESSAGES/bittorrent.mo | Bin 0 -> 64211 bytes locale/de/LC_MESSAGES/bittorrent.po | 2945 ++++++++++++++++++++++ locale/en/LC_MESSAGES/bittorrent.po | 0 locale/es/LC_MESSAGES/bittorrent.mo | Bin 0 -> 63064 bytes locale/es/LC_MESSAGES/bittorrent.po | 2910 +++++++++++++++++++++ locale/es_MX/LC_MESSAGES/bittorrent.mo | Bin 0 -> 63290 bytes locale/es_MX/LC_MESSAGES/bittorrent.po | 2921 +++++++++++++++++++++ locale/fr/LC_MESSAGES/bittorrent.mo | Bin 0 -> 63355 bytes locale/fr/LC_MESSAGES/bittorrent.po | 2903 +++++++++++++++++++++ locale/gr/LC_MESSAGES/bittorrent.mo | Bin 0 -> 37324 bytes locale/gr/LC_MESSAGES/bittorrent.po | 2747 ++++++++++++++++++++ locale/hu/LC_MESSAGES/bittorrent.mo | Bin 0 -> 64504 bytes locale/hu/LC_MESSAGES/bittorrent.po | 2897 +++++++++++++++++++++ locale/it/LC_MESSAGES/bittorrent.mo | Bin 0 -> 61747 bytes locale/it/LC_MESSAGES/bittorrent.po | 2898 +++++++++++++++++++++ locale/ja/LC_MESSAGES/bittorrent.mo | Bin 0 -> 39566 bytes locale/ja/LC_MESSAGES/bittorrent.po | 2755 ++++++++++++++++++++ locale/ko/LC_MESSAGES/bittorrent.mo | Bin 0 -> 33136 bytes locale/ko/LC_MESSAGES/bittorrent.po | 2743 ++++++++++++++++++++ locale/nb_NO/LC_MESSAGES/bittorrent.mo | Bin 0 -> 58884 bytes locale/nb_NO/LC_MESSAGES/bittorrent.po | 2849 +++++++++++++++++++++ locale/nl/LC_MESSAGES/bittorrent.mo | Bin 0 -> 61233 bytes locale/nl/LC_MESSAGES/bittorrent.po | 2903 +++++++++++++++++++++ locale/pl/LC_MESSAGES/bittorrent.mo | Bin 0 -> 62632 bytes locale/pl/LC_MESSAGES/bittorrent.po | 2895 +++++++++++++++++++++ locale/pt/LC_MESSAGES/bittorrent.mo | Bin 0 -> 61741 bytes locale/pt/LC_MESSAGES/bittorrent.po | 2880 +++++++++++++++++++++ locale/pt_BR/LC_MESSAGES/bittorrent.mo | Bin 0 -> 61188 bytes locale/pt_BR/LC_MESSAGES/bittorrent.po | 2873 +++++++++++++++++++++ locale/ro/LC_MESSAGES/bittorrent.mo | Bin 0 -> 62259 bytes locale/ro/LC_MESSAGES/bittorrent.po | 2891 +++++++++++++++++++++ locale/ru/LC_MESSAGES/bittorrent.mo | Bin 0 -> 80481 bytes locale/ru/LC_MESSAGES/bittorrent.po | 2884 +++++++++++++++++++++ locale/sk/LC_MESSAGES/bittorrent.mo | Bin 0 -> 37478 bytes locale/sk/LC_MESSAGES/bittorrent.po | 2782 ++++++++++++++++++++ locale/sl/LC_MESSAGES/bittorrent.mo | Bin 0 -> 48562 bytes locale/sl/LC_MESSAGES/bittorrent.po | 2820 +++++++++++++++++++++ locale/sv/LC_MESSAGES/bittorrent.mo | Bin 0 -> 59760 bytes locale/sv/LC_MESSAGES/bittorrent.po | 2863 +++++++++++++++++++++ locale/tr/LC_MESSAGES/bittorrent.mo | Bin 0 -> 55137 bytes locale/tr/LC_MESSAGES/bittorrent.po | 2862 +++++++++++++++++++++ locale/vi/LC_MESSAGES/bittorrent.mo | Bin 0 -> 69081 bytes locale/vi/LC_MESSAGES/bittorrent.po | 2881 +++++++++++++++++++++ locale/zh_CN/LC_MESSAGES/bittorrent.mo | Bin 0 -> 59669 bytes locale/zh_CN/LC_MESSAGES/bittorrent.po | 2770 ++++++++++++++++++++ locale/zh_TW/LC_MESSAGES/bittorrent.mo | Bin 0 -> 52194 bytes locale/zh_TW/LC_MESSAGES/bittorrent.po | 2752 ++++++++++++++++++++ objc/_FoundationSignatures.py | 64 + objc/__init__.py | 40 + objc/_bridges.py | 30 + objc/_category.py | 63 + objc/_compat.py | 58 + objc/_convenience.py | 602 +++++ objc/_descriptors.py | 98 + objc/_dyld.py | 129 + objc/_framework.py | 24 + objc/_functions.py | 44 + objc/_gnustep.py | 13 + objc/_objc.so | Bin 0 -> 964424 bytes objc/_protocols.py | 31 + objc/_pythonify.py | 81 + opmlparser.py | 294 +++ plistlib.py | 502 ++++ pyDes.py | 751 ++++++ 167 files changed, 118494 insertions(+) create mode 100644 .gitignore create mode 100755 BitTorrent/Choker.py create mode 100755 BitTorrent/ClientIdentifier.py create mode 100755 BitTorrent/Connecter.py create mode 100755 BitTorrent/ConvertedMetainfo.py create mode 100755 BitTorrent/CurrentRateMeasure.py create mode 100755 BitTorrent/Desktop.py create mode 100755 BitTorrent/Downloader.py create mode 100755 BitTorrent/DownloaderFeedback.py create mode 100755 BitTorrent/Encoder.py create mode 100755 BitTorrent/GUI.py create mode 100755 BitTorrent/GetTorrent.py create mode 100755 BitTorrent/HTTPHandler.py create mode 100755 BitTorrent/LaunchPath.py create mode 100755 BitTorrent/NatCheck.py create mode 100755 BitTorrent/NewVersion.py create mode 100755 BitTorrent/PiecePicker.py create mode 100755 BitTorrent/RateLimiter.py create mode 100755 BitTorrent/RateMeasure.py create mode 100755 BitTorrent/RawServer.py create mode 100755 BitTorrent/RawServer_magic.py create mode 100755 BitTorrent/RawServer_twisted.py create mode 100755 BitTorrent/Rerequester.py create mode 100755 BitTorrent/Storage.py create mode 100755 BitTorrent/StorageWrapper.py create mode 100755 BitTorrent/TorrentQueue.py create mode 100755 BitTorrent/Uploader.py create mode 100755 BitTorrent/__init__.py create mode 100755 BitTorrent/bencode.py create mode 100755 BitTorrent/bitfield.py create mode 100755 BitTorrent/btformats.py create mode 100755 BitTorrent/configfile.py create mode 100755 BitTorrent/controlsocket.py create mode 100755 BitTorrent/defaultargs.py create mode 100755 BitTorrent/defer.py create mode 100755 BitTorrent/download.py create mode 100755 BitTorrent/launchmanycore.py create mode 100755 BitTorrent/makemetafile.py create mode 100755 BitTorrent/obsoletepythonsupport.py create mode 100755 BitTorrent/parseargs.py create mode 100755 BitTorrent/parsedir.py create mode 100755 BitTorrent/platform.py create mode 100755 BitTorrent/prefs.py create mode 100755 BitTorrent/selectpoll.py create mode 100755 BitTorrent/track.py create mode 100755 BitTorrent/zurllib.py create mode 100755 Foundation/Conversion.py create mode 100755 Foundation/_Foundation.so create mode 100755 Foundation/__init__.py create mode 100755 Foundation/protocols.py create mode 100644 LICENSE create mode 100644 README create mode 100755 btlocale/fr/LC_MESSAGES/bittorrent.mo create mode 100755 btlocale/fr/LC_MESSAGES/bittorrent.po create mode 100755 btlocale/he_IL/LC_MESSAGES/bittorrent.mo create mode 100755 btlocale/he_IL/LC_MESSAGES/bittorrent.po create mode 100755 btlocale/it/LC_MESSAGES/bittorrent.mo create mode 100755 btlocale/it/LC_MESSAGES/bittorrent.po create mode 100755 btlocale/no/LC_MESSAGES/bittorrent.mo create mode 100755 btlocale/no/LC_MESSAGES/bittorrent.po create mode 100755 btlocale/pt_BR/LC_MESSAGES/bittorrent.mo create mode 100755 btlocale/pt_BR/LC_MESSAGES/bittorrent.po create mode 100755 feedparser.py create mode 100755 iPXAgent.py create mode 100755 iPXClass.py create mode 100755 iPXDownloader.py create mode 100755 iPXFileSwap.py create mode 100755 iPXQuotaManager.py create mode 100755 iPXSettings.py create mode 100755 iPXTools.py create mode 100755 khashmir/KRateLimiter.py create mode 100755 khashmir/__init__.py create mode 100755 khashmir/actions.py create mode 100755 khashmir/cache.py create mode 100755 khashmir/const.py create mode 100755 khashmir/hammerlock.py create mode 100755 khashmir/inserter.py create mode 100755 khashmir/khash.py create mode 100755 khashmir/khashmir.py create mode 100755 khashmir/knet.py create mode 100755 khashmir/knode.py create mode 100755 khashmir/krpc.py create mode 100755 khashmir/kstore.py create mode 100755 khashmir/ktable.py create mode 100755 khashmir/node.py create mode 100755 khashmir/setup.py create mode 100755 khashmir/test.py create mode 100755 khashmir/test_khashmir.py create mode 100755 khashmir/test_krpc.py create mode 100755 khashmir/test_kstore.py create mode 100755 khashmir/unet.py create mode 100755 khashmir/util.py create mode 100755 khashmir/utkhashmir.py create mode 100755 locale/af/LC_MESSAGES/bittorrent.mo create mode 100755 locale/af/LC_MESSAGES/bittorrent.po create mode 100755 locale/bg/LC_MESSAGES/bittorrent.mo create mode 100755 locale/bg/LC_MESSAGES/bittorrent.po create mode 100755 locale/ca/LC_MESSAGES/bittorrent.mo create mode 100755 locale/ca/LC_MESSAGES/bittorrent.po create mode 100755 locale/cs/LC_MESSAGES/bittorrent.mo create mode 100755 locale/cs/LC_MESSAGES/bittorrent.po create mode 100755 locale/da/LC_MESSAGES/bittorrent.mo create mode 100755 locale/da/LC_MESSAGES/bittorrent.po create mode 100755 locale/de/LC_MESSAGES/bittorrent.mo create mode 100755 locale/de/LC_MESSAGES/bittorrent.po create mode 100755 locale/en/LC_MESSAGES/bittorrent.po create mode 100755 locale/es/LC_MESSAGES/bittorrent.mo create mode 100755 locale/es/LC_MESSAGES/bittorrent.po create mode 100755 locale/es_MX/LC_MESSAGES/bittorrent.mo create mode 100755 locale/es_MX/LC_MESSAGES/bittorrent.po create mode 100755 locale/fr/LC_MESSAGES/bittorrent.mo create mode 100755 locale/fr/LC_MESSAGES/bittorrent.po create mode 100755 locale/gr/LC_MESSAGES/bittorrent.mo create mode 100755 locale/gr/LC_MESSAGES/bittorrent.po create mode 100755 locale/hu/LC_MESSAGES/bittorrent.mo create mode 100755 locale/hu/LC_MESSAGES/bittorrent.po create mode 100755 locale/it/LC_MESSAGES/bittorrent.mo create mode 100755 locale/it/LC_MESSAGES/bittorrent.po create mode 100755 locale/ja/LC_MESSAGES/bittorrent.mo create mode 100755 locale/ja/LC_MESSAGES/bittorrent.po create mode 100755 locale/ko/LC_MESSAGES/bittorrent.mo create mode 100755 locale/ko/LC_MESSAGES/bittorrent.po create mode 100755 locale/nb_NO/LC_MESSAGES/bittorrent.mo create mode 100755 locale/nb_NO/LC_MESSAGES/bittorrent.po create mode 100755 locale/nl/LC_MESSAGES/bittorrent.mo create mode 100755 locale/nl/LC_MESSAGES/bittorrent.po create mode 100755 locale/pl/LC_MESSAGES/bittorrent.mo create mode 100755 locale/pl/LC_MESSAGES/bittorrent.po create mode 100755 locale/pt/LC_MESSAGES/bittorrent.mo create mode 100755 locale/pt/LC_MESSAGES/bittorrent.po create mode 100755 locale/pt_BR/LC_MESSAGES/bittorrent.mo create mode 100755 locale/pt_BR/LC_MESSAGES/bittorrent.po create mode 100755 locale/ro/LC_MESSAGES/bittorrent.mo create mode 100755 locale/ro/LC_MESSAGES/bittorrent.po create mode 100755 locale/ru/LC_MESSAGES/bittorrent.mo create mode 100755 locale/ru/LC_MESSAGES/bittorrent.po create mode 100755 locale/sk/LC_MESSAGES/bittorrent.mo create mode 100755 locale/sk/LC_MESSAGES/bittorrent.po create mode 100755 locale/sl/LC_MESSAGES/bittorrent.mo create mode 100755 locale/sl/LC_MESSAGES/bittorrent.po create mode 100755 locale/sv/LC_MESSAGES/bittorrent.mo create mode 100755 locale/sv/LC_MESSAGES/bittorrent.po create mode 100755 locale/tr/LC_MESSAGES/bittorrent.mo create mode 100755 locale/tr/LC_MESSAGES/bittorrent.po create mode 100755 locale/vi/LC_MESSAGES/bittorrent.mo create mode 100755 locale/vi/LC_MESSAGES/bittorrent.po create mode 100755 locale/zh_CN/LC_MESSAGES/bittorrent.mo create mode 100755 locale/zh_CN/LC_MESSAGES/bittorrent.po create mode 100755 locale/zh_TW/LC_MESSAGES/bittorrent.mo create mode 100755 locale/zh_TW/LC_MESSAGES/bittorrent.po create mode 100755 objc/_FoundationSignatures.py create mode 100755 objc/__init__.py create mode 100755 objc/_bridges.py create mode 100755 objc/_category.py create mode 100755 objc/_compat.py create mode 100755 objc/_convenience.py create mode 100755 objc/_descriptors.py create mode 100755 objc/_dyld.py create mode 100755 objc/_framework.py create mode 100755 objc/_functions.py create mode 100755 objc/_gnustep.py create mode 100755 objc/_objc.so create mode 100755 objc/_protocols.py create mode 100755 objc/_pythonify.py create mode 100644 opmlparser.py create mode 100755 plistlib.py create mode 100755 pyDes.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ceca56f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +*.py[co] +*.pid +*.log +django_cache diff --git a/BitTorrent/Choker.py b/BitTorrent/Choker.py new file mode 100755 index 0000000..ed3d500 --- /dev/null +++ b/BitTorrent/Choker.py @@ -0,0 +1,157 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from random import randrange +from math import sqrt + +class Choker(object): + + def __init__(self, config, schedule, done = lambda: False): + self.config = config + self.schedule = schedule + self.connections = [] + self.count = 0 + self.done = done + self.unchokes_since_last = 0 + schedule(self._round_robin, 10) + + def _round_robin(self): + self.schedule(self._round_robin, 10) + self.count += 1 + if self.done(): + self._rechoke_seed(True) + return + if self.count % 3 == 0: + for i in xrange(len(self.connections)): + u = self.connections[i].upload + if u.choked and u.interested: + self.connections = self.connections[i:] + self.connections[:i] + break + self._rechoke() + + def _rechoke(self): + if self.done(): + self._rechoke_seed() + return + preferred = [] + for i in xrange(len(self.connections)): + c = self.connections[i] + if c.upload.interested and not c.download.is_snubbed() and c.download.have.numfalse: + preferred.append((-c.download.get_rate(), i)) + preferred.sort() + prefcount = min(len(preferred), self._max_uploads() -1) + mask = [0] * len(self.connections) + for _, i in preferred[:prefcount]: + mask[i] = 1 + count = max(1, self.config['min_uploads'] - prefcount) + for i in xrange(len(self.connections)): + c = self.connections[i] + u = c.upload + if mask[i]: + u.unchoke(self.count) + elif count > 0 and c.download.have.numfalse: + u.unchoke(self.count) + if u.interested: + count -= 1 + else: + u.choke() + + def _rechoke_seed(self, force_new_unchokes = False): + if force_new_unchokes: + # number of unchokes per 30 second period + i = (self._max_uploads() + 2) // 3 + # this is called 3 times in 30 seconds, if i==4 then unchoke 1+1+2 + # and so on; substract unchokes recently triggered by disconnects + num_force_unchokes = max(0, (i + self.count % 3) // 3 - \ + self.unchokes_since_last) + else: + num_force_unchokes = 0 + preferred = [] + new_limit = self.count - 3 + for i in xrange(len(self.connections)): + c = self.connections[i] + u = c.upload + if not u.choked and u.interested and c.download.have.numfalse: + if u.unchoke_time > new_limit or ( + u.buffer and c.connection.is_flushed()): + preferred.append((-u.unchoke_time, -u.get_rate(), i)) + else: + preferred.append((1, -u.get_rate(), i)) + num_kept = self._max_uploads() - num_force_unchokes + assert num_kept >= 0 + preferred.sort() + preferred = preferred[:num_kept] + mask = [0] * len(self.connections) + for _, _, i in preferred: + mask[i] = 1 + num_nonpref = self._max_uploads() - len(preferred) + if force_new_unchokes: + self.unchokes_since_last = 0 + else: + self.unchokes_since_last += num_nonpref + last_unchoked = None + for i in xrange(len(self.connections)): + c = self.connections[i] + u = c.upload + if not mask[i]: + if not u.interested: + u.choke() + elif u.choked: + if num_nonpref > 0 and c.connection.is_flushed() and c.download.have.numfalse: + u.unchoke(self.count) + num_nonpref -= 1 + if num_nonpref == 0: + last_unchoked = i + else: + if num_nonpref == 0 or not c.download.have.numfalse: + u.choke() + else: + num_nonpref -= 1 + if num_nonpref == 0: + last_unchoked = i + if last_unchoked is not None: + self.connections = self.connections[last_unchoked + 1:] + \ + self.connections[:last_unchoked + 1] + + def connection_made(self, connection): + p = randrange(len(self.connections) + 1) + self.connections.insert(p, connection) + + def connection_lost(self, connection): + self.connections.remove(connection) + if connection.upload.interested and not connection.upload.choked: + self._rechoke() + + def interested(self, connection): + if not connection.upload.choked: + self._rechoke() + + def not_interested(self, connection): + if not connection.upload.choked: + self._rechoke() + + def _max_uploads(self): + uploads = self.config['max_uploads'] + rate = self.config['max_upload_rate'] + if uploads > 0: + pass + elif rate <= 0: + uploads = 7 # unlimited, just guess something here... + elif rate < 9: + uploads = 2 + elif rate < 15: + uploads = 3 + elif rate < 42: + uploads = 4 + else: + uploads = int(sqrt(rate * .6)) + return uploads diff --git a/BitTorrent/ClientIdentifier.py b/BitTorrent/ClientIdentifier.py new file mode 100755 index 0000000..e9dffb7 --- /dev/null +++ b/BitTorrent/ClientIdentifier.py @@ -0,0 +1,156 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. +# +# Written by Matt Chisholm +# Client list updated by Ed Savage-Jones - May 28th 2005 + +import re + +v64p = '[\da-zA-Z.-]{3}' + +matches = ( + ('-AZ(?P\d+)-+.+$' , "Azureus" ), + ('M(?P\d-\d-\d)--.+$' , "BitTorrent" ), + ('T(?P%s)-+.+$'%v64p , "BitTornado" ), + ('-TS(?P\d+)-+.+$' , "TorrentStorm" ), + ('exbc(?P.+)LORD.+$' , "BitLord" ), + ('exbc(?P[^-][^-]+)(?!---).+$', "BitComet" ), + ('-BC0(?P\d+)-.+$' , "BitComet" ), + ('FUTB(?P.+).+$' , "BitComet Mod1" ), + ('xUTB(?P.+).+$' , "BitComet Mod2" ), + ('A(?P%s)-+.+$'%v64p , "ABC" ), + ('S(?P%s)-+.+$'%v64p , "Shadow's" ), + (chr(0)*12 + 'aa.+$' , "Experimental 3.2.1b2" ), + (chr(0)*12 + '.+$' , "BitTorrent (obsolete)"), + ('-G3.+$' , "G3Torrent" ), + ('-[Ll][Tt](?P\d+)-+.+$' , "libtorrent" ), + ('Mbrst(?P\d-\d-\d).+$' , "burst!" ), + ('eX.+$' , "eXeem" ), + ('\x00\x02BS.+(?PUDP0|HTTPBT)$', "BitSpirit v2" ), + ('\x00[\x02|\x00]BS.+$' , "BitSpirit v2" ), + ('.*(?PUDP0|HTTPBT)$' , "BitSpirit" ), + ('-BOWP?(?P\d+)-.+$' , "Bits on Wheels" ), + ('(?P.+)RSAnonymous.+$' , "Rufus Anonymous" ), + ('(?P.+)RS.+$' , "Rufus" ), + ('-ML(?P(\d\.)+\d)(?:\.(?PCVS))?-+.+$',"MLDonkey"), + ('-UT(?P\d+)-+.+$' , u"\xb5Torrent" ), + ('346------.+$' , "TorrentTopia 1.70" ), + ('OP(?P\d{4}).+$' , "Opera" ), + ('-S(?P10059)-+.+$' , "S (unknown)" ), +# Clients I've never actually seen in a peer list: + ('exbc..---.+$' , "BitVampire 1.3.1" ), + ('-BB(?P\d+)-+.+$' , "BitBuddy" ), + ('-CT(?P\d+)-+.+$' , "CTorrent" ), + ('-MT(?P\d+)-+.+$' , "MoonlightTorrent" ), + ('-BX(?P\d+)-+.+$' , "BitTorrent X" ), + ('-TN(?P\d+)-+.+$' , "TorrentDotNET" ), + ('-SS(?P\d+)-+.+$' , "SwarmScope" ), + ('-XT(?P\d+)-+.+$' , "XanTorrent" ), + ('U(?P\d+)-+.+$' , "UPnP NAT Bit Torrent" ), + ('-AR(?P\d+)-+.+$' , "Arctic" ), + ('(?P.+)BM.+$' , "BitMagnet" ), + ('BG(?P\d+).+$' , "BTGetit" ), + ('-eX(?P[\dA-Fa-f]+)-.+$',"eXeem beta" ), + ('Plus12(?P[\dR]+)-.+$' , "Plus! II" ), + ('XBT(?P\d+)[d-]-.+$' , "XBT" ), + ('-ZT(?P\d+)-+.+$' , "ZipTorrent" ), + ('-BitE\?(?P\d+)-.+$' , "BitEruct" ), + ('O(?P%s)-+.+$'%v64p , "Osprey Permaseed" ), +# Guesses based on Rufus source code, never seen in the wild: + ('-BS(?P\d+)-+.+$' , "BTSlave" ), + ('-SB(?P\d+)-+.+$' , "SwiftBit" ), + ('-SN(?P\d+)-+.+$' , "ShareNET" ), + ('-bk(?P\d+)-+.+$' , "BitKitten" ), + ('-SZ(?P\d+)-+.+$' , "Shareaza" ), + ('-KT(?P\d+)(?PR\d+)-+.+$' , "KTorrent" ), + ('-MP(?P\d+)-+.+$' , "MooPolice" ), + ('-PO(?P\d+)-+.+$' , "PO (unknown)" ), + ('-UR(?P\d+)-+.+$' , "UR (unknown)" ), + ('Deadman Walking-.+$' , "Deadman" ), + ('270------.+$' , "GreedBT 2.7.0" ), + ('XTORR302.+$' , "TorrenTres 0.0.2" ), + ('turbobt(?P\d\.\d).+$' , "TurboBT" ), + ('DansClient.+$' , "XanTorrent" ), +# Patterns that should be executed last + ('.*Azureus.*' , "Azureus 2.0.3.2" ), + ) + +matches = [(re.compile(pattern, re.DOTALL), name) for pattern, name in matches] + +unknown_clients = {} + +def identify_client(peerid, log=None): + client = 'unknown' + version = '' + for pat, name in matches: + m = pat.match(peerid) + if m: + client = name + d = m.groupdict() + if d.has_key('version'): + version = d['version'] + version = version.replace('-','.') + if version.find('.') >= 0: + version = ''.join(version.split('.')) + + version = list(version) + for i,c in enumerate(version): + if '0' <= c <= '9': + version[i] = c + elif 'A' <= c <= 'Z': + version[i] = str(ord(c) - 55) + elif 'a' <= c <= 'z': + version[i] = str(ord(c) - 61) + elif c == '.': + version[i] = '62' + elif c == '-': + version[i] = '63' + else: + break + version = '.'.join(version) + elif d.has_key('bcver'): + bcver = d['bcver'] + version += str(ord(bcver[0])) + '.' + if len(bcver) > 1: + version += str(ord(bcver[1])/10) + version += str(ord(bcver[1])%10) + elif d.has_key('rsver'): + rsver = d['rsver'] + version += str(ord(rsver[0])) + '.' + if len(rsver) > 1: + version += str(ord(rsver[1])/10) + '.' + version += str(ord(rsver[1])%10) + if d.has_key('strver'): + if d['strver'] is not None: + version += d['strver'] + if d.has_key('rc'): + rc = 'RC ' + d['rc'][1:] + if version: + version += ' ' + version += rc + break + if client == 'unknown': + # identify Shareaza 2.0 - 2.1 + if len(peerid) == 20 and chr(0) not in peerid[:15]: + shareaza = True + for i in range(16,20): + if ord(peerid[i]) != (ord(peerid[i - 16]) ^ ord(peerid[31 - i])): + shareaza = False + break + if shareaza: + client = "Shareaza" + + + if log is not None and 'unknown' in client: + if not unknown_clients.has_key(peerid): + unknown_clients[peerid] = True + log.write('%s\n'%peerid) + log.write('------------------------------\n') + return client, version diff --git a/BitTorrent/Connecter.py b/BitTorrent/Connecter.py new file mode 100755 index 0000000..d6e587c --- /dev/null +++ b/BitTorrent/Connecter.py @@ -0,0 +1,337 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Originally written by Bram Cohen, heavily modified by Uoti Urpala + +# required for python 2.2 +from __future__ import generators + +from binascii import b2a_hex +from struct import pack, unpack + +from BitTorrent.bitfield import Bitfield +from BitTorrent.obsoletepythonsupport import * + +def toint(s): + return int(b2a_hex(s), 16) + +def tobinary(i): + return (chr(i >> 24) + chr((i >> 16) & 0xFF) + + chr((i >> 8) & 0xFF) + chr(i & 0xFF)) + +CHOKE = chr(0) +UNCHOKE = chr(1) +INTERESTED = chr(2) +NOT_INTERESTED = chr(3) +# index +HAVE = chr(4) +# index, bitfield +BITFIELD = chr(5) +# index, begin, length +REQUEST = chr(6) +# index, begin, piece +PIECE = chr(7) +# index, begin, piece +CANCEL = chr(8) + +# 2-byte port message +PORT = chr(9) + +# reserved flags +DHT = 1 +FLAGS = '\0' * 7 + '\1' +protocol_name = 'BitTorrent protocol' + + +class Connection(object): + + def __init__(self, encoder, connection, id, is_local): + self.encoder = encoder + self.connection = connection + self.connection.handler = self + self.id = id + self.ip = connection.ip + self.locally_initiated = is_local + self.complete = False + self.closed = False + self.got_anything = False + self.next_upload = None + self.upload = None + self.download = None + self._buffer = [] + self._buffer_len = 0 + self._reader = self._read_messages() + self._next_len = self._reader.next() + self._partial_message = None + self._outqueue = [] + self.choke_sent = True + self.uses_dht = False + self.dht_port = None + if self.locally_initiated: + connection.write(chr(len(protocol_name)) + protocol_name + + FLAGS + self.encoder.download_id) + if self.id is not None: + connection.write(self.encoder.my_id) + + def close(self): + if not self.closed: + self.connection.close() + self._sever() + + def send_interested(self): + self._send_message(INTERESTED) + + def send_not_interested(self): + self._send_message(NOT_INTERESTED) + + def send_choke(self): + if self._partial_message is None: + self._send_message(CHOKE) + self.choke_sent = True + self.upload.sent_choke() + + def send_unchoke(self): + if self._partial_message is None: + self._send_message(UNCHOKE) + self.choke_sent = False + + def send_port(self, port): + self._send_message(PORT+pack('!H', port)) + + def send_request(self, index, begin, length): + self._send_message(REQUEST + tobinary(index) + + tobinary(begin) + tobinary(length)) + + def send_cancel(self, index, begin, length): + self._send_message(CANCEL + tobinary(index) + + tobinary(begin) + tobinary(length)) + + def send_bitfield(self, bitfield): + self._send_message(BITFIELD + bitfield) + + def send_have(self, index): + self._send_message(HAVE + tobinary(index)) + + def send_keepalive(self): + self._send_message('') + + def send_partial(self, bytes): + if self.closed: + return 0 + if self._partial_message is None: + s = self.upload.get_upload_chunk() + if s is None: + return 0 + index, begin, piece = s + self._partial_message = ''.join((tobinary(len(piece) + 9), PIECE, + tobinary(index), tobinary(begin), piece)) + if bytes < len(self._partial_message): + self.upload.update_rate(bytes) + self.connection.write(buffer(self._partial_message, 0, bytes)) + self._partial_message = buffer(self._partial_message, bytes) + return bytes + + queue = [str(self._partial_message)] + self._partial_message = None + if self.choke_sent != self.upload.choked: + if self.upload.choked: + self._outqueue.append(tobinary(1) + CHOKE) + self.upload.sent_choke() + else: + self._outqueue.append(tobinary(1) + UNCHOKE) + self.choke_sent = self.upload.choked + queue.extend(self._outqueue) + self._outqueue = [] + queue = ''.join(queue) + self.upload.update_rate(len(queue)) + self.connection.write(queue) + return len(queue) + + # yields the number of bytes it wants next, gets those in self._message + def _read_messages(self): + yield 1 # header length + if ord(self._message) != len(protocol_name): + return + + yield len(protocol_name) + if self._message != protocol_name: + return + + yield 8 # reserved + # dht is on last reserved byte + if ord(self._message[7]) & DHT: + self.uses_dht = True + + yield 20 # download id + if self.encoder.download_id is None: # incoming connection + # modifies self.encoder if successful + self.encoder.select_torrent(self, self._message) + if self.encoder.download_id is None: + return + elif self._message != self.encoder.download_id: + return + if not self.locally_initiated: + self.connection.write(chr(len(protocol_name)) + protocol_name + + FLAGS + self.encoder.download_id + self.encoder.my_id) + + yield 20 # peer id + if not self.id: + self.id = self._message + if self.id == self.encoder.my_id: + return + for v in self.encoder.connections.itervalues(): + if v is not self: + if v.id == self.id: + return + if self.encoder.config['one_connection_per_ip'] and \ + v.ip == self.ip: + return + if self.locally_initiated: + self.connection.write(self.encoder.my_id) + else: + self.encoder.everinc = True + else: + if self._message != self.id: + return + self.complete = True + self.encoder.connection_completed(self) + + while True: + yield 4 # message length + l = toint(self._message) + if l > self.encoder.config['max_message_length']: + return + if l > 0: + yield l + self._got_message(self._message) + + def _got_message(self, message): + t = message[0] + if t == BITFIELD and self.got_anything: + self.close() + return + self.got_anything = True + if (t in [CHOKE, UNCHOKE, INTERESTED, NOT_INTERESTED] and + len(message) != 1): + self.close() + return + if t == CHOKE: + self.download.got_choke() + elif t == UNCHOKE: + self.download.got_unchoke() + elif t == INTERESTED: + self.upload.got_interested() + elif t == NOT_INTERESTED: + self.upload.got_not_interested() + elif t == HAVE: + if len(message) != 5: + self.close() + return + i = toint(message[1:]) + if i >= self.encoder.numpieces: + self.close() + return + self.download.got_have(i) + elif t == BITFIELD: + try: + b = Bitfield(self.encoder.numpieces, message[1:]) + except ValueError: + self.close() + return + self.download.got_have_bitfield(b) + elif t == REQUEST: + if len(message) != 13: + self.close() + return + i = toint(message[1:5]) + if i >= self.encoder.numpieces: + self.close() + return + self.upload.got_request(i, toint(message[5:9]), + toint(message[9:])) + elif t == CANCEL: + if len(message) != 13: + self.close() + return + i = toint(message[1:5]) + if i >= self.encoder.numpieces: + self.close() + return + self.upload.got_cancel(i, toint(message[5:9]), + toint(message[9:])) + elif t == PIECE: + if len(message) <= 9: + self.close() + return + i = toint(message[1:5]) + if i >= self.encoder.numpieces: + self.close() + return + if self.download.got_piece(i, toint(message[5:9]), message[9:]): + for co in self.encoder.complete_connections: + co.send_have(i) + elif t == PORT: + if len(message) != 3: + self.close() + return + self.dht_port = unpack('!H', message[1:3])[0] + self.encoder.got_port(self) + else: + self.close() + + def _sever(self): + self.closed = True + self._reader = None + del self.encoder.connections[self.connection] + self.encoder.replace_connection() + if self.complete: + del self.encoder.complete_connections[self] + self.download.disconnected() + self.encoder.choker.connection_lost(self) + self.upload = self.download = None + + def _send_message(self, message): + s = tobinary(len(message)) + message + if self._partial_message is not None: + self._outqueue.append(s) + else: + self.connection.write(s) + + def data_came_in(self, conn, s): + while True: + if self.closed: + return + i = self._next_len - self._buffer_len + if i > len(s): + self._buffer.append(s) + self._buffer_len += len(s) + return + m = s[:i] + if self._buffer_len > 0: + self._buffer.append(m) + m = ''.join(self._buffer) + self._buffer = [] + self._buffer_len = 0 + s = s[i:] + self._message = m + try: + self._next_len = self._reader.next() + except StopIteration: + self.close() + return + + def connection_lost(self, conn): + assert conn is self.connection + self._sever() + + def connection_flushed(self, connection): + if self.complete and self.next_upload is None and (self._partial_message is not None + or (self.upload and self.upload.buffer)): + self.encoder.ratelimiter.queue(self, self.encoder.context.rlgroup) diff --git a/BitTorrent/ConvertedMetainfo.py b/BitTorrent/ConvertedMetainfo.py new file mode 100755 index 0000000..20ccb0f --- /dev/null +++ b/BitTorrent/ConvertedMetainfo.py @@ -0,0 +1,288 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Uoti Urpala + +# required for Python 2.2 +from __future__ import generators + +import os +import sys +from sha import sha + +from BitTorrent.obsoletepythonsupport import * + +from BitTorrent.bencode import bencode +from BitTorrent import btformats +from BitTorrent import BTFailure, WARNING, ERROR + + +WINDOWS_UNSUPPORTED_CHARS ='"*/:<>?\|' +windows_translate = [chr(i) for i in range(256)] +for x in WINDOWS_UNSUPPORTED_CHARS: + windows_translate[ord(x)] = '-' +windows_translate = ''.join(windows_translate) + +noncharacter_translate = {} +for i in range(0xD800, 0xE000): + noncharacter_translate[i] = ord('-') +for i in range(0xFDD0, 0xFDF0): + noncharacter_translate[i] = ord('-') +for i in (0xFFFE, 0xFFFF): + noncharacter_translate[i] = ord('-') + +del x, i + +def set_filesystem_encoding(encoding, errorfunc): + global filesystem_encoding + filesystem_encoding = 'ascii' + if encoding == '': + try: + sys.getfilesystemencoding + except AttributeError: + errorfunc(WARNING, + _("This seems to be an old Python version which " + "does not support detecting the filesystem " + "encoding. Assuming 'ascii'.")) + return + encoding = sys.getfilesystemencoding() + if encoding is None: + errorfunc(WARNING, + _("Python failed to autodetect filesystem encoding. " + "Using 'ascii' instead.")) + return + try: + 'a1'.decode(encoding) + except: + errorfunc(ERROR, + _("Filesystem encoding '%s' is not supported. " + "Using 'ascii' instead.") % encoding) + return + filesystem_encoding = encoding + + +def generate_names(name, is_dir): + if is_dir: + prefix = name + '.' + suffix = '' + else: + pos = name.rfind('.') + if pos == -1: + pos = len(name) + prefix = name[:pos] + '.' + suffix = name[pos:] + i = 0 + while True: + yield prefix + str(i) + suffix + i += 1 + + +class ConvertedMetainfo(object): + + def __init__(self, metainfo): + self.bad_torrent_wrongfield = False + self.bad_torrent_unsolvable = False + self.bad_torrent_noncharacter = False + self.bad_conversion = False + self.bad_windows = False + self.bad_path = False + self.reported_errors = False + self.is_batch = False + self.orig_files = None + self.files_fs = None + self.total_bytes = 0 + self.sizes = [] + self.comment = None + + btformats.check_message(metainfo, check_paths=False) + info = metainfo['info'] + if info.has_key('length'): + self.total_bytes = info['length'] + self.sizes.append(self.total_bytes) + else: + self.is_batch = True + r = [] + self.orig_files = [] + self.sizes = [] + i = 0 + for f in info['files']: + l = f['length'] + self.total_bytes += l + self.sizes.append(l) + path = self._get_attr_utf8(f, 'path') + for x in path: + if not btformats.allowed_path_re.match(x): + if l > 0: + raise BTFailure(_("Bad file path component: ")+x) + # BitComet makes bad .torrent files with empty + # filename part + self.bad_path = True + break + else: + p = [] + for x in path: + p.append((self._enforce_utf8(x), x)) + path = p + self.orig_files.append('/'.join([x[0] for x in path])) + k = [] + for u,o in path: + tf2 = self._to_fs_2(u) + k.append((tf2, u, o)) + r.append((k,i)) + i += 1 + # If two or more file/subdirectory names in the same directory + # would map to the same name after encoding conversions + Windows + # workarounds, change them. Files are changed as + # 'a.b.c'->'a.b.0.c', 'a.b.1.c' etc, directories or files without + # '.' as 'a'->'a.0', 'a.1' etc. If one of the multiple original + # names was a "clean" conversion, that one is always unchanged + # and the rest are adjusted. + r.sort() + self.files_fs = [None] * len(r) + prev = [None] + res = [] + stack = [{}] + for x in r: + j = 0 + x, i = x + while x[j] == prev[j]: + j += 1 + del res[j:] + del stack[j+1:] + name = x[j][0][1] + if name in stack[-1]: + for name in generate_names(x[j][1], j != len(x) - 1): + name = self._to_fs(name) + if name not in stack[-1]: + break + stack[-1][name] = None + res.append(name) + for j in range(j + 1, len(x)): + name = x[j][0][1] + stack.append({name: None}) + res.append(name) + self.files_fs[i] = os.path.join(*res) + prev = x + + self.name = self._get_field_utf8(info, 'name') + self.name_fs = self._to_fs(self.name) + self.piece_length = info['piece length'] + self.is_trackerless = False + if metainfo.has_key('announce'): + self.announce = metainfo['announce'] + elif metainfo.has_key('nodes'): + self.is_trackerless = True + self.nodes = metainfo['nodes'] + + if metainfo.has_key('comment'): + self.comment = metainfo['comment'] + + self.hashes = [info['pieces'][x:x+20] for x in xrange(0, + len(info['pieces']), 20)] + self.infohash = sha(bencode(info)).digest() + + def show_encoding_errors(self, errorfunc): + self.reported_errors = True + if self.bad_torrent_unsolvable: + errorfunc(ERROR, + _("This .torrent file has been created with a broken " + "tool and has incorrectly encoded filenames. Some or " + "all of the filenames may appear different from what " + "the creator of the .torrent file intended.")) + elif self.bad_torrent_noncharacter: + errorfunc(ERROR, + _("This .torrent file has been created with a broken " + "tool and has bad character values that do not " + "correspond to any real character. Some or all of the " + "filenames may appear different from what the creator " + "of the .torrent file intended.")) + elif self.bad_torrent_wrongfield: + errorfunc(ERROR, + _("This .torrent file has been created with a broken " + "tool and has incorrectly encoded filenames. The " + "names used may still be correct.")) + elif self.bad_conversion: + errorfunc(WARNING, + _('The character set used on the local filesystem ("%s") ' + 'cannot represent all characters used in the ' + 'filename(s) of this torrent. Filenames have been ' + 'changed from the original.') % filesystem_encoding) + elif self.bad_windows: + errorfunc(WARNING, + _("The Windows filesystem cannot handle some " + "characters used in the filename(s) of this torrent." + "Filenames have been changed from the original.")) + elif self.bad_path: + errorfunc(WARNING, + _("This .torrent file has been created with a broken " + "tool and has at least 1 file with an invalid file " + "or directory name. However since all such files " + "were marked as having length 0 those files are " + "just ignored.")) + + # At least BitComet seems to make bad .torrent files that have + # fields in an arbitrary encoding but separate 'field.utf-8' attributes + def _get_attr_utf8(self, d, attrib): + v = d.get(attrib + '.utf-8') + if v is not None: + if v != d[attrib]: + self.bad_torrent_wrongfield = True + else: + v = d[attrib] + return v + + def _enforce_utf8(self, s): + try: + s = s.decode('utf-8') + except: + self.bad_torrent_unsolvable = True + s = s.decode('utf-8', 'replace') + t = s.translate(noncharacter_translate) + if t != s: + self.bad_torrent_noncharacter = True + return t.encode('utf-8') + + def _get_field_utf8(self, d, attrib): + r = self._get_attr_utf8(d, attrib) + return self._enforce_utf8(r) + + def _fix_windows(self, name, t=windows_translate): + bad = False + r = name.translate(t) + # for some reason name cannot end with '.' or space + if r[-1] in '. ': + r = r + '-' + if r != name: + self.bad_windows = True + bad = True + return (r, bad) + + def _to_fs(self, name): + return self._to_fs_2(name)[1] + + def _to_fs_2(self, name): + bad = False + if sys.platform.startswith('win'): + name, bad = self._fix_windows(name) + name = name.decode('utf-8') + try: + r = name.encode(filesystem_encoding) + except: + self.bad_conversion = True + bad = True + r = name.encode(filesystem_encoding, 'replace') + + if sys.platform.startswith('win'): + # encoding to mbcs with or without 'replace' will make the + # name unsupported by windows again because it adds random + # '?' characters which are invalid windows filesystem + # character + r, bad = self._fix_windows(r) + return (bad, r) diff --git a/BitTorrent/CurrentRateMeasure.py b/BitTorrent/CurrentRateMeasure.py new file mode 100755 index 0000000..3dd940f --- /dev/null +++ b/BitTorrent/CurrentRateMeasure.py @@ -0,0 +1,48 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from BitTorrent.platform import bttime + + +class Measure(object): + + def __init__(self, max_rate_period, fudge=5): + self.max_rate_period = max_rate_period + self.ratesince = bttime() - fudge + self.last = self.ratesince + self.rate = 0.0 + self.total = 0 + + def update_rate(self, amount): + self.total += amount + t = bttime() + self.rate = (self.rate * (self.last - self.ratesince) + + amount) / (t - self.ratesince) + self.last = t + if self.ratesince < t - self.max_rate_period: + self.ratesince = t - self.max_rate_period + + def get_rate(self): + self.update_rate(0) + return self.rate + + def get_rate_noupdate(self): + return self.rate + + def time_until_rate(self, newrate): + if self.rate <= newrate: + return 0 + t = bttime() - self.ratesince + return ((self.rate * t) / newrate) - t + + def get_total(self): + return self.total diff --git a/BitTorrent/Desktop.py b/BitTorrent/Desktop.py new file mode 100755 index 0000000..b724811 --- /dev/null +++ b/BitTorrent/Desktop.py @@ -0,0 +1,33 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# written by Matt Chisholm + +import os +import sys + +from BitTorrent.platform import get_home_dir, get_shell_dir +if os.name == 'nt': + from win32com.shell import shellcon + +desktop = None + +if os.name == 'nt': + desktop = get_shell_dir(shellcon.CSIDL_DESKTOPDIRECTORY) +else: + homedir = get_home_dir() + if homedir == None : + desktop = '/tmp/' + else: + desktop = homedir + if os.name in ('mac', 'posix'): + tmp_desktop = os.path.join(homedir, 'Desktop') + if os.access(tmp_desktop, os.R_OK|os.W_OK): + desktop = tmp_desktop + os.sep diff --git a/BitTorrent/Downloader.py b/BitTorrent/Downloader.py new file mode 100755 index 0000000..accb332 --- /dev/null +++ b/BitTorrent/Downloader.py @@ -0,0 +1,363 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen, Uoti Urpala + +from random import shuffle + +from BitTorrent.platform import bttime +from BitTorrent.CurrentRateMeasure import Measure +from BitTorrent.bitfield import Bitfield + + +class PerIPStats(object): + + def __init__(self): + self.numgood = 0 + self.bad = {} + self.numconnections = 0 + self.lastdownload = None + self.peerid = None + + +class BadDataGuard(object): + + def __init__(self, download): + self.download = download + self.ip = download.connection.ip + self.downloader = download.downloader + self.stats = self.downloader.perip[self.ip] + self.lastindex = None + + def bad(self, index, bump = False): + self.stats.bad.setdefault(index, 0) + self.stats.bad[index] += 1 + if self.ip not in self.downloader.bad_peers: + self.downloader.bad_peers[self.ip] = (False, self.stats) + if self.download is not None: + self.downloader.kick(self.download) + self.download = None + elif len(self.stats.bad) > 1 and self.stats.numconnections == 1 and \ + self.stats.lastdownload is not None: + # kick new connection from same IP if previous one sent bad data, + # mainly to give the algorithm time to find other bad pieces + # in case the peer is sending a lot of bad data + self.downloader.kick(self.stats.lastdownload) + if len(self.stats.bad) >= 3 and len(self.stats.bad) > \ + self.stats.numgood // 30: + self.downloader.ban(self.ip) + elif bump: + self.downloader.picker.bump(index) + + def good(self, index): + # lastindex is a hack to only increase numgood for by one for each good + # piece, however many chunks came from the connection(s) from this IP + if index != self.lastindex: + self.stats.numgood += 1 + self.lastindex = index + + +class SingleDownload(object): + + def __init__(self, downloader, connection): + self.downloader = downloader + self.connection = connection + self.choked = True + self.interested = False + self.active_requests = [] + self.measure = Measure(downloader.config['max_rate_period']) + self.peermeasure = Measure(max(downloader.storage.piece_size / 10000, + 20)) + self.have = Bitfield(downloader.numpieces) + self.last = 0 + self.example_interest = None + self.backlog = 2 + self.guard = BadDataGuard(self) + + def _backlog(self): + backlog = 2 + int(4 * self.measure.get_rate() / + self.downloader.chunksize) + if backlog > 50: + backlog = max(50, int(.075 * backlog)) + self.backlog = backlog + return backlog + + def disconnected(self): + self.downloader.lost_peer(self) + for i in xrange(len(self.have)): + if self.have[i]: + self.downloader.picker.lost_have(i) + self._letgo() + self.guard.download = None + + def _letgo(self): + if not self.active_requests: + return + if self.downloader.storage.endgame: + self.active_requests = [] + return + lost = [] + for index, begin, length in self.active_requests: + self.downloader.storage.request_lost(index, begin, length) + if index not in lost: + lost.append(index) + self.active_requests = [] + ds = [d for d in self.downloader.downloads if not d.choked] + shuffle(ds) + for d in ds: + d._request_more(lost) + for d in self.downloader.downloads: + if d.choked and not d.interested: + for l in lost: + if d.have[l] and self.downloader.storage.do_I_have_requests(l): + d.interested = True + d.connection.send_interested() + break + + def got_choke(self): + if not self.choked: + self.choked = True + self._letgo() + + def got_unchoke(self): + if self.choked: + self.choked = False + if self.interested: + self._request_more() + + def got_piece(self, index, begin, piece): + try: + self.active_requests.remove((index, begin, len(piece))) + except ValueError: + self.downloader.discarded_bytes += len(piece) + return False + if self.downloader.storage.endgame: + self.downloader.all_requests.remove((index, begin, len(piece))) + self.last = bttime() + self.measure.update_rate(len(piece)) + self.downloader.measurefunc(len(piece)) + self.downloader.downmeasure.update_rate(len(piece)) + if not self.downloader.storage.piece_came_in(index, begin, piece, + self.guard): + if self.downloader.storage.endgame: + while self.downloader.storage.do_I_have_requests(index): + nb, nl = self.downloader.storage.new_request(index) + self.downloader.all_requests.append((index, nb, nl)) + for d in self.downloader.downloads: + d.fix_download_endgame() + return False + ds = [d for d in self.downloader.downloads if not d.choked] + shuffle(ds) + for d in ds: + d._request_more([index]) + return False + if self.downloader.storage.do_I_have(index): + self.downloader.picker.complete(index) + if self.downloader.storage.endgame: + for d in self.downloader.downloads: + if d is not self and d.interested: + if d.choked: + d.fix_download_endgame() + else: + try: + d.active_requests.remove((index, begin, len(piece))) + except ValueError: + continue + d.connection.send_cancel(index, begin, len(piece)) + d.fix_download_endgame() + self._request_more() + if self.downloader.picker.am_I_complete(): + for d in [i for i in self.downloader.downloads if i.have.numfalse == 0]: + d.connection.close() + return self.downloader.storage.do_I_have(index) + + def _want(self, index): + return self.have[index] and self.downloader.storage.do_I_have_requests(index) + + def _request_more(self, indices = None): + assert not self.choked + if len(self.active_requests) >= self._backlog(): + return + if self.downloader.storage.endgame: + self.fix_download_endgame() + return + lost_interests = [] + while len(self.active_requests) < self.backlog: + if indices is None: + interest = self.downloader.picker.next(self._want, self.have.numfalse == 0) + else: + interest = None + for i in indices: + if self.have[i] and self.downloader.storage.do_I_have_requests(i): + interest = i + break + if interest is None: + break + if not self.interested: + self.interested = True + self.connection.send_interested() + self.example_interest = interest + self.downloader.picker.requested(interest, self.have.numfalse == 0) + while len(self.active_requests) < (self.backlog-2) * 5 + 2: + begin, length = self.downloader.storage.new_request(interest) + self.active_requests.append((interest, begin, length)) + self.connection.send_request(interest, begin, length) + if not self.downloader.storage.do_I_have_requests(interest): + lost_interests.append(interest) + break + if not self.active_requests and self.interested: + self.interested = False + self.connection.send_not_interested() + if lost_interests: + for d in self.downloader.downloads: + if d.active_requests or not d.interested: + continue + if d.example_interest is not None and self.downloader.storage.do_I_have_requests(d.example_interest): + continue + for lost in lost_interests: + if d.have[lost]: + break + else: + continue + interest = self.downloader.picker.next(d._want, d.have.numfalse == 0) + if interest is None: + d.interested = False + d.connection.send_not_interested() + else: + d.example_interest = interest + if self.downloader.storage.endgame: + self.downloader.all_requests = [] + for d in self.downloader.downloads: + self.downloader.all_requests.extend(d.active_requests) + for d in self.downloader.downloads: + d.fix_download_endgame() + + def fix_download_endgame(self): + want = [a for a in self.downloader.all_requests if self.have[a[0]] and a not in self.active_requests] + if self.interested and not self.active_requests and not want: + self.interested = False + self.connection.send_not_interested() + return + if not self.interested and want: + self.interested = True + self.connection.send_interested() + if self.choked or len(self.active_requests) >= self._backlog(): + return + shuffle(want) + del want[self.backlog - len(self.active_requests):] + self.active_requests.extend(want) + for piece, begin, length in want: + self.connection.send_request(piece, begin, length) + + def got_have(self, index): + if self.have[index]: + return + if index == self.downloader.numpieces-1: + self.peermeasure.update_rate(self.downloader.storage.total_length- + (self.downloader.numpieces-1)*self.downloader.storage.piece_size) + else: + self.peermeasure.update_rate(self.downloader.storage.piece_size) + self.have[index] = True + self.downloader.picker.got_have(index) + if self.downloader.picker.am_I_complete() and self.have.numfalse == 0: + self.connection.close() + return + if self.downloader.storage.endgame: + self.fix_download_endgame() + elif self.downloader.storage.do_I_have_requests(index): + if not self.choked: + self._request_more([index]) + else: + if not self.interested: + self.interested = True + self.connection.send_interested() + + def got_have_bitfield(self, have): + if self.downloader.picker.am_I_complete() and have.numfalse == 0: + self.connection.close() + return + self.have = have + for i in xrange(len(self.have)): + if self.have[i]: + self.downloader.picker.got_have(i) + if self.downloader.storage.endgame: + for piece, begin, length in self.downloader.all_requests: + if self.have[piece]: + self.interested = True + self.connection.send_interested() + return + for i in xrange(len(self.have)): + if self.have[i] and self.downloader.storage.do_I_have_requests(i): + self.interested = True + self.connection.send_interested() + return + + def get_rate(self): + return self.measure.get_rate() + + def is_snubbed(self): + return bttime() - self.last > self.downloader.snub_time + + +class Downloader(object): + + def __init__(self, config, storage, picker, numpieces, downmeasure, + measurefunc, kickfunc, banfunc): + self.config = config + self.storage = storage + self.picker = picker + self.chunksize = config['download_slice_size'] + self.downmeasure = downmeasure + self.numpieces = numpieces + self.snub_time = config['snub_time'] + self.measurefunc = measurefunc + self.kickfunc = kickfunc + self.banfunc = banfunc + self.downloads = [] + self.perip = {} + self.bad_peers = {} + self.discarded_bytes = 0 + + def make_download(self, connection): + ip = connection.ip + perip = self.perip.get(ip) + if perip is None: + perip = PerIPStats() + self.perip[ip] = perip + perip.numconnections += 1 + d = SingleDownload(self, connection) + perip.lastdownload = d + perip.peerid = connection.id + self.downloads.append(d) + return d + + def lost_peer(self, download): + self.downloads.remove(download) + ip = download.connection.ip + self.perip[ip].numconnections -= 1 + if self.perip[ip].lastdownload == download: + self.perip[ip].lastdownload = None + + def kick(self, download): + if not self.config['retaliate_to_garbled_data']: + return + ip = download.connection.ip + peerid = download.connection.id + # kickfunc will schedule connection.close() to be executed later; we + # might now be inside RawServer event loop with events from that + # connection already queued, and trying to handle them after doing + # close() now could cause problems. + self.kickfunc(download.connection) + + def ban(self, ip): + if not self.config['retaliate_to_garbled_data']: + return + self.banfunc(ip) + self.bad_peers[ip] = (True, self.perip[ip]) diff --git a/BitTorrent/DownloaderFeedback.py b/BitTorrent/DownloaderFeedback.py new file mode 100755 index 0000000..6c16c90 --- /dev/null +++ b/BitTorrent/DownloaderFeedback.py @@ -0,0 +1,139 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen, Uoti Urpala + +from __future__ import division + + +class DownloaderFeedback(object): + + def __init__(self, choker, upfunc, upfunc2, downfunc, uptotal, downtotal, + remainingfunc, leftfunc, file_length, finflag, downloader, + files, ever_got_incoming, rerequester): + self.downloader = downloader + self.picker = downloader.picker + self.storage = downloader.storage + self.choker = choker + self.upfunc = upfunc + self.upfunc2 = upfunc2 + self.downfunc = downfunc + self.uptotal = uptotal + self.downtotal = downtotal + self.remainingfunc = remainingfunc + self.leftfunc = leftfunc + self.file_length = file_length + self.finflag = finflag + self.files = files + self.ever_got_incoming = ever_got_incoming + self.rerequester = rerequester + self.lastids = [] + + def _rotate(self): + cs = self.choker.connections + for peerid in self.lastids: + for i in xrange(len(cs)): + if cs[i].id == peerid: + return cs[i:] + cs[:i] + return cs + + def collect_spew(self): + l = [ ] + cs = self._rotate() + self.lastids = [c.id for c in cs] + for c in cs: + rec = {} + rec['id'] = c.id + rec["ip"] = c.ip + rec["is_optimistic_unchoke"] = (c is self.choker.connections[0]) + if c.locally_initiated: + rec["initiation"] = "L" + else: + rec["initiation"] = "R" + u = c.upload + rec["upload"] = (u.measure.get_total(), int(u.measure.get_rate()), + u.interested, u.choked) + + d = c.download + rec["download"] = (d.measure.get_total(),int(d.measure.get_rate()), + d.interested, d.choked, d.is_snubbed()) + rec['completed'] = 1 - d.have.numfalse / len(d.have) + rec['speed'] = d.connection.download.peermeasure.get_rate() + l.append(rec) + return l + + def get_statistics(self, spewflag=False, fileflag=False): + status = {} + numSeeds = 0 + numPeers = 0 + for d in self.downloader.downloads: + if d.have.numfalse == 0: + numSeeds += 1 + else: + numPeers += 1 + status['numSeeds'] = numSeeds + status['numPeers'] = numPeers + status['trackerSeeds'] = self.rerequester.tracker_num_seeds + status['trackerPeers'] = self.rerequester.tracker_num_peers + status['upRate'] = self.upfunc() + status['upRate2'] = self.upfunc2() + status['upTotal'] = self.uptotal() + status['ever_got_incoming'] = self.ever_got_incoming() + missingPieces = 0 + numCopyList = [] + numCopies = 0 + for i in self.picker.crosscount: + missingPieces += i + if missingPieces == 0: + numCopies += 1 + else: + fraction = 1 - missingPieces / self.picker.numpieces + numCopyList.append(fraction) + if fraction == 0 or len(numCopyList) >= 3: + break + numCopies -= numSeeds + if self.picker.numgot == self.picker.numpieces: + numCopies -= 1 + status['numCopies'] = numCopies + status['numCopyList'] = numCopyList + status['discarded'] = self.downloader.discarded_bytes + status['storage_numcomplete'] = self.storage.stat_numfound + \ + self.storage.stat_numdownloaded + status['storage_dirty'] = len(self.storage.stat_dirty) + status['storage_active'] = len(self.storage.stat_active) + status['storage_new'] = len(self.storage.stat_new) + status['storage_numflunked'] = self.storage.stat_numflunked + + if spewflag: + status['spew'] = self.collect_spew() + status['bad_peers'] = self.downloader.bad_peers + if fileflag: + undl = self.storage.storage.undownloaded + unal = self.storage.storage.unallocated + status['files_left'] = [undl[fname] for fname in self.files] + status['files_allocated'] = [not unal[fn] for fn in self.files] + if self.finflag.isSet(): + status['downRate'] = 0 + status['downTotal'] = self.downtotal() + status['fractionDone'] = 1 + return status + timeEst = self.remainingfunc() + status['timeEst'] = timeEst + + if self.file_length > 0: + fractionDone = 1 - self.leftfunc() / self.file_length + else: + fractionDone = 1 + status.update({ + "fractionDone" : fractionDone, + "downRate" : self.downfunc(), + "downTotal" : self.downtotal() + }) + return status diff --git a/BitTorrent/Encoder.py b/BitTorrent/Encoder.py new file mode 100755 index 0000000..d2ef66d --- /dev/null +++ b/BitTorrent/Encoder.py @@ -0,0 +1,185 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from socket import error as socketerror + +from BitTorrent import BTFailure +from BitTorrent.RawServer_magic import Handler +from BitTorrent.Connecter import Connection +from BitTorrent.platform import is_frozen_exe +from BitTorrent.ClientIdentifier import identify_client + +# header, reserved, download id, my id, [length, message] + +class InitialConnectionHandler(Handler): + def __init__(self, parent, id): + self.parent = parent + self.id = id + def connection_started(self, s): + con = Connection(self.parent, s, self.id, True) + self.parent.connections[s] = con + +class Encoder(object): + + def __init__(self, make_upload, downloader, choker, numpieces, ratelimiter, + raw_server, config, my_id, schedulefunc, download_id, context, addcontactfunc, reported_port): + self.make_upload = make_upload + self.downloader = downloader + self.choker = choker + self.numpieces = numpieces + self.ratelimiter = ratelimiter + self.raw_server = raw_server + self.my_id = my_id + self.config = config + self.schedulefunc = schedulefunc + self.download_id = download_id + self.context = context + self.addcontact = addcontactfunc + self.reported_port = reported_port + self.everinc = False + self.connections = {} + self.complete_connections = {} + self.spares = [] + self.banned = {} + schedulefunc(self.send_keepalives, config['keepalive_interval']) + + def send_keepalives(self): + self.schedulefunc(self.send_keepalives, + self.config['keepalive_interval']) + for c in self.complete_connections: + c.send_keepalive() + + def start_connection(self, dns, id): + if dns[0] in self.banned: + return + if id == self.my_id: + return + for v in self.connections.values(): + if id and v.id == id: + return + if self.config['one_connection_per_ip'] and v.ip == dns[0]: + return + if len(self.connections) >= self.config['max_initiate']: + if len(self.spares) < self.config['max_initiate'] and \ + dns not in self.spares: + self.spares.append(dns) + return + self.raw_server.async_start_connection(dns, InitialConnectionHandler(self, id), self.context) + + + def connection_completed(self, c): + self.complete_connections[c] = 1 + c.upload = self.make_upload(c) + c.download = self.downloader.make_download(c) + self.choker.connection_made(c) + if c.uses_dht: + c.send_port(self.reported_port) + + def got_port(self, c): + if self.addcontact and c.uses_dht and c.dht_port != None: + self.addcontact(c.connection.ip, c.dht_port) + + def ever_got_incoming(self): + return self.everinc + + def how_many_connections(self): + return len(self.complete_connections) + + def replace_connection(self): + while len(self.connections) < self.config['max_initiate'] and \ + self.spares: + self.start_connection(self.spares.pop(), None) + + def close_connections(self): + for c in self.connections.itervalues(): + if not c.closed: + c.connection.close() + c.closed = True + + def singleport_connection(self, listener, con): + if con.ip in self.banned: + return + m = self.config['max_allow_in'] + if m and len(self.connections) >= m: + return + self.connections[con.connection] = con + del listener.connections[con.connection] + con.encoder = self + con.connection.context = self.context + + def ban(self, ip): + self.banned[ip] = None + + +class SingleportListener(Handler): + + def __init__(self, rawserver): + self.rawserver = rawserver + self.port = 0 + self.ports = {} + self.torrents = {} + self.connections = {} + self.download_id = None + + def _check_close(self, port): + if not port or self.port == port or self.ports[port][1] > 0: + return + serversocket = self.ports[port][0] + self.rawserver.stop_listening(serversocket) + serversocket.close() + del self.ports[port] + + def open_port(self, port, config): + if port in self.ports: + self.port = port + return + serversocket = self.rawserver.create_serversocket( + port, config['bind'], reuse=True, tos=config['peer_socket_tos']) + self.rawserver.start_listening(serversocket, self) + oldport = self.port + self.port = port + self.ports[port] = [serversocket, 0] + self._check_close(oldport) + + def get_port(self): + if self.port: + self.ports[self.port][1] += 1 + return self.port + + def release_port(self, port): + self.ports[port][1] -= 1 + self._check_close(port) + + def close_sockets(self): + for serversocket, _ in self.ports.itervalues(): + self.rawserver.stop_listening(serversocket) + serversocket.close() + + def add_torrent(self, infohash, encoder): + if infohash in self.torrents: + raise BTFailure(_("Can't start two separate instances of the same " + "torrent")) + self.torrents[infohash] = encoder + + def remove_torrent(self, infohash): + del self.torrents[infohash] + + def select_torrent(self, conn, infohash): + if infohash in self.torrents: + self.torrents[infohash].singleport_connection(self, conn) + + def connection_made(self, connection): + con = Connection(self, connection, None, False) + self.connections[connection] = con + + def replace_connection(self): + pass diff --git a/BitTorrent/GUI.py b/BitTorrent/GUI.py new file mode 100755 index 0000000..cb793da --- /dev/null +++ b/BitTorrent/GUI.py @@ -0,0 +1,773 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# written by Matt Chisholm + +from __future__ import division + +import gtk +import pango +import gobject +import os +import threading + +assert gtk.gtk_version >= (2, 2), "GTK 2.2 or newer required" +assert gtk.pygtk_version >= (2, 2), "PyGTK 2.2 or newer required" + +from BitTorrent import app_name, FAQ_URL, languages, language_names +from BitTorrent.platform import image_root, read_language_file, write_language_file + +def lock_wrap(function, *args): + gtk.threads_enter() + function(*args) + gtk.threads_leave() + +def gtk_wrap(function, *args): + gobject.idle_add(lock_wrap, function, *args) + +SPACING = 8 +WINDOW_TITLE_LENGTH = 128 # do we need this? +WINDOW_WIDTH = 600 + +# get screen size from GTK +d = gtk.gdk.display_get_default() +s = d.get_default_screen() +MAX_WINDOW_HEIGHT = s.get_height() +MAX_WINDOW_WIDTH = s.get_width() +if os.name == 'nt': + MAX_WINDOW_HEIGHT -= 32 # leave room for start bar (exact) + MAX_WINDOW_HEIGHT -= 32 # and window decorations (depends on windows theme) +else: + MAX_WINDOW_HEIGHT -= 32 # leave room for window decorations (could be any size) + + +MIN_MULTI_PANE_HEIGHT = 107 + +BT_TARGET_TYPE = 0 +EXTERNAL_FILE_TYPE = 1 +EXTERNAL_STRING_TYPE = 2 + +BT_TARGET = ("application/x-bittorrent" , gtk.TARGET_SAME_APP, BT_TARGET_TYPE ) +EXTERNAL_FILE = ("text/uri-list" , 0 , EXTERNAL_FILE_TYPE ) + +#gtk(gdk actually) is totally unable to receive text drags +#of any sort in windows because they're too lazy to use OLE. +#this list is all the atoms I could possibly find so that +#url dnd works on linux from any browser. +EXTERNAL_TEXTPLAIN = ("text/plain" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_TEXT = ("TEXT" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_COMPOUND_TEXT = ("COMPOUND_TEXT" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_MOZILLA = ("text/x-moz-url" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_NETSCAPE = ("_NETSCAPE_URL" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_HTML = ("text/html" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_UNICODE = ("text/unicode" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_UTF8 = ("text/plain;charset=utf-8" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_UTF8_STRING = ("UTF8_STRING" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_STRING = ("STRING" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_OLE2_DND = ("OLE2_DND" , 0 , EXTERNAL_STRING_TYPE) +EXTERNAL_RTF = ("Rich Text Format" , 0 , EXTERNAL_STRING_TYPE) +#there should alse be text/plain;charset={current charset} + +TARGET_EXTERNAL = [EXTERNAL_FILE, + EXTERNAL_TEXTPLAIN, + EXTERNAL_TEXT, + EXTERNAL_COMPOUND_TEXT, + EXTERNAL_MOZILLA, + EXTERNAL_NETSCAPE, + EXTERNAL_HTML, + EXTERNAL_UNICODE, + EXTERNAL_UTF8, + EXTERNAL_UTF8_STRING, + EXTERNAL_STRING, + EXTERNAL_OLE2_DND, + EXTERNAL_RTF] + +TARGET_ALL = [BT_TARGET, + EXTERNAL_FILE, + EXTERNAL_TEXTPLAIN, + EXTERNAL_TEXT, + EXTERNAL_COMPOUND_TEXT, + EXTERNAL_MOZILLA, + EXTERNAL_NETSCAPE, + EXTERNAL_HTML, + EXTERNAL_UNICODE, + EXTERNAL_UTF8, + EXTERNAL_UTF8_STRING, + EXTERNAL_STRING, + EXTERNAL_OLE2_DND, + EXTERNAL_RTF] + +# a slightly hackish but very reliable way to get OS scrollbar width +sw = gtk.ScrolledWindow() +SCROLLBAR_WIDTH = sw.size_request()[0] - 48 +del sw + +def align(obj,x,y): + if type(obj) is gtk.Label: + obj.set_alignment(x,y) + return obj + else: + a = gtk.Alignment(x,y,0,0) + a.add(obj) + return a + +def halign(obj, amt): + return align(obj,amt,0.5) + +def lalign(obj): + return halign(obj,0) + +def ralign(obj): + return halign(obj,1) + +def valign(obj, amt): + return align(obj,0.5,amt) + +def malign(obj): + return valign(obj, 0.5) + +factory = gtk.IconFactory() + +# these don't seem to be documented anywhere: +# ICON_SIZE_BUTTON = 20x20 +# ICON_SIZE_LARGE_TOOLBAR = 24x24 + +for n in 'broken finished info pause paused play queued running remove status-running status-natted status-stopped'.split(): + fn = os.path.join(image_root, ("%s.png"%n)) + + pixbuf = gtk.gdk.pixbuf_new_from_file(fn) + + set = gtk.IconSet(pixbuf) + + factory.add('bt-%s'%n, set) + +factory.add_default() + +def load_large_toolbar_image(image, stockname): + # This is a hack to work around a bug in GTK 2.4 that causes + # gtk.ICON_SIZE_LARGE_TOOLBAR icons to be drawn at 18x18 instead + # of 24x24 under GTK 2.4 & win32 + if os.name == 'nt' and gtk.gtk_version < (2, 6): + image.set_from_file(os.path.join(image_root, stockname[3:]+'.png')) + else: + image.set_from_stock(stockname, gtk.ICON_SIZE_LARGE_TOOLBAR) + + +def get_logo(size=32): + fn = os.path.join(image_root, 'logo', 'bittorrent_%d.png'%size) + logo = gtk.Image() + logo.set_from_file(fn) + return logo + +class Size(long): + """displays size in human-readable format""" + size_labels = ['','K','M','G','T','P','E','Z','Y'] + radix = 2**10 + + def __new__(cls, value, precision=None): + self = long.__new__(cls, value) + return self + + def __init__(self, value, precision=0): + long.__init__(self, value) + self.precision = precision + + def __str__(self, precision=None): + if precision is None: + precision = self.precision + value = self + for unitname in self.size_labels: + if value < self.radix and precision < self.radix: + break + value /= self.radix + precision /= self.radix + if unitname and value < 10 and precision < 1: + return '%.1f %sB' % (value, unitname) + else: + return '%.0f %sB' % (value, unitname) + + +class Rate(Size): + """displays rate in human-readable format""" + def __init__(self, value, precision=2**10): + Size.__init__(self, value, precision) + + def __str__(self, precision=None): + return '%s/s'% Size.__str__(self, precision=None) + + +class Duration(float): + """displays duration in human-readable format""" + def __str__(self): + if self > 365 * 24 * 60 * 60: + return '?' + elif self >= 172800: + return _("%d days") % (self//86400) # 2 days or longer + elif self >= 86400: + return _("1 day %d hours") % ((self-86400)//3600) # 1-2 days + elif self >= 3600: + return _("%d:%02d hours") % (self//3600, (self%3600)//60) # 1 h - 1 day + elif self >= 60: + return _("%d:%02d minutes") % (self//60, self%60) # 1 minute to 1 hour + elif self >= 0: + return _("%d seconds") % int(self) + else: + return _("0 seconds") + + +class FancyLabel(gtk.Label): + def __init__(self, label_string, *values): + self.label_string = label_string + gtk.Label.__init__(self, label_string%values) + + def set_value(self, *values): + self.set_text(self.label_string%values) + + +class IconButton(gtk.Button): + def __init__(self, label, iconpath=None, stock=None): + gtk.Button.__init__(self) + + self.hbox = gtk.HBox(spacing=5) + + self.icon = gtk.Image() + if stock is not None: + self.icon.set_from_stock(stock, gtk.ICON_SIZE_BUTTON) + elif iconpath is not None: + self.icon.set_from_file(iconpath) + else: + raise TypeError, 'IconButton needs iconpath or stock' + self.hbox.pack_start(self.icon) + + self.label = gtk.Label(label) + self.hbox.pack_start(self.label) + + self.add(halign(self.hbox, 0.5)) + + +class LanguageChooser(gtk.Frame): + def __init__(self): + gtk.Frame.__init__(self, "Translate %s into:" % app_name) + self.set_border_width(SPACING) + + model = gtk.ListStore(*[gobject.TYPE_STRING] * 2) + default = model.append(("System default", '')) + + lang = read_language_file() + for l in languages: + it = model.append((language_names[l].encode('utf8'), l)) + if l == lang: + default = it + + self.combo = gtk.ComboBox(model) + cell = gtk.CellRendererText() + self.combo.pack_start(cell, True) + self.combo.add_attribute(cell, 'text', 0) + + if default is not None: + self.combo.set_active_iter(default) + + self.combo.connect('changed', self.changed) + box = gtk.VBox(spacing=SPACING) + box.set_border_width(SPACING) + box.pack_start(self.combo, expand=False, fill=False) + l = gtk.Label("You must restart %s for the\nlanguage " + "setting to take effect." % app_name) + l.set_alignment(0,1) + l.set_line_wrap(True) + box.pack_start(l, expand=False, fill=False) + self.add(box) + + def changed(self, *a): + it = self.combo.get_active_iter() + model = self.combo.get_model() + code = model.get(it, 1)[0] + write_language_file(code) + + +class Window(gtk.Window): + def __init__(self, *args): + apply(gtk.Window.__init__, (self,)+args) + iconname = os.path.join(image_root,'bittorrent.ico') + icon16 = gtk.gdk.pixbuf_new_from_file_at_size(iconname, 16, 16) + icon32 = gtk.gdk.pixbuf_new_from_file_at_size(iconname, 32, 32) + self.set_icon_list(icon16, icon32) + + +class HelpWindow(Window): + def __init__(self, main, helptext): + Window.__init__(self) + self.set_title(_("%s Help")%app_name) + self.main = main + self.set_border_width(SPACING) + + self.vbox = gtk.VBox(spacing=SPACING) + + self.faq_box = gtk.HBox(spacing=SPACING) + self.faq_box.pack_start(gtk.Label(_("Frequently Asked Questions:")), expand=False, fill=False) + self.faq_url = gtk.Entry() + self.faq_url.set_text(FAQ_URL) + self.faq_url.set_editable(False) + self.faq_box.pack_start(self.faq_url, expand=True, fill=True) + self.faq_button = gtk.Button(_("Go")) + self.faq_button.connect('clicked', lambda w: self.main.visit_url(FAQ_URL) ) + self.faq_box.pack_start(self.faq_button, expand=False, fill=False) + self.vbox.pack_start(self.faq_box, expand=False, fill=False) + + self.cmdline_args = gtk.Label(helptext) + + self.cmdline_sw = ScrolledWindow() + self.cmdline_sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) + self.cmdline_sw.add_with_viewport(self.cmdline_args) + + self.cmdline_sw.set_size_request(self.cmdline_args.size_request()[0]+SCROLLBAR_WIDTH, 200) + + self.vbox.pack_start(self.cmdline_sw) + + self.add(self.vbox) + + self.show_all() + + if self.main is not None: + self.connect('destroy', lambda w: self.main.window_closed('help')) + else: + self.connect('destroy', lambda w: gtk.main_quit()) + gtk.main() + + + + def close(self, widget=None): + self.destroy() + + +class ScrolledWindow(gtk.ScrolledWindow): + def scroll_to_bottom(self): + child_height = self.child.child.size_request()[1] + self.scroll_to(0, child_height) + + def scroll_by(self, dx=0, dy=0): + v = self.get_vadjustment() + new_y = min(v.upper, v.value + dy) + self.scroll_to(0, new_y) + + def scroll_to(self, x=0, y=0): + v = self.get_vadjustment() + child_height = self.child.child.size_request()[1] + new_adj = gtk.Adjustment(y, 0, child_height) + self.set_vadjustment(new_adj) + + +class AutoScrollingWindow(ScrolledWindow): + def __init__(self): + ScrolledWindow.__init__(self) + self.drag_dest_set(gtk.DEST_DEFAULT_MOTION | + gtk.DEST_DEFAULT_DROP, + TARGET_ALL, + gtk.gdk.ACTION_MOVE|gtk.gdk.ACTION_COPY) + self.connect('drag_motion' , self.drag_motion ) +# self.connect('drag_data_received', self.drag_data_received) + self.vscrolltimeout = None + +# def drag_data_received(self, widget, context, x, y, selection, targetType, time): +# print _("AutoScrollingWindow.drag_data_received("), widget + + def drag_motion(self, widget, context, x, y, time): + v = self.get_vadjustment() + if v.page_size - y <= 10: + amount = (10 - int(v.page_size - y)) * 2 + self.start_scrolling(amount) + elif y <= 10: + amount = (y - 10) * 2 + self.start_scrolling(amount) + else: + self.stop_scrolling() + return True + + def scroll_and_wait(self, amount, lock_held): + if not lock_held: + gtk.threads_enter() + self.scroll_by(0, amount) + if not lock_held: + gtk.threads_leave() + if self.vscrolltimeout is not None: + gobject.source_remove(self.vscrolltimeout) + self.vscrolltimeout = gobject.timeout_add(100, self.scroll_and_wait, amount, False) + #print "adding timeout", self.vscrolltimeout, amount + + def start_scrolling(self, amount): + if self.vscrolltimeout is not None: + gobject.source_remove(self.vscrolltimeout) + self.scroll_and_wait(amount, True) + + def stop_scrolling(self): + if self.vscrolltimeout is not None: + #print "removing timeout", self.vscrolltimeout + gobject.source_remove(self.vscrolltimeout) + self.vscrolltimeout = None + +class MessageDialog(gtk.MessageDialog): + flags = gtk.DIALOG_MODAL|gtk.DIALOG_DESTROY_WITH_PARENT + + def __init__(self, parent, title, message, + type=gtk.MESSAGE_ERROR, + buttons=gtk.BUTTONS_OK, + yesfunc=None, nofunc=None, + default=gtk.RESPONSE_OK + ): + gtk.MessageDialog.__init__(self, parent, + self.flags, + type, buttons, message) + + self.set_size_request(-1, -1) + self.set_resizable(False) + self.set_title(title) + if default is not None: + self.set_default_response(default) + + self.label.set_line_wrap(True) + + self.connect('response', self.callback) + + self.yesfunc = yesfunc + self.nofunc = nofunc + if os.name == 'nt': + parent.present() + self.show_all() + + def callback(self, widget, response_id, *args): + if ((response_id == gtk.RESPONSE_OK or + response_id == gtk.RESPONSE_YES) and + self.yesfunc is not None): + self.yesfunc() + if ((response_id == gtk.RESPONSE_CANCEL or + response_id == gtk.RESPONSE_NO ) + and self.nofunc is not None): + self.nofunc() + self.destroy() + +class ErrorMessageDialog(MessageDialog): + flags = gtk.DIALOG_DESTROY_WITH_PARENT + + +if gtk.pygtk_version < (2, 4, 1): + + class FileSelection(gtk.FileSelection): + + def __init__(self, main, title='', fullname='', got_location_func=None, no_location_func=None, got_multiple_location_func=None, show=True): + gtk.FileSelection.__init__(self) + from BitTorrent.ConvertedMetainfo import filesystem_encoding + self.fsenc = filesystem_encoding + try: + fullname.decode('utf8') + except: + fullname = fullname.decode(self.fsenc) + self.main = main + self.set_modal(True) + self.set_destroy_with_parent(True) + self.set_title(title) + if (got_location_func is None and + got_multiple_location_func is not None): + self.set_select_multiple(True) + self.got_location_func = got_location_func + self.no_location_func = no_location_func + self.got_multiple_location_func = got_multiple_location_func + self.cancel_button.connect("clicked", self.destroy) + self.d_handle = self.connect('destroy', self.no_location) + self.ok_button.connect("clicked", self.done) + self.set_filename(fullname) + if show: + self.show() + + def no_location(self, widget=None): + if self.no_location_func is not None: + self.no_location_func() + + def done(self, widget=None): + if self.get_select_multiple(): + self.got_multiple_location() + else: + self.got_location() + self.disconnect(self.d_handle) + self.destroy() + + def got_location(self): + if self.got_location_func is not None: + name = self.get_filename() + self.got_location_func(name) + + def got_multiple_location(self): + if self.got_multiple_location_func is not None: + names = self.get_selections() + self.got_multiple_location_func(names) + + def destroy(self, widget=None): + gtk.FileSelection.destroy(self) + + def close_child_windows(self): + self.no_location() + + def close(self, widget=None): + self.destroy() + + class OpenFileSelection(FileSelection): + pass + + class SaveFileSelection(FileSelection): + pass + + class ChooseFolderSelection(FileSelection): + pass + + class CreateFolderSelection(FileSelection): + pass + + class FileOrFolderSelection(FileSelection): + pass + +else: + + class FileSelection(gtk.FileChooserDialog): + + def __init__(self, action, main, title='', fullname='', + got_location_func=None, no_location_func=None, + got_multiple_location_func=None, show=True): + gtk.FileChooserDialog.__init__(self, action=action, title=title, + buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OK, gtk.RESPONSE_OK)) + from BitTorrent.ConvertedMetainfo import filesystem_encoding + self.fsenc = filesystem_encoding + try: + fullname.decode('utf8') + except: + fullname = fullname.decode(self.fsenc) + self.set_default_response(gtk.RESPONSE_OK) + if action == gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER: + self.convert_button_box = gtk.HBox() + self.convert_button = gtk.Button(_("Choose an existing folder...")) + self.convert_button.connect('clicked', self.change_action) + self.convert_button_box.pack_end(self.convert_button, + expand=False, + fill=False) + self.convert_button_box.show_all() + self.set_extra_widget(self.convert_button_box) + elif action == gtk.FILE_CHOOSER_ACTION_OPEN: + self.all_filter = gtk.FileFilter() + self.all_filter.add_pattern('*') + self.all_filter.set_name(_("All Files")) + self.add_filter(self.all_filter) + self.torrent_filter = gtk.FileFilter() + self.torrent_filter.add_pattern('*.torrent') + self.torrent_filter.add_mime_type('application/x-bittorrent') + self.torrent_filter.set_name(_("Torrents")) + self.add_filter(self.torrent_filter) + self.set_filter(self.torrent_filter) + + self.main = main + self.set_modal(True) + self.set_destroy_with_parent(True) + if fullname: + if action == gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER: + if gtk.gtk_version < (2,6): + fullname = fullname.encode(self.fsenc) + self.set_filename(fullname) + elif action == gtk.FILE_CHOOSER_ACTION_OPEN: + if fullname[-1] != os.sep: + fullname = fullname + os.sep + path, filename = os.path.split(fullname) + if gtk.gtk_version < (2,6): + path = path.encode(self.fsenc) + self.set_current_folder(path) + else: + if fullname[-1] == os.sep: + fullname = fullname[:-1] + path, filename = os.path.split(fullname) + if gtk.gtk_version < (2,8): + path = path.encode(self.fsenc) + self.set_current_folder(path) + self.set_current_name(filename) + if got_multiple_location_func is not None: + self.got_multiple_location_func = got_multiple_location_func + self.set_select_multiple(True) + self.got_location_func = got_location_func + self.no_location_func = no_location_func + self.connect('response', self.got_response) + self.d_handle = self.connect('destroy', self.got_response, + gtk.RESPONSE_CANCEL) + if show: + self.show() + + def change_action(self, widget): + if self.get_action() == gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER: + self.convert_button.set_label(_("Create a new folder...")) + self.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) + elif self.get_action() == gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER: + self.convert_button.set_label(_("Choose an existing folder...")) + self.set_action(gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER) + + def got_response(self, widget, response): + if response == gtk.RESPONSE_OK: + if self.get_select_multiple(): + if self.got_multiple_location_func is not None: + self.got_multiple_location_func(self.get_filenames()) + elif self.got_location_func is not None: + fn = self.get_filename() + if fn: + self.got_location_func(fn) + else: + self.no_location_func() + else: + if self.no_location_func is not None: + self.no_location_func() + self.disconnect(self.d_handle) + self.destroy() + + def done(self, widget=None): + if self.get_select_multiple(): + self.got_multiple_location() + else: + self.got_location() + self.disconnect(self.d_handle) + self.destroy() + + def close_child_windows(self): + self.destroy() + + def close(self, widget=None): + self.destroy() + + + class OpenFileSelection(FileSelection): + + def __init__(self, *args, **kwargs): + FileSelection.__init__(self, gtk.FILE_CHOOSER_ACTION_OPEN, *args, + **kwargs) + + + class SaveFileSelection(FileSelection): + + def __init__(self, *args, **kwargs): + FileSelection.__init__(self, gtk.FILE_CHOOSER_ACTION_SAVE, *args, + **kwargs) + + + class ChooseFolderSelection(FileSelection): + + def __init__(self, *args, **kwargs): + FileSelection.__init__(self, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, + *args, **kwargs) + + class CreateFolderSelection(FileSelection): + + def __init__(self, *args, **kwargs): + FileSelection.__init__(self, gtk.FILE_CHOOSER_ACTION_CREATE_FOLDER, + *args, **kwargs) + + + class FileOrFolderSelection(FileSelection): + def __init__(self, *args, **kwargs): + FileSelection.__init__(self, gtk.FILE_CHOOSER_ACTION_OPEN, *args, + **kwargs) + self.select_file = _("Select a file" ) + self.select_folder = _("Select a folder") + self.convert_button_box = gtk.HBox() + self.convert_button = gtk.Button(self.select_folder) + self.convert_button.connect('clicked', self.change_action) + self.convert_button_box.pack_end(self.convert_button, + expand=False, + fill=False) + self.convert_button_box.show_all() + self.set_extra_widget(self.convert_button_box) + self.reset_by_action() + self.set_filter(self.all_filter) + + + def change_action(self, widget): + if self.get_action() == gtk.FILE_CHOOSER_ACTION_OPEN: + self.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER) + elif self.get_action() == gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER: + self.set_action(gtk.FILE_CHOOSER_ACTION_OPEN) + self.reset_by_action() + + def reset_by_action(self): + if self.get_action() == gtk.FILE_CHOOSER_ACTION_OPEN: + self.convert_button.set_label(self.select_folder) + self.set_title(self.select_file) + elif self.get_action() == gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER: + self.convert_button.set_label(self.select_file) + self.set_title(self.select_folder) + + def set_title(self, title): + mytitle = title + ':' + FileSelection.set_title(self, mytitle) + + +class PaddedHSeparator(gtk.VBox): + def __init__(self, spacing=SPACING): + gtk.VBox.__init__(self) + self.sep = gtk.HSeparator() + self.pack_start(self.sep, expand=False, fill=False, padding=spacing) + self.show_all() + + +class HSeparatedBox(gtk.VBox): + + def new_separator(self): + return PaddedHSeparator() + + def _get_children(self): + return gtk.VBox.get_children(self) + + def get_children(self): + return self._get_children()[0::2] + + def _reorder_child(self, child, index): + gtk.VBox.reorder_child(self, child, index) + + def reorder_child(self, child, index): + children = self._get_children() + oldindex = children.index(child) + sep = None + if oldindex == len(children) - 1: + sep = children[oldindex-1] + else: + sep = children[oldindex+1] + + newindex = index*2 + if newindex == len(children) -1: + self._reorder_child(sep, newindex-1) + self._reorder_child(child, newindex) + else: + self._reorder_child(child, newindex) + self._reorder_child(sep, newindex+1) + + def pack_start(self, widget, *args, **kwargs): + if len(self._get_children()): + s = self.new_separator() + gtk.VBox.pack_start(self, s, *args, **kwargs) + s.show() + gtk.VBox.pack_start(self, widget, *args, **kwargs) + + def pack_end(self, widget, *args, **kwargs): + if len(self._get_children()): + s = self.new_separator() + gtk.VBox.pack_start(self, s, *args, **kwargs) + s.show() + gtk.VBox.pack_end(self, widget, *args, **kwargs) + + def remove(self, widget): + children = self._get_children() + if len(children) > 1: + index = children.index(widget) + if index == 0: + sep = children[index+1] + else: + sep = children[index-1] + sep.destroy() + gtk.VBox.remove(self, widget) diff --git a/BitTorrent/GetTorrent.py b/BitTorrent/GetTorrent.py new file mode 100755 index 0000000..88f0757 --- /dev/null +++ b/BitTorrent/GetTorrent.py @@ -0,0 +1,82 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# GetTorrent -- abstraction which can get a .torrent file from multiple +# sources: local file, url, etc. + +# written by Matt Chisholm + +import os +import re +import zurllib +from bencode import bdecode +from BitTorrent.platform import get_cache_dir + +urlpat = re.compile('^\w+://') + +def get_quietly(arg): + (data, errors) = get(arg) + # If there's an error opening a file from the IE cache, + # act like we simply didn't get a file (because we didn't) + if errors: + cache = get_cache_dir() + if (cache is not None) and (cache in arg): + errors = [] + return data, errors + +def get(arg): + data = None + errors = [] + if os.access(arg, os.F_OK): + data, errors = get_file(arg) + elif urlpat.match(arg): + data, errors = get_url(arg) + else: + errors.append(_("Could not read %s") % arg) + return data, errors + + +def get_url(url): + data = None + errors = [] + err_str = _("Could not download or open \n%s\n" + "Try using a web browser to download the torrent file.") % url + u = None + try: + u = zurllib.urlopen(url) + data = u.read() + u.close() + b = bdecode(data) + except Exception, e: + if u is not None: + u.close() + errors.append(err_str + "\n(%s)" % e) + data = None + else: + if u is not None: + u.close() + + return data, errors + + +def get_file(filename): + data = None + errors = [] + f = None + try: + f = file(filename, 'rb') + data = f.read() + f.close() + except Exception, e: + if f is not None: + f.close() + errors.append((_("Could not read %s") % filename) + (': %s' % str(e))) + + return data, errors diff --git a/BitTorrent/HTTPHandler.py b/BitTorrent/HTTPHandler.py new file mode 100755 index 0000000..d147790 --- /dev/null +++ b/BitTorrent/HTTPHandler.py @@ -0,0 +1,188 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from RawServer_magic import Handler +from cStringIO import StringIO +from sys import stdout +import time +from gzip import GzipFile + +DEBUG = False + +weekdays = [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")] + +months = [None, _("Jan"), _("Feb"), _("Mar"), _("Apr"), _("May"), _("Jun"), + _("Jul"), _("Aug"), _("Sep"), _("Oct"), _("Nov"), _("Dec")] + + +class HTTPConnection(object): + + def __init__(self, handler, connection): + self.handler = handler + self.connection = connection + self.buf = '' + self.closed = False + self.done = False + self.donereading = False + self.next_func = self.read_type + + def get_ip(self): + return self.connection.ip + + def data_came_in(self, data): + if self.donereading or self.next_func is None: + return True + self.buf += data + while True: + try: + i = self.buf.index('\n') + except ValueError: + return True + val = self.buf[:i] + self.buf = self.buf[i+1:] + self.next_func = self.next_func(val) + if self.donereading: + return True + if self.next_func is None or self.closed: + return False + + def read_type(self, data): + self.header = data.strip() + words = data.split() + if len(words) == 3: + self.command, self.path, garbage = words + self.pre1 = False + elif len(words) == 2: + self.command, self.path = words + self.pre1 = True + if self.command != 'GET': + return None + else: + return None + if self.command not in ('HEAD', 'GET'): + return None + self.headers = {} + return self.read_header + + def read_header(self, data): + data = data.strip() + if data == '': + self.donereading = True + # check for Accept-Encoding: header, pick a + if self.headers.has_key('accept-encoding'): + ae = self.headers['accept-encoding'] + if DEBUG: + print "Got Accept-Encoding: " + ae + "\n" + else: + #identity assumed if no header + ae = 'identity' + # this eventually needs to support multple acceptable types + # q-values and all that fancy HTTP crap + # for now assume we're only communicating with our own client + if ae.find('gzip') != -1: + self.encoding = 'gzip' + else: + #default to identity. + self.encoding = 'identity' + r = self.handler.getfunc(self, self.path, self.headers) + if r is not None: + self.answer(r) + return None + try: + i = data.index(':') + except ValueError: + return None + self.headers[data[:i].strip().lower()] = data[i+1:].strip() + if DEBUG: + print data[:i].strip() + ": " + data[i+1:].strip() + return self.read_header + + def answer(self, (responsecode, responsestring, headers, data)): + if self.closed: + return + if self.encoding == 'gzip': + #transform data using gzip compression + #this is nasty but i'm unsure of a better way at the moment + compressed = StringIO() + gz = GzipFile(fileobj = compressed, mode = 'wb', compresslevel = 9) + gz.write(data) + gz.close() + compressed.seek(0,0) + cdata = compressed.read() + compressed.close() + if len(cdata) >= len(data): + self.encoding = 'identity' + else: + if DEBUG: + print _("Compressed: %i Uncompressed: %i\n") % (len(cdata),len(data)) + data = cdata + headers['Content-Encoding'] = 'gzip' + + # i'm abusing the identd field here, but this should be ok + if self.encoding == 'identity': + ident = '-' + else: + ident = self.encoding + username = '-' + referer = self.headers.get('referer','-') + useragent = self.headers.get('user-agent','-') + year, month, day, hour, minute, second, a, b, c = time.localtime(time.time()) + print '%s %s %s [%02d/%3s/%04d:%02d:%02d:%02d] "%s" %i %i "%s" "%s"' % ( + self.connection.ip, ident, username, day, months[month], year, hour, + minute, second, self.header, responsecode, len(data), referer, useragent) + t = time.time() + if t - self.handler.lastflush > self.handler.minflush: + self.handler.lastflush = t + stdout.flush() + + self.done = True + r = StringIO() + r.write('HTTP/1.0 ' + str(responsecode) + ' ' + + responsestring + '\r\n') + if not self.pre1: + headers['Content-Length'] = len(data) + for key, value in headers.items(): + r.write(key + ': ' + str(value) + '\r\n') + r.write('\r\n') + if self.command != 'HEAD': + r.write(data) + self.connection.write(r.getvalue()) + if self.connection.is_flushed(): + self.connection.shutdown(1) + + +class HTTPHandler(Handler): + + def __init__(self, getfunc, minflush): + self.connections = {} + self.getfunc = getfunc + self.minflush = minflush + self.lastflush = time.time() + + def connection_made(self, connection): + self.connections[connection] = HTTPConnection(self, connection) + + def connection_flushed(self, connection): + if self.connections[connection].done: + connection.shutdown(1) + + def connection_lost(self, connection): + ec = self.connections[connection] + ec.closed = True + del ec.connection + del ec.next_func + del self.connections[connection] + + def data_came_in(self, connection, data): + c = self.connections[connection] + if not c.data_came_in(data) and not c.closed: + c.connection.shutdown(1) diff --git a/BitTorrent/LaunchPath.py b/BitTorrent/LaunchPath.py new file mode 100755 index 0000000..3c78845 --- /dev/null +++ b/BitTorrent/LaunchPath.py @@ -0,0 +1,54 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# LaunchPath -- a cross platform way to "open," "launch," or "start" +# files and directories + +# written by Matt Chisholm + +import os + +can_launch_files = False +posix_browsers = ('gnome-open','konqueror',) #gmc, gentoo only work on dirs +default_posix_browser = '' + +def launchpath_nt(path): + os.startfile(path) + +def launchpath_mac(path): + # BUG: this is untested + os.spawnlp(os.P_NOWAIT, 'open', 'open', path) + +def launchpath_posix(path): + if default_posix_browser: + os.spawnlp(os.P_NOWAIT, default_posix_browser, + default_posix_browser, path) + +def launchpath(path): + pass + +def launchdir(path): + if os.path.isdir(path): + launchpath(path) + +if os.name == 'nt': + can_launch_files = True + launchpath = launchpath_nt +elif os.name == 'mac': + can_launch_files = True + launchpath = launchpath_mac +elif os.name == 'posix': + for b in posix_browsers: + if os.system("which '%s' >/dev/null 2>&1" % b.replace("'","\\'")) == 0: + can_launch_files = True + default_posix_browser = b + launchpath = launchpath_posix + break + diff --git a/BitTorrent/NatCheck.py b/BitTorrent/NatCheck.py new file mode 100755 index 0000000..6363ded --- /dev/null +++ b/BitTorrent/NatCheck.py @@ -0,0 +1,101 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from cStringIO import StringIO +from socket import error as socketerror + +protocol_name = 'BitTorrent protocol' + +# header, reserved, download id, my id, [length, message] + + +class NatCheck(object): + + def __init__(self, resultfunc, downloadid, peerid, ip, port, rawserver): + self.resultfunc = resultfunc + self.downloadid = downloadid + self.peerid = peerid + self.ip = ip + self.port = port + self.closed = False + self.buffer = StringIO() + self.next_len = 1 + self.next_func = self.read_header_len + rawserver.async_start_connection((ip, port), self) + + def connection_started(self, s): + self.connection = s + self.connection.write(chr(len(protocol_name)) + protocol_name + + (chr(0) * 8) + self.downloadid) + + def connection_failed(self, addr, exception): + self.answer(False) + + def answer(self, result): + self.closed = True + try: + self.connection.close() + except AttributeError: + pass + self.resultfunc(result, self.downloadid, self.peerid, self.ip, self.port) + + def read_header_len(self, s): + if ord(s) != len(protocol_name): + return None + return len(protocol_name), self.read_header + + def read_header(self, s): + if s != protocol_name: + return None + return 8, self.read_reserved + + def read_reserved(self, s): + return 20, self.read_download_id + + def read_download_id(self, s): + if s != self.downloadid: + return None + return 20, self.read_peer_id + + def read_peer_id(self, s): + if s != self.peerid: + return None + self.answer(True) + return None + + def data_came_in(self, connection, s): + while True: + if self.closed: + return + i = self.next_len - self.buffer.tell() + if i > len(s): + self.buffer.write(s) + return + self.buffer.write(s[:i]) + s = s[i:] + m = self.buffer.getvalue() + self.buffer.reset() + self.buffer.truncate() + x = self.next_func(m) + if x is None: + if not self.closed: + self.answer(False) + return + self.next_len, self.next_func = x + + def connection_lost(self, connection): + if not self.closed: + self.closed = True + self.resultfunc(False, self.downloadid, self.peerid, self.ip, self.port) + + def connection_flushed(self, connection): + pass diff --git a/BitTorrent/NewVersion.py b/BitTorrent/NewVersion.py new file mode 100755 index 0000000..ad2f634 --- /dev/null +++ b/BitTorrent/NewVersion.py @@ -0,0 +1,249 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# written by Matt Chisholm + +import os +import sys +import zurllib +import pickle +import threading +from sha import sha + +DEBUG = False + +from BitTorrent import ERROR, WARNING, BTFailure, version, app_name +from BitTorrent import GetTorrent +from BitTorrent.bencode import bdecode, bencode +from BitTorrent.platform import os_version, spawn, get_temp_dir, doc_root, is_frozen_exe, osx +from BitTorrent.ConvertedMetainfo import ConvertedMetainfo + +if osx: + from Foundation import NSAutoreleasePool + +if is_frozen_exe or DEBUG: + # needed for py2exe to include the public key lib + from Crypto.PublicKey import DSA + +version_host = 'http://version.bittorrent.com/' +download_url = 'http://bittorrent.com/download.html' + +# based on Version() class from ShellTools package by Matt Chisholm, +# used with permission +class Version(list): + def __str__(self): + return '.'.join(map(str, self)) + + def is_beta(self): + return self[1] % 2 == 1 + + def from_str(self, text): + return Version( [int(t) for t in text.split('.')] ) + + def name(self): + if self.is_beta(): + return 'beta' + else: + return 'stable' + + from_str = classmethod(from_str) + +currentversion = Version.from_str(version) + +availableversion = None + +class Updater(object): + def __init__(self, threadwrap, newversionfunc, startfunc, installfunc, errorfunc): + self.threadwrap = threadwrap # for calling back to UI from thread + self.newversionfunc = newversionfunc # alert to new version UI function + self.startfunc = startfunc # start torrent UI function + self.installfunc = installfunc # install torrent UI function + self.errorfunc = errorfunc # report error UI function + self.infohash = None + self.version = currentversion + self.asked_for_install = False + self.version_site = version_host + if os.name == 'nt': + self.version_site += 'win32/' + if os_version != 'XP': + self.version_site += 'legacy/' + elif osx: + self.version_site += 'osx/' + + def debug(self, message): + if DEBUG: + self.threadwrap(self.errorfunc, WARNING, message) + + def get_available(self): + url = self.version_site + currentversion.name() + self.debug('Updater.get_available() hitting url %s' % url) + try: + u = zurllib.urlopen(url) + s = u.read() + s = s.strip() + except: + raise BTFailure(_("Could not get latest version from %s")%url) + try: + assert len(s) == 5 + availableversion = Version.from_str(s) + except: + raise BTFailure(_("Could not parse new version string from %s")%url) + self.version = availableversion + self.debug('Updater.get_available() got %s' % str(self.version)) + return self.version + + + def get(self): + try: + self.get_available() + except BTFailure, e: + self.threadwrap(self.errorfunc, WARNING, e) + return + + if self.version <= currentversion: + self.debug('Updater.get() not updating old version %s' % str(self.version)) + return + + if not self.can_install(): + self.debug('Updater.get() cannot install on this os') + return + + self.installer_name = self.calc_installer_name() + self.installer_url = self.version_site + self.installer_name + '.torrent' + self.installer_dir = self.calc_installer_dir() + + self.torrentfile = None + torrentfile, terrors = GetTorrent.get_url(self.installer_url) + signature = None + try: + signfile = zurllib.urlopen(self.installer_url + '.sign') + except: + self.debug('Updater.get() failed to get signfile %s.sign' % self.installer_url) + else: + try: + signature = pickle.load(signfile) + except: + self.debug('Updater.get() failed to load signfile %s' % signfile) + + if terrors: + self.threadwrap(self.errorfunc, WARNING, '\n'.join(terrors)) + + if torrentfile and signature: + public_key_file = open(os.path.join(doc_root, 'public.key'), 'rb') + public_key = pickle.load(public_key_file) + h = sha(torrentfile).digest() + if public_key.verify(h, signature): + self.torrentfile = torrentfile + b = bdecode(torrentfile) + self.infohash = sha(bencode(b['info'])).digest() + self.total_size = b['info']['length'] + self.debug('Updater.get() got torrent file and signature') + else: + self.debug('Updater.get() torrent file signature failed to verify.') + pass + else: + self.debug('Updater.get() doesn\'t have torrentfile %s and signature %s' % + (str(type(torrentfile)), str(type(signature)))) + + def installer_path(self): + if self.installer_dir is not None: + return os.path.join(self.installer_dir, + self.installer_name) + else: + return None + + def check(self): + t = threading.Thread(target=self._check, + args=()) + t.start() + + def _check(self): + if osx: + pool = NSAutoreleasePool.alloc().init() + self.get() + if self.version > currentversion: + self.threadwrap(self.newversionfunc, self.version, download_url) + + def can_install(self): + if DEBUG: + return True + if os.name == 'nt': + return True + elif osx: + return True + else: + return False + + def calc_installer_name(self): + if os.name == 'nt': + ext = 'exe' + elif osx: + ext = 'dmg' + elif os.name == 'posix' and DEBUG: + ext = 'tar.gz' + else: + return + + parts = [app_name, str(self.version)] + if self.version.is_beta(): + parts.append('Beta') + name = '-'.join(parts) + name += '.' + ext + return name + + def set_installer_dir(self, path): + self.installer_dir = path + + def calc_installer_dir(self): + if hasattr(self, 'installer_dir'): + return self.installer_dir + + temp_dir = get_temp_dir() + if temp_dir is not None: + return temp_dir + else: + self.errorfunc(WARNING, + _("Could not find a suitable temporary location to " + "save the %s %s installer.") % (app_name, self.version)) + + def installer_downloaded(self): + if self.installer_path() and os.access(self.installer_path(), os.F_OK): + size = os.stat(self.installer_path())[6] + if size == self.total_size: + return True + else: + #print 'installer is wrong size, is', size, 'should be', self.total_size + return False + else: + #print 'installer does not exist' + return False + + def download(self): + if self.torrentfile is not None: + self.startfunc(self.torrentfile, self.installer_path()) + else: + self.errorfunc(WARNING, _("No torrent file available for %s %s " + "installer.")%(app_name, self.version)) + + def start_install(self): + if not self.asked_for_install: + if self.installer_downloaded(): + self.asked_for_install = True + self.installfunc() + else: + self.errorfunc(WARNING, + _("%s %s installer appears to be corrupt " + "or missing.")%(app_name, self.version)) + + def launch_installer(self): + if os.name == 'nt': + os.startfile(self.installer_path()) + else: + self.errorfunc(WARNING, _("Cannot launch installer on this OS")) diff --git a/BitTorrent/PiecePicker.py b/BitTorrent/PiecePicker.py new file mode 100755 index 0000000..e22b13a --- /dev/null +++ b/BitTorrent/PiecePicker.py @@ -0,0 +1,138 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from random import randrange, shuffle, choice + + +class PiecePicker(object): + + def __init__(self, numpieces, config): + self.config = config + self.numpieces = numpieces + self.interests = [range(numpieces)] + self.pos_in_interests = range(numpieces) + self.numinterests = [0] * numpieces + self.have = [False] * numpieces + self.crosscount = [numpieces] + self.started = [] + self.seedstarted = [] + self.numgot = 0 + self.scrambled = range(numpieces) + shuffle(self.scrambled) + + def got_have(self, piece): + numint = self.numinterests[piece] + self.crosscount[numint + self.have[piece]] -= 1 + self.numinterests[piece] += 1 + try: + self.crosscount[numint + 1 + self.have[piece]] += 1 + except IndexError: + self.crosscount.append(1) + if self.have[piece]: + return + if numint == len(self.interests) - 1: + self.interests.append([]) + self._shift_over(piece, self.interests[numint], self.interests[numint + 1]) + + def lost_have(self, piece): + numint = self.numinterests[piece] + self.crosscount[numint + self.have[piece]] -= 1 + self.numinterests[piece] -= 1 + self.crosscount[numint - 1 + self.have[piece]] += 1 + if self.have[piece]: + return + self._shift_over(piece, self.interests[numint], self.interests[numint - 1]) + + def _shift_over(self, piece, l1, l2): + p = self.pos_in_interests[piece] + l1[p] = l1[-1] + self.pos_in_interests[l1[-1]] = p + del l1[-1] + newp = randrange(len(l2) + 1) + if newp == len(l2): + self.pos_in_interests[piece] = len(l2) + l2.append(piece) + else: + old = l2[newp] + self.pos_in_interests[old] = len(l2) + l2.append(old) + l2[newp] = piece + self.pos_in_interests[piece] = newp + + def requested(self, piece, seed = False): + if piece not in self.started: + self.started.append(piece) + if seed and piece not in self.seedstarted: + self.seedstarted.append(piece) + + def complete(self, piece): + assert not self.have[piece] + self.have[piece] = True + self.crosscount[self.numinterests[piece]] -= 1 + try: + self.crosscount[self.numinterests[piece] + 1] += 1 + except IndexError: + self.crosscount.append(1) + self.numgot += 1 + l = self.interests[self.numinterests[piece]] + p = self.pos_in_interests[piece] + l[p] = l[-1] + self.pos_in_interests[l[-1]] = p + del l[-1] + try: + self.started.remove(piece) + self.seedstarted.remove(piece) + except ValueError: + pass + + def next(self, havefunc, seed = False): + bests = None + bestnum = 2 ** 30 + if seed: + s = self.seedstarted + else: + s = self.started + for i in s: + if havefunc(i): + if self.numinterests[i] < bestnum: + bests = [i] + bestnum = self.numinterests[i] + elif self.numinterests[i] == bestnum: + bests.append(i) + if bests: + return choice(bests) + if self.numgot < self.config['rarest_first_cutoff']: + for i in self.scrambled: + if havefunc(i): + return i + return None + for i in xrange(1, min(bestnum, len(self.interests))): + for j in self.interests[i]: + if havefunc(j): + return j + return None + + def am_I_complete(self): + return self.numgot == self.numpieces + + def bump(self, piece): + l = self.interests[self.numinterests[piece]] + pos = self.pos_in_interests[piece] + del l[pos] + l.append(piece) + for i in range(pos,len(l)): + self.pos_in_interests[l[i]] = i + try: + self.started.remove(piece) + self.seedstarted.remove(piece) + except ValueError: + pass diff --git a/BitTorrent/RateLimiter.py b/BitTorrent/RateLimiter.py new file mode 100755 index 0000000..5fc1bc7 --- /dev/null +++ b/BitTorrent/RateLimiter.py @@ -0,0 +1,183 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Uoti Urpala and Andrew Loewenstern + +from BitTorrent.platform import bttime + +def minctx(a,b): + A = B = 0 + if a.rate > 0: + A = a.offset_amount / a.rate + if b.rate > 0: + B = b.offset_amount / b.rate + if A <= B: + return a + return b + +class Dummy(object): + def __init__(self, next): + self.next_upload = next + def send_partial(self, size): + return 0 + closed = False + +class RateLimitedGroup(object): + def __init__(self, rate, got_exception): + self.got_exception = got_exception + # limiting + self.check_time = 0 + self.lasttime = bttime() + self.offset_amount = 0 + self.set_rate(rate) + # accounting + self.count = 0 + self.counts = [] + + def set_rate(self, new_rate): + self.rate = new_rate * 1024 + self.check_time = 0 + self.offset_amount = 0 + +class MultiRateLimiter(object): + def __init__(self, sched): + self.sched = sched + self.last = None + self.upload_rate = 0 + self.unitsize = 17000 + self.offset_amount = 0 + self.ctxs = [] # list of contexts with connections in the queue + self.ctx_counts = {} # dict conn -> how many connections each context has + + def set_parameters(self, rate, unitsize): + if unitsize > 17000: + # Since data is sent to peers in a round-robin fashion, max one + # full request at a time, setting this higher would send more data + # to peers that use request sizes larger than standard 16 KiB. + # 17000 instead of 16384 to allow room for metadata messages. + unitsize = 17000 + self.upload_rate = rate * 1024 + self.unitsize = unitsize + self.lasttime = bttime() + self.offset_amount = 0 + + def queue(self, conn, ctx): + assert conn.next_upload is None + if ctx not in self.ctxs: + ctx.check_time = 1 + self.ctxs.append(ctx) + self.ctx_counts[ctx] = 1 + else: + self.ctx_counts[ctx] += 1 + + if self.last is None: + self.last = conn + conn.next_upload = conn + self.try_send(True) + else: + conn.next_upload = self.last.next_upload + self.last.next_upload = conn + self.last = conn + + def increase_offset(self, bytes): + self.offset_amount += bytes + + def try_send(self, check_time = False): + t = bttime() + cur = self.last.next_upload + + self.offset_amount -= (t - self.lasttime) * self.upload_rate + self.offset_amount = max(self.offset_amount, -1 * self.upload_rate) + self.lasttime = t + + for ctx in self.ctxs: + if ctx.rate == 0: + ctx.offset_amount = 0 + if ctx.lasttime != t: + ctx.offset_amount -=(t - ctx.lasttime) * ctx.rate + ctx.lasttime = t + if ctx.check_time: + ctx.offset_amount = max(ctx.offset_amount, 0) + + min_offset = reduce(minctx, self.ctxs) + ctx = cur.encoder.context.rlgroup + while (self.offset_amount <= 0 and min_offset.offset_amount <= 0) or self.upload_rate == 0: + if ctx.offset_amount <= 0: + try: + bytes = cur.send_partial(self.unitsize) + except KeyboardInterrupt: + raise + except Exception, e: + cur.encoder.context.rlgroup.got_exception(e) + cur = self.last.next_upload + bytes = 0 + + if self.upload_rate > 0: + self.offset_amount += bytes + if ctx.rate > 0: + ctx.offset_amount += bytes + ctx.count += bytes + + if bytes == 0 or not cur.connection.is_flushed(): + if self.last is cur: + self.last = None + cur.next_upload = None + self.ctx_counts = {} + self.ctxs = [] + break + else: + self.last.next_upload = cur.next_upload + cur.next_upload = None + old = ctx + cur = self.last.next_upload + ctx = cur.encoder.context.rlgroup + self.ctx_counts[old] -= 1 + if self.ctx_counts[old] == 0: + del(self.ctx_counts[old]) + self.ctxs.remove(old) + if min_offset == old: + min_offset = reduce(minctx, self.ctxs) + else: + self.last = cur + cur = cur.next_upload + ctx = cur.encoder.context.rlgroup + min_offset = reduce(minctx, self.ctxs) + else: + self.last = cur + cur = self.last.next_upload + ctx = cur.encoder.context.rlgroup + else: + myDelay = minCtxDelay = 0 + if self.upload_rate > 0: + myDelay = self.offset_amount / self.upload_rate + if min_offset.rate > 0: + minCtxDelay = min_offset.offset_amount / min_offset.rate + delay = max(myDelay, minCtxDelay) + self.sched(self.try_send, delay) + + + def clean_closed(self): + if self.last is None: + return + orig = self.last + if self.last.closed: + self.last = Dummy(self.last.next_upload) + self.last.encoder = orig.encoder + c = self.last + while True: + if c.next_upload is orig: + c.next_upload = self.last + break + if c.next_upload.closed: + o = c.next_upload + c.next_upload = Dummy(c.next_upload.next_upload) + c.next_upload.encoder = o.encoder + c = c.next_upload + diff --git a/BitTorrent/RateMeasure.py b/BitTorrent/RateMeasure.py new file mode 100755 index 0000000..b609330 --- /dev/null +++ b/BitTorrent/RateMeasure.py @@ -0,0 +1,63 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from BitTorrent.platform import bttime + + +class RateMeasure(object): + + def __init__(self, left): + self.start = None + self.last = None + self.rate = 0 + self.remaining = None + self.left = left + self.broke = False + self.got_anything = False + + def data_came_in(self, amount): + if not self.got_anything: + self.got_anything = True + self.start = bttime() - 2 + self.last = self.start + self.left -= amount + return + self.update(bttime(), amount) + + def data_rejected(self, amount): + self.left += amount + + def get_time_left(self): + if not self.got_anything: + return None + t = bttime() + if t - self.last > 15: + self.update(t, 0) + return self.remaining + + def get_size_left(self): + return self.left + + def update(self, t, amount): + self.left -= amount + try: + self.rate = ((self.rate * (self.last - self.start)) + amount) / (t - self.start) + self.last = t + self.remaining = self.left / self.rate + if self.start < self.last - self.remaining: + self.start = self.last - self.remaining + except ZeroDivisionError: + self.remaining = None + if self.broke and self.last - self.start < 20: + self.start = self.last - 20 + if self.last - self.start > 20: + self.broke = True diff --git a/BitTorrent/RawServer.py b/BitTorrent/RawServer.py new file mode 100755 index 0000000..5e37bbd --- /dev/null +++ b/BitTorrent/RawServer.py @@ -0,0 +1,472 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen, Uoti Urpala + +import os +import sys +import socket +import signal +import struct +import thread +from bisect import insort +from cStringIO import StringIO +from traceback import print_exc +from errno import EWOULDBLOCK, ENOBUFS + +from BitTorrent.platform import bttime +from BitTorrent import WARNING, CRITICAL, FAQ_URL +from BitTorrent.defer import Deferred + +try: + from select import poll, error, POLLIN, POLLOUT, POLLERR, POLLHUP + timemult = 1000 +except ImportError: + from BitTorrent.selectpoll import poll, error, POLLIN, POLLOUT, POLLERR, POLLHUP + timemult = 1 + +NOLINGER = struct.pack('ii', 1, 0) + + +class Handler(object): + + # there is only a semantic difference between "made" and "started". + # I prefer "started" + def connection_started(self, s): + self.connection_made(s) + def connection_made(self, s): + pass + + def connection_lost(self, s): + pass + + # Maybe connection_lost should just have a default 'None' exception parameter + def connection_failed(self, addr, exception): + pass + + def connection_flushed(self, s): + pass + def data_came_in(self, addr, datagram): + pass + + +class SingleSocket(object): + + def __init__(self, raw_server, sock, handler, context, ip=None): + self.raw_server = raw_server + self.socket = sock + self.handler = handler + self.buffer = [] + self.last_hit = bttime() + self.fileno = sock.fileno() + self.connected = False + self.context = context + self.port = None + + if ip is not None: + self.ip = ip + else: + try: + peername = self.socket.getpeername() + except socket.error: + self.ip = 'unknown' + else: + try: + self.ip, self.port = peername + except: + assert isinstance(peername, basestring) + self.ip = peername # UNIX socket, not really ip + + def close(self): + sock = self.socket + self.socket = None + self.buffer = [] + del self.raw_server.single_sockets[self.fileno] + self.raw_server.poll.unregister(sock) + self.handler = None + if self.raw_server.config['close_with_rst']: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, NOLINGER) + sock.close() + + def shutdown(self, val): + self.socket.shutdown(val) + + def is_flushed(self): + return len(self.buffer) == 0 + + def write(self, s): + assert self.socket is not None + self.buffer.append(s) + if len(self.buffer) == 1: + self.try_write() + + def try_write(self): + if self.connected: + try: + while self.buffer != []: + amount = self.socket.send(self.buffer[0]) + if amount != len(self.buffer[0]): + if amount != 0: + self.buffer[0] = self.buffer[0][amount:] + break + del self.buffer[0] + except socket.error, e: + code, msg = e + if code != EWOULDBLOCK: + self.raw_server.dead_from_write.append(self) + return + if self.buffer == []: + self.raw_server.poll.register(self.socket, POLLIN) + else: + self.raw_server.poll.register(self.socket, POLLIN | POLLOUT) + + +def default_error_handler(level, message): + print message + +class RawServer(object): + + def __init__(self, doneflag, config, noisy=True, + errorfunc=default_error_handler, tos=0): + self.config = config + self.tos = tos + self.poll = poll() + # {socket: SingleSocket} + self.single_sockets = {} + self.udp_sockets = {} + self.dead_from_write = [] + self.doneflag = doneflag + self.noisy = noisy + self.errorfunc = errorfunc + self.funcs = [] + self.externally_added_tasks = [] + self.listening_handlers = {} + self.serversockets = {} + self.live_contexts = {None : True} + self.ident = thread.get_ident() + self.to_start = [] + self.add_task(self.scan_for_timeouts, config['timeout_check_interval']) + if sys.platform.startswith('win'): + # Windows doesn't support pipes with select(). Just prevent sleeps + # longer than a second instead of proper wakeup for now. + self.wakeupfds = (None, None) + self._wakeup() + else: + self.wakeupfds = os.pipe() + self.poll.register(self.wakeupfds[0], POLLIN) + + def _wakeup(self): + self.add_task(self._wakeup, 1) + + def add_context(self, context): + self.live_contexts[context] = True + + def remove_context(self, context): + del self.live_contexts[context] + self.funcs = [x for x in self.funcs if x[3] != context] + + def add_task(self, func, delay, args=(), context=None): + assert thread.get_ident() == self.ident + assert type(args) == list or type(args) == tuple + if context in self.live_contexts: + insort(self.funcs, (bttime() + delay, func, args, context)) + + def external_add_task(self, func, delay, args=(), context=None): + assert type(args) == list or type(args) == tuple + self.externally_added_tasks.append((func, delay, args, context)) + # Wake up the RawServer thread in case it's sleeping in poll() + if self.wakeupfds[1] is not None: + os.write(self.wakeupfds[1], 'X') + + def scan_for_timeouts(self): + self.add_task(self.scan_for_timeouts, + self.config['timeout_check_interval']) + t = bttime() - self.config['socket_timeout'] + tokill = [] + for s in [s for s in self.single_sockets.values() if s not in self.udp_sockets.keys()]: + if s.last_hit < t: + tokill.append(s) + for k in tokill: + if k.socket is not None: + self._close_socket(k) + + def create_unixserversocket(filename): + server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + server.setblocking(0) + server.bind(filename) + server.listen(5) + return server + create_unixserversocket = staticmethod(create_unixserversocket) + + def create_serversocket(port, bind='', reuse=False, tos=0): + server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + if reuse and os.name != 'nt': + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.setblocking(0) + if tos != 0: + try: + server.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, tos) + except: + pass + server.bind((bind, port)) + server.listen(5) + return server + create_serversocket = staticmethod(create_serversocket) + + def create_udpsocket(port, bind='', reuse=False, tos=0): + server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + if reuse and os.name != 'nt': + server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + server.setblocking(0) + if tos != 0: + try: + server.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, tos) + except: + pass + server.bind((bind, port)) + return server + create_udpsocket = staticmethod(create_udpsocket) + + def start_listening(self, serversocket, handler, context=None): + self.listening_handlers[serversocket.fileno()] = (handler, context) + self.serversockets[serversocket.fileno()] = serversocket + self.poll.register(serversocket, POLLIN) + + def start_listening_udp(self, serversocket, handler, context=None): + self.listening_handlers[serversocket.fileno()] = (handler, context) + nss = SingleSocket(self, serversocket, handler, context) + self.single_sockets[serversocket.fileno()] = nss + self.udp_sockets[nss] = 1 + self.poll.register(serversocket, POLLIN) + + def stop_listening(self, serversocket): + del self.listening_handlers[serversocket.fileno()] + del self.serversockets[serversocket.fileno()] + self.poll.unregister(serversocket) + + def stop_listening_udp(self, serversocket): + del self.listening_handlers[serversocket.fileno()] + del self.single_sockets[serversocket.fileno()] + l = [s for s in self.udp_sockets.keys() if s.socket == serversocket] + del self.udp_sockets[l[0]] + self.poll.unregister(serversocket) + + def start_connection(self, dns, handler=None, context=None, do_bind=True): + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.setblocking(0) + bindaddr = do_bind and self.config['bind'] + if bindaddr: + sock.bind((bindaddr, 0)) + if self.tos != 0: + try: + sock.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, self.tos) + except: + pass + try: + sock.connect_ex(dns) + except socket.error: + sock.close() + raise + except Exception, e: + sock.close() + raise socket.error(str(e)) + self.poll.register(sock, POLLIN) + s = SingleSocket(self, sock, handler, context, dns[0]) + self.single_sockets[sock.fileno()] = s + return s + + def async_start_connection(self, dns, handler=None, context=None, do_bind=True): + self.to_start.insert(0, (dns, handler, context, do_bind)) + self._start_connection() + + def _start_connection(self): + dns, handler, context, do_bind = self.to_start.pop() + try: + s = self.start_connection(dns, handler, context, do_bind) + except Exception, e: + handler.connection_failed(dns, e) + else: + handler.connection_started(s) + + def wrap_socket(self, sock, handler, context=None, ip=None): + sock.setblocking(0) + self.poll.register(sock, POLLIN) + s = SingleSocket(self, sock, handler, context, ip) + self.single_sockets[sock.fileno()] = s + return s + + # must be called from the main thread + def install_sigint_handler(self): + signal.signal(signal.SIGINT, self._handler) + + def _handler(self, signum, frame): + self.external_add_task(self.doneflag.set, 0) + # Allow pressing ctrl-c multiple times to raise KeyboardInterrupt, + # in case the program is in an infinite loop + signal.signal(signal.SIGINT, signal.default_int_handler) + + def _handle_events(self, events): + for sock, event in events: + if sock in self.serversockets: + s = self.serversockets[sock] + if event & (POLLHUP | POLLERR) != 0: + self.poll.unregister(s) + s.close() + self.errorfunc(CRITICAL, _("lost server socket")) + else: + handler, context = self.listening_handlers[sock] + try: + newsock, addr = s.accept() + except socket.error, e: + continue + try: + newsock.setblocking(0) + nss = SingleSocket(self, newsock, handler, context) + self.single_sockets[newsock.fileno()] = nss + self.poll.register(newsock, POLLIN) + self._make_wrapped_call(handler. \ + connection_made, (nss,), context=context) + except socket.error, e: + self.errorfunc(WARNING, + _("Error handling accepted connection: ") + + str(e)) + else: + s = self.single_sockets.get(sock) + if s is None: + if sock == self.wakeupfds[0]: + # Another thread wrote this just to wake us up. + os.read(sock, 1) + continue + s.connected = True + if event & POLLERR: + self._close_socket(s) + continue + if event & (POLLIN | POLLHUP): + s.last_hit = bttime() + try: + data, addr = s.socket.recvfrom(100000) + except socket.error, e: + code, msg = e + if code != EWOULDBLOCK: + self._close_socket(s) + continue + if data == '' and not self.udp_sockets.has_key(s): + self._close_socket(s) + else: + if not self.udp_sockets.has_key(s): + self._make_wrapped_call(s.handler.data_came_in, + (s, data), s) + else: + self._make_wrapped_call(s.handler.data_came_in, + (addr, data), s) + + # data_came_in could have closed the socket (s.socket = None) + if event & POLLOUT and s.socket is not None: + s.try_write() + if s.is_flushed(): + self._make_wrapped_call(s.handler.connection_flushed, + (s,), s) + + def _pop_externally_added(self): + while self.externally_added_tasks: + task = self.externally_added_tasks.pop(0) + self.add_task(*task) + + def listen_forever(self): + ret = 0 + self.ident = thread.get_ident() + while not self.doneflag.isSet() and not ret: + ret = self.listen_once() + + def listen_once(self, period=1e9): + try: + self._pop_externally_added() + if self.funcs: + period = self.funcs[0][0] - bttime() + if period < 0: + period = 0 + events = self.poll.poll(period * timemult) + if self.doneflag.isSet(): + return 0 + while self.funcs and self.funcs[0][0] <= bttime(): + garbage, func, args, context = self.funcs.pop(0) + self._make_wrapped_call(func, args, context=context) + self._close_dead() + self._handle_events(events) + if self.doneflag.isSet(): + return 0 + self._close_dead() + except error, e: + if self.doneflag.isSet(): + return 0 + # I can't find a coherent explanation for what the behavior + # should be here, and people report conflicting behavior, + # so I'll just try all the possibilities + try: + code, msg, desc = e + except: + try: + code, msg = e + except: + code = e + if code == ENOBUFS: + # log the traceback so we can see where the exception is coming from + print_exc(file = sys.stderr) + self.errorfunc(CRITICAL, + _("Have to exit due to the TCP stack flaking " + "out. Please see the FAQ at %s") % FAQ_URL) + return -1 + #self.errorfunc(CRITICAL, str(e)) + except KeyboardInterrupt: + print_exc() + return -1 + except: + data = StringIO() + print_exc(file=data) + self.errorfunc(CRITICAL, data.getvalue()) + return 0 + + def _make_wrapped_call(self, function, args, socket=None, context=None): + try: + function(*args) + except KeyboardInterrupt: + raise + except Exception, e: # hopefully nothing raises strings + # Incoming sockets can be assigned to a particular torrent during + # a data_came_in call, and it's possible (though not likely) that + # there could be a torrent-specific exception during the same call. + # Therefore read the context after the call. + if socket is not None: + context = socket.context + if self.noisy and context is None: + data = StringIO() + print_exc(file=data) + self.errorfunc(CRITICAL, data.getvalue()) + if context is not None: + context.got_exception(e) + + def _close_dead(self): + while len(self.dead_from_write) > 0: + old = self.dead_from_write + self.dead_from_write = [] + for s in old: + if s.socket is not None: + self._close_socket(s) + + def _close_socket(self, s): + sock = s.socket.fileno() + if self.config['close_with_rst']: + s.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, NOLINGER) + s.socket.close() + self.poll.unregister(sock) + del self.single_sockets[sock] + s.socket = None + self._make_wrapped_call(s.handler.connection_lost, (s,), s) + s.handler = None diff --git a/BitTorrent/RawServer_magic.py b/BitTorrent/RawServer_magic.py new file mode 100755 index 0000000..c918772 --- /dev/null +++ b/BitTorrent/RawServer_magic.py @@ -0,0 +1,63 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Greg Hazel + +class BaseMagic: + base = None + too_late = False + +magic = BaseMagic() + +from BitTorrent import BTFailure + +try: + import RawServer_twisted + magic.base = RawServer_twisted.RawServer + Handler = RawServer_twisted.Handler +except ImportError: + import RawServer + magic.base = RawServer.RawServer + Handler = RawServer.Handler + +def switch_rawserver(choice): + if magic.too_late: + raise BTFailure(_("Too late to switch RawServer backends, %s has already been used.") % str(magic.base)) + + if choice.lower() == "twisted": + import RawServer_twisted + magic.base = RawServer_twisted.RawServer + else: + import RawServer + magic.base = RawServer.RawServer + +class _RawServerMetaclass: + def __init__(self, *args): + pass + + def __getattr__(self, name): + magic.too_late = True + try: + return getattr(magic.base, name) + except: + raise AttributeError, name + +class RawServer: + __metaclass__ = _RawServerMetaclass + def __init__(self, *args, **kwargs): + magic.too_late = True + self.instance = magic.base(*args, **kwargs) + + def __getattr__(self, name): + try: + return getattr(self.instance, name) + except: + raise AttributeError, name + diff --git a/BitTorrent/RawServer_twisted.py b/BitTorrent/RawServer_twisted.py new file mode 100755 index 0000000..68bfd9a --- /dev/null +++ b/BitTorrent/RawServer_twisted.py @@ -0,0 +1,621 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Greg Hazel + +import os +import sys +import socket +import signal +import struct +import thread +from cStringIO import StringIO +from traceback import print_exc, print_stack + +from BitTorrent import BTFailure, WARNING, CRITICAL, FAQ_URL + +noSignals = True + +if os.name == 'nt': + try: + from twisted.internet import iocpreactor + iocpreactor.proactor.install() + noSignals = False + except: + # just as limited (if not more) as select, and also (supposedly) buggy + #try: + # from twisted.internet import win32eventreactor + # win32eventreactor.install() + #except: + # pass + pass +else: + try: + from twisted.internet import kqreactor + kqreactor.install() + except: + try: + from twisted.internet import pollreactor + pollreactor.install() + except: + pass + +#the default reactor is select-based, and will be install()ed if another has not +from twisted.internet import reactor, task, error + +import twisted.copyright +if int(twisted.copyright.version.split('.')[0]) < 2: + raise ImportError("RawServer_twisted requires twisted 2.0.0 or greater") + +from twisted.internet.protocol import DatagramProtocol, Protocol, Factory, ClientFactory +from twisted.protocols.policies import TimeoutMixin + +NOLINGER = struct.pack('ii', 1, 0) + +class Handler(object): + + # there is only a semantic difference between "made" and "started". + # I prefer "started" + def connection_started(self, s): + self.connection_made(s) + def connection_made(self, s): + pass + + def connection_lost(self, s): + pass + + # Maybe connection_lost should just have a default 'None' exception parameter + def connection_failed(self, addr, exception): + pass + + def connection_flushed(self, s): + pass + def data_came_in(self, addr, datagram): + pass + +class ConnectionWrapper(object): + def __init__(self, rawserver, handler, context, tos=0): + self.dying = 0 + self.ip = None + self.port = None + self.transport = None + self.reset_timeout = None + + self.post_init(rawserver, handler, context) + + self.tos = tos + + self.buffer = OutputBuffer(self) + + def post_init(self, rawserver, handler, context): + self.rawserver = rawserver + self.handler = handler + self.context = context + if self.rawserver: + self.rawserver.single_sockets[self] = self + + def get_socket(self): + s = None + try: + s = self.transport.getHandle() + except: + try: + # iocpreactor doesn't implement ISystemHandle like it should + s = self.transport.socket + except: + pass + return s + + def attach_transport(self, transport, reset_timeout): + self.transport = transport + self.reset_timeout = reset_timeout + + try: + address = self.transport.getPeer() + except: + try: + # udp, for example + address = self.transport.getHost() + except: + if not self.transport.__dict__.has_key("state"): + self.transport.state = "NO STATE!" + sys.stderr.write("UNKNOWN HOST/PEER: " + str(self.transport) + ":" + str(self.transport.state)+ ":" + str(self.handler) + "\n") + print_stack() + # fallback incase the unknown happens, + # there's no use raising an exception + address = ("unknown", -1) + pass + + try: + self.ip = address.host + self.port = address.port + except: + #unix sockets, for example + pass + + if self.tos != 0: + s = self.get_socket() + + try: + s.setsockopt(socket.IPPROTO_IP, socket.IP_TOS, self.tos) + except: + pass + + def sendto(self, packet, flags, addr): + # all this can go away once we pin down the bug + if not hasattr(self.transport, "listening"): + self.rawserver.errorfunc(WARNING, "UDP port never setup properly when asked to write") + elif not self.transport.listening: + self.rawserver.errorfunc(WARNING, "UDP port cleaned up already when asked to write") + + ret = None + try: + ret = self.transport.write(packet, addr) + except Exception, e: + self.rawserver.errorfunc(WARNING, "UDP sendto failed: %s" % str(e)) + + return ret + + def write(self, b): + self.buffer.add(b) + + def _flushed(self): + s = self + #why do you tease me so? + if s.handler is not None: + #calling flushed from the write is bad form + self.rawserver.add_task(s.handler.connection_flushed, 0, (s,)) + + def is_flushed(self): + return self.buffer.is_flushed() + + def shutdown(self, how): + if how == socket.SHUT_WR: + self.transport.loseWriteConnection() + self.buffer.stopWriting() + elif how == socket.SHUT_RD: + self.transport.stopListening() + else: + self.close() + + def close(self): + self.buffer.stopWriting() + + # opt for no "connection_lost" callback since we know that + self.dying = 1 + + if self.rawserver.config['close_with_rst']: + try: + s = self.get_socket() + s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, NOLINGER) + except: + pass + + if self.rawserver.udp_sockets.has_key(self): + # udp connections should only call stopListening + self.transport.stopListening() + else: + self.transport.loseConnection() + + +class OutputBuffer(object): + + def __init__(self, connection): + self.connection = connection + self.consumer = None + self.buffer = StringIO() + + def is_flushed(self): + return (self.buffer.tell() == 0) + + def add(self, b): + # sometimes we get strings, sometimes we get buffers. ugg. + if (isinstance(b, buffer)): + b = str(b) + self.buffer.write(b) + + if self.consumer is None: + self.beginWriting() + + def beginWriting(self): + self.stopWriting() + self.consumer = self.connection.transport + self.consumer.registerProducer(self, False) + + def stopWriting(self): + if self.consumer is not None: + self.consumer.unregisterProducer() + self.consumer = None + + def resumeProducing(self): + if self.consumer is not None: + if self.buffer.tell() > 0: + self.consumer.write(self.buffer.getvalue()) + self.buffer.seek(0) + self.buffer.truncate(0) + self.connection._flushed() + else: + self.stopWriting() + + + def pauseProducing(self): + pass + + def stopProducing(self): + pass + +class CallbackConnection(object): + + def attachTransport(self, transport, connection, *args): + s = connection + if s is None: + s = ConnectionWrapper(*args) + + s.attach_transport(transport, self.optionalResetTimeout) + self.connection = s + + def connectionMade(self): + s = self.connection + s.handler.connection_started(s) + self.optionalResetTimeout() + + def connectionLost(self, reason): + reactor.callLater(0, self.post_connectionLost, reason) + + #twisted api inconsistancy workaround + #sometimes connectionLost is called (not fired) from inside write() + def post_connectionLost(self, reason): + #hack to try and dig up the connection if one was ever made + if not self.__dict__.has_key("connection"): + self.connection = self.factory.connection + if self.connection is not None: + self.factory.rawserver._remove_socket(self.connection) + + def dataReceived(self, data): + self.optionalResetTimeout() + + s = self.connection + s.rawserver._make_wrapped_call(s.handler.data_came_in, + (s, data), s) + + def datagramReceived(self, data, (host, port)): + s = self.connection + s.rawserver._make_wrapped_call(s.handler.data_came_in, + ((host, port), data), s) + + def connectionRefused(self): + s = self.connection + dns = (s.ip, s.port) + reason = "connection refused" + + if not s.dying: + # this might not work - reason is not an exception + s.handler.connection_failed(dns, reason) + + #so we don't get failed then closed + s.dying = 1 + + s.rawserver._remove_socket(s) + + def optionalResetTimeout(self): + if self.can_timeout: + self.resetTimeout() + +class CallbackProtocol(CallbackConnection, TimeoutMixin, Protocol): + + def makeConnection(self, transport): + self.can_timeout = 1 + self.setTimeout(self.factory.rawserver.config['socket_timeout']) + self.attachTransport(transport, self.factory.connection, *self.factory.connection_args) + Protocol.makeConnection(self, transport) + +class CallbackDatagramProtocol(CallbackConnection, DatagramProtocol): + + def startProtocol(self): + self.can_timeout = 0 + self.attachTransport(self.transport, self.connection, ()) + DatagramProtocol.startProtocol(self) + + def connectionRefused(self): + # we don't use these at all for udp, so skip the CallbackConnection + DatagramProtocol.connectionRefused(self) + +class OutgoingConnectionFactory(ClientFactory): + + def clientConnectionFailed(self, connector, reason): + peer = connector.getDestination() + dns = (peer.host, peer.port) + # opt-out + if not self.connection.dying: + # this might not work - reason is not an exception + self.connection.handler.connection_failed(dns, reason) + + #so we don't get failed then closed + self.connection.dying = 1 + + self.rawserver._remove_socket(self.connection) + +def UnimplementedWarning(msg): + #ok, I think people get the message + #print "UnimplementedWarning: " + str(msg) + pass + +#Encoder calls stop_listening(socket) then socket.close() +#to us they mean the same thing, so swallow the second call +class CloseSwallower: + def close(self): + pass + +#storage for socket creation requestions, and proxy once the connection is made +class SocketProxy(object): + def __init__(self, port, bind, reuse, tos, protocol): + self.port = port + self.bind = bind + self.reuse = reuse + self.tos = tos + self.protocol = protocol + self.connection = None + + def __getattr__(self, name): + try: + return getattr(self.connection, name) + except: + raise AttributeError, name + +def default_error_handler(level, message): + print message + +class RawServerMixin(object): + + def __init__(self, doneflag, config, noisy=True, + errorfunc=default_error_handler, tos=0): + self.doneflag = doneflag + self.noisy = noisy + self.errorfunc = errorfunc + self.config = config + self.tos = tos + self.ident = thread.get_ident() + + def _make_wrapped_call(self, function, args, wrapper=None, context=None): + try: + function(*args) + except KeyboardInterrupt: + raise + except Exception, e: # hopefully nothing raises strings + # Incoming sockets can be assigned to a particular torrent during + # a data_came_in call, and it's possible (though not likely) that + # there could be a torrent-specific exception during the same call. + # Therefore read the context after the call. + if wrapper is not None: + context = wrapper.context + if self.noisy and context is None: + data = StringIO() + print_exc(file=data) + data.seek(-1) + self.errorfunc(CRITICAL, data.read()) + if context is not None: + context.got_exception(e) + + # must be called from the main thread + def install_sigint_handler(self): + signal.signal(signal.SIGINT, self._handler) + + def _handler(self, signum, frame): + self.external_add_task(self.doneflag.set, 0) + # Allow pressing ctrl-c multiple times to raise KeyboardInterrupt, + # in case the program is in an infinite loop + signal.signal(signal.SIGINT, signal.default_int_handler) + +class RawServer(RawServerMixin): + + def __init__(self, doneflag, config, noisy=True, + errorfunc=default_error_handler, tos=0): + RawServerMixin.__init__(self, doneflag, config, noisy, errorfunc, tos) + + self.listening_handlers = {} + self.single_sockets = {} + self.udp_sockets = {} + self.live_contexts = {None : 1} + self.listened = 0 + + def add_context(self, context): + self.live_contexts[context] = 1 + + def remove_context(self, context): + del self.live_contexts[context] + + def autoprune(self, f, *a, **kw): + if self.live_contexts.has_key(kw['context']): + f(*a, **kw) + + def add_task(self, func, delay, args=(), context=None): + assert thread.get_ident() == self.ident + assert type(args) == list or type(args) == tuple + + #we're going to check again later anyway + #if self.live_contexts.has_key(context): + reactor.callLater(delay, self.autoprune, self._make_wrapped_call, + func, args, context=context) + + def external_add_task(self, func, delay, args=(), context=None): + assert type(args) == list or type(args) == tuple + reactor.callFromThread(self.add_task, func, delay, args, context) + + def create_unixserversocket(filename): + s = SocketProxy(0, filename, True, 0, 'tcp') + s.factory = Factory() + + if s.reuse == False: + UnimplementedWarning("You asked for reuse to be off when binding. Sorry, I can't do that.") + + listening_port = reactor.listenUNIX(s.bind, s.factory) + listening_port.listening = 1 + s.listening_port = listening_port + + return s + create_unixserversocket = staticmethod(create_unixserversocket) + + def create_serversocket(port, bind='', reuse=False, tos=0): + s = SocketProxy(port, bind, reuse, tos, 'tcp') + s.factory = Factory() + + if s.reuse == False: + UnimplementedWarning("You asked for reuse to be off when binding. Sorry, I can't do that.") + + try: + listening_port = reactor.listenTCP(s.port, s.factory, interface=s.bind) + except error.CannotListenError, e: + if e[0] != 0: + raise e.socketError + else: + raise + listening_port.listening = 1 + s.listening_port = listening_port + + return s + create_serversocket = staticmethod(create_serversocket) + + def create_udpsocket(port, bind='', reuse=False, tos=0): + s = SocketProxy(port, bind, reuse, tos, 'udp') + s.protocol = CallbackDatagramProtocol() + c = ConnectionWrapper(None, None, None, tos) + s.connection = c + s.protocol.connection = c + + if s.reuse == False: + UnimplementedWarning("You asked for reuse to be off when binding. Sorry, I can't do that.") + + try: + listening_port = reactor.listenUDP(s.port, s.protocol, interface=s.bind) + except error.CannotListenError, e: + raise e.socketError + listening_port.listening = 1 + s.listening_port = listening_port + + return s + create_udpsocket = staticmethod(create_udpsocket) + + def start_listening(self, serversocket, handler, context=None): + s = serversocket + s.factory.rawserver = self + s.factory.protocol = CallbackProtocol + s.factory.connection = None + s.factory.connection_args = (self, handler, context, serversocket.tos) + + if not s.listening_port.listening: + s.listening_port.startListening() + s.listening_port.listening = 1 + + self.listening_handlers[s] = s.listening_port + + #provides a harmless close() method + s.connection = CloseSwallower() + + def start_listening_udp(self, serversocket, handler, context=None): + s = serversocket + + c = s.connection + c.post_init(self, handler, context) + + if not s.listening_port.listening: + s.listening_port.startListening() + s.listening_port.listening = 1 + + self.listening_handlers[serversocket] = s.listening_port + + self.udp_sockets[c] = c + + def stop_listening(self, serversocket): + listening_port = self.listening_handlers[serversocket] + try: + listening_port.stopListening() + listening_port.listening = 0 + except error.NotListeningError: + pass + del self.listening_handlers[serversocket] + + def stop_listening_udp(self, serversocket): + listening_port = self.listening_handlers[serversocket] + listening_port.stopListening() + del self.listening_handlers[serversocket] + del self.udp_sockets[serversocket.connection] + del self.single_sockets[serversocket.connection] + + def start_connection(self, dns, handler, context=None, do_bind=True): + addr = dns[0] + port = int(dns[1]) + + bindaddr = None + if do_bind: + bindaddr = self.config['bind'] + if bindaddr and len(bindaddr) >= 0: + bindaddr = (bindaddr, 0) + else: + bindaddr = None + + factory = OutgoingConnectionFactory() + factory.protocol = CallbackProtocol + factory.rawserver = self + + c = ConnectionWrapper(self, handler, context, self.tos) + + factory.connection = c + factory.connection_args = () + + connector = reactor.connectTCP(addr, port, factory, bindAddress=bindaddr) + + self.single_sockets[c] = c + return c + + def async_start_connection(self, dns, handler, context=None, do_bind=True): + self.start_connection(dns, handler, context, do_bind) + + def wrap_socket(self, sock, handler, context=None, ip=None): + raise Unimplemented("wrap_socket") + + def listen_forever(self): + self.ident = thread.get_ident() + if self.listened: + UnimplementedWarning("listen_forever() should only be called once per reactor.") + self.listened = 1 + + l = task.LoopingCall(self.stop) + l.start(1, now = False) + + if noSignals: + reactor.run(installSignalHandlers=False) + else: + reactor.run() + + def listen_once(self, period=1e9): + UnimplementedWarning("listen_once() Might not return until there is activity, and might not process the event you want. Use listen_forever().") + reactor.iterate(period) + + def stop(self): + if (self.doneflag.isSet()): + + for connection in self.single_sockets.values(): + try: + #I think this still sends all the data + connection.close() + except: + pass + + reactor.suggestThreadPoolSize(0) + reactor.stop() + + def _remove_socket(self, s): + # opt-out + if not s.dying: + self._make_wrapped_call(s.handler.connection_lost, (s,), s) + s.handler = None + + del self.single_sockets[s] + diff --git a/BitTorrent/Rerequester.py b/BitTorrent/Rerequester.py new file mode 100755 index 0000000..afddde1 --- /dev/null +++ b/BitTorrent/Rerequester.py @@ -0,0 +1,291 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen, Uoti Urpala + +from threading import Thread +from socket import error, gethostbyname +from random import random, randrange +from binascii import b2a_hex + +from BitTorrent import version +from BitTorrent.platform import bttime +from BitTorrent.zurllib import urlopen, quote, Request +from BitTorrent.btformats import check_peers +from BitTorrent.bencode import bencode, bdecode +from BitTorrent import BTFailure, INFO, WARNING, ERROR, CRITICAL + + +class Rerequester(object): + + def __init__(self, url, config, sched, howmany, connect, externalsched, + amount_left, up, down, port, myid, infohash, errorfunc, doneflag, + upratefunc, downratefunc, ever_got_incoming, diefunc, sfunc): + self.baseurl = url + self.infohash = infohash + self.peerid = None + self.wanted_peerid = myid + self.port = port + self.url = None + self.config = config + self.last = None + self.trackerid = None + self.announce_interval = 30 * 60 + self.sched = sched + self.howmany = howmany + self.connect = connect + self.externalsched = externalsched + self.amount_left = amount_left + self.up = up + self.down = down + self.errorfunc = errorfunc + self.doneflag = doneflag + self.upratefunc = upratefunc + self.downratefunc = downratefunc + self.ever_got_incoming = ever_got_incoming + self.diefunc = diefunc + self.successfunc = sfunc + self.finish = False + self.current_started = None + self.fail_wait = None + self.last_time = None + self.previous_down = 0 + self.previous_up = 0 + self.tracker_num_peers = None + self.tracker_num_seeds = None + + def _makeurl(self, peerid, port): + return ('%s?info_hash=%s&peer_id=%s&port=%s&key=%s' % + (self.baseurl, quote(self.infohash), quote(peerid), str(port), + b2a_hex(''.join([chr(randrange(256)) for i in xrange(4)])))) + + def change_port(self, peerid, port): + self.wanted_peerid = peerid + self.port = port + self.last = None + self.trackerid = None + self._check() + + def begin(self): + if self.sched: + self.sched(self.begin, 60) + self._check() + + def announce_finish(self): + self.finish = True + self._check() + + def announce_stop(self): + self._announce(2) + + def _check(self): + if self.current_started is not None: + if self.current_started <= bttime() - 58: + self.errorfunc(WARNING, + _("Tracker announce still not complete " + "%d seconds after starting it") % + int(bttime() - self.current_started)) + return + if self.peerid is None: + self.peerid = self.wanted_peerid + self.url = self._makeurl(self.peerid, self.port) + self._announce(0) + return + if self.peerid != self.wanted_peerid: + self._announce(2) + self.peerid = None + self.previous_up = self.up() + self.previous_down = self.down() + return + if self.finish: + self.finish = False + self._announce(1) + return + if self.fail_wait is not None: + if self.last_time + self.fail_wait <= bttime(): + self._announce() + return + if self.last_time > bttime() - self.config['rerequest_interval']: + return + if self.ever_got_incoming(): + getmore = self.howmany() <= self.config['min_peers'] / 3 + else: + getmore = self.howmany() < self.config['min_peers'] + if getmore or bttime() - self.last_time > self.announce_interval: + self._announce() + + def _announce(self, event=None): + self.current_started = bttime() + s = ('%s&uploaded=%s&downloaded=%s&left=%s' % + (self.url, str(self.up() - self.previous_up), + str(self.down() - self.previous_down), str(self.amount_left()))) + if self.last is not None: + s += '&last=' + quote(str(self.last)) + if self.trackerid is not None: + s += '&trackerid=' + quote(str(self.trackerid)) + if self.howmany() >= self.config['max_initiate']: + s += '&numwant=0' + else: + s += '&compact=1' + if event is not None: + s += '&event=' + ['started', 'completed', 'stopped'][event] + Thread(target=self._rerequest, args=[s, self.peerid]).start() + + # Must destroy all references that could cause reference circles + def cleanup(self): + self.sched = None + self.howmany = None + self.connect = None + self.externalsched = lambda *args: None + self.amount_left = None + self.up = None + self.down = None + self.errorfunc = None + self.upratefunc = None + self.downratefunc = None + self.ever_got_incoming = None + self.diefunc = None + self.successfunc = None + + def _rerequest(self, url, peerid): + if self.config['ip']: + try: + url += '&ip=' + gethostbyname(self.config['ip']) + except Exception, e: + self.errorfunc(WARNING, _("Problem connecting to tracker, gethostbyname failed - ") + str(e)) + request = Request(url) + request.add_header('User-Agent', 'BitTorrent/' + version) + if self.config['tracker_proxy']: + request.set_proxy(self.config['tracker_proxy'], 'http') + try: + h = urlopen(request) + data = h.read() + h.close() + # urllib2 can raise various crap that doesn't have a common base + # exception class especially when proxies are used, at least + # ValueError and stuff from httplib + except Exception, e: + def f(r=_("Problem connecting to tracker - ") + str(e)): + self._postrequest(errormsg=r, peerid=peerid) + else: + def f(): + self._postrequest(data, peerid=peerid) + self.externalsched(f, 0) + + def _fail(self): + if self.fail_wait is None: + self.fail_wait = 50 + else: + self.fail_wait *= 1.4 + random() * .2 + self.fail_wait = min(self.fail_wait, + self.config['max_announce_retry_interval']) + + def _postrequest(self, data=None, errormsg=None, peerid=None): + self.current_started = None + self.last_time = bttime() + if errormsg is not None: + self.errorfunc(WARNING, errormsg) + self._fail() + return + try: + r = bdecode(data) + check_peers(r) + except BTFailure, e: + if data != '': + self.errorfunc(ERROR, _("bad data from tracker - ") + str(e)) + self._fail() + return + if type(r.get('complete')) in (int, long) and \ + type(r.get('incomplete')) in (int, long): + self.tracker_num_seeds = r['complete'] + self.tracker_num_peers = r['incomplete'] + else: + self.tracker_num_seeds = self.tracker_num_peers = None + if r.has_key('failure reason'): + if self.howmany() > 0: + self.errorfunc(ERROR, _("rejected by tracker - ") + + r['failure reason']) + else: + # sched shouldn't be strictly necessary + def die(): + self.diefunc(CRITICAL, + _("Aborting the torrent as it was rejected by " + "the tracker while not connected to any peers. ") + + _(" Message from the tracker: ") + r['failure reason']) + self.sched(die, 0) + self._fail() + else: + self.fail_wait = None + if r.has_key('warning message'): + self.errorfunc(ERROR, _("warning from tracker - ") + + r['warning message']) + self.announce_interval = r.get('interval', self.announce_interval) + self.config['rerequest_interval'] = r.get('min interval', + self.config['rerequest_interval']) + self.trackerid = r.get('tracker id', self.trackerid) + self.last = r.get('last') + p = r['peers'] + peers = [] + if type(p) == str: + for x in xrange(0, len(p), 6): + ip = '.'.join([str(ord(i)) for i in p[x:x+4]]) + port = (ord(p[x+4]) << 8) | ord(p[x+5]) + peers.append((ip, port, None)) + else: + for x in p: + peers.append((x['ip'], x['port'], x.get('peer id'))) + ps = len(peers) + self.howmany() + if ps < self.config['max_initiate']: + if self.doneflag.isSet(): + if r.get('num peers', 1000) - r.get('done peers', 0) > ps * 1.2: + self.last = None + else: + if r.get('num peers', 1000) > ps * 1.2: + self.last = None + for x in peers: + self.connect((x[0], x[1]), x[2]) + if peerid == self.wanted_peerid: + self.successfunc() + self._check() + +class DHTRerequester(Rerequester): + def __init__(self, config, sched, howmany, connect, externalsched, + amount_left, up, down, port, myid, infohash, errorfunc, doneflag, + upratefunc, downratefunc, ever_got_incoming, diefunc, sfunc, dht): + self.dht = dht + Rerequester.__init__(self, "http://localhost/announce", config, sched, howmany, connect, externalsched, + amount_left, up, down, port, myid, infohash, errorfunc, doneflag, + upratefunc, downratefunc, ever_got_incoming, diefunc, sfunc) + + def _announce(self, event=None): + self.current_started = bttime() + self._rerequest("", self.peerid) + + def _rerequest(self, url, peerid): + self.peers = "" + try: + self.dht.getPeersAndAnnounce(self.infohash, self.port, self._got_peers) + except Exception, e: + self._postrequest(errormsg="Trackerless lookup failed: " + str(e), peerid=self.wanted_peerid) + + def _got_peers(self, peers): + if not self.howmany: + return + if not peers: + self._postrequest(bencode({'peers':''}), peerid=self.wanted_peerid) + else: + self._postrequest(bencode({'peers':peers[0]}), peerid=None) + + def _announced_peers(self, nodes): + pass + + def announce_stop(self): + # don't do anything + pass diff --git a/BitTorrent/Storage.py b/BitTorrent/Storage.py new file mode 100755 index 0000000..823d04b --- /dev/null +++ b/BitTorrent/Storage.py @@ -0,0 +1,273 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +import os +from bisect import bisect_right +from array import array + +from BitTorrent.obsoletepythonsupport import * + +from BitTorrent import BTFailure + + +class FilePool(object): + + def __init__(self, max_files_open): + self.allfiles = {} + self.handlebuffer = None + self.handles = {} + self.whandles = {} + self.set_max_files_open(max_files_open) + + def close_all(self): + failures = {} + for filename, handle in self.handles.iteritems(): + try: + handle.close() + except Exception, e: + failures[self.allfiles[filename]] = e + self.handles.clear() + self.whandles.clear() + if self.handlebuffer is not None: + del self.handlebuffer[:] + for torrent, e in failures.iteritems(): + torrent.got_exception(e) + + def set_max_files_open(self, max_files_open): + if max_files_open <= 0: + max_files_open = 1e100 + self.max_files_open = max_files_open + self.close_all() + if len(self.allfiles) > self.max_files_open: + self.handlebuffer = [] + else: + self.handlebuffer = None + + def add_files(self, files, torrent): + for filename in files: + if filename in self.allfiles: + raise BTFailure(_("File %s belongs to another running torrent") + % filename) + for filename in files: + self.allfiles[filename] = torrent + if self.handlebuffer is None and \ + len(self.allfiles) > self.max_files_open: + self.handlebuffer = self.handles.keys() + + def remove_files(self, files): + for filename in files: + del self.allfiles[filename] + if self.handlebuffer is not None and \ + len(self.allfiles) <= self.max_files_open: + self.handlebuffer = None + + +# Make this a separate function because having this code in Storage.__init__() +# would make python print a SyntaxWarning (uses builtin 'file' before 'global') + +def bad_libc_workaround(): + global file + def file(name, mode = 'r', buffering = None): + return open(name, mode) + +class Storage(object): + + def __init__(self, config, filepool, files, check_only=False): + self.filepool = filepool + self.config = config + self.ranges = [] + self.myfiles = {} + self.tops = {} + self.undownloaded = {} + self.unallocated = {} + total = 0 + for filename, length in files: + self.unallocated[filename] = length + self.undownloaded[filename] = length + if length > 0: + self.ranges.append((total, total + length, filename)) + self.myfiles[filename] = None + total += length + if os.path.exists(filename): + if not os.path.isfile(filename): + raise BTFailure(_("File %s already exists, but is not a " + "regular file") % filename) + l = os.path.getsize(filename) + if l > length and not check_only: + h = file(filename, 'rb+') + h.truncate(length) + h.close() + l = length + self.tops[filename] = l + elif not check_only: + f = os.path.split(filename)[0] + if f != '' and not os.path.exists(f): + os.makedirs(f) + file(filename, 'wb').close() + self.begins = [i[0] for i in self.ranges] + self.total_length = total + if check_only: + return + self.handles = filepool.handles + self.whandles = filepool.whandles + + # Rather implement this as an ugly hack here than change all the + # individual calls. Affects all torrent instances using this module. + if config['bad_libc_workaround']: + bad_libc_workaround() + + def was_preallocated(self, pos, length): + for filename, begin, end in self._intervals(pos, length): + if self.tops.get(filename, 0) < end: + return False + return True + + def get_total_length(self): + return self.total_length + + def _intervals(self, pos, amount): + r = [] + stop = pos + amount + p = bisect_right(self.begins, pos) - 1 + while p < len(self.ranges) and self.ranges[p][0] < stop: + begin, end, filename = self.ranges[p] + r.append((filename, max(pos, begin) - begin, min(end, stop) - begin)) + p += 1 + return r + + def _get_file_handle(self, filename, for_write): + handlebuffer = self.filepool.handlebuffer + if filename in self.handles: + if for_write and filename not in self.whandles: + self.handles[filename].close() + self.handles[filename] = file(filename, 'rb+', 0) + self.whandles[filename] = None + if handlebuffer is not None and handlebuffer[-1] != filename: + handlebuffer.remove(filename) + handlebuffer.append(filename) + else: + if for_write: + self.handles[filename] = file(filename, 'rb+', 0) + self.whandles[filename] = None + else: + self.handles[filename] = file(filename, 'rb', 0) + if handlebuffer is not None: + if len(handlebuffer) >= self.filepool.max_files_open: + oldfile = handlebuffer.pop(0) + if oldfile in self.whandles: # .pop() in python 2.3 + del self.whandles[oldfile] + self.handles[oldfile].close() + del self.handles[oldfile] + handlebuffer.append(filename) + return self.handles[filename] + + def read(self, pos, amount): + r = [] + for filename, pos, end in self._intervals(pos, amount): + h = self._get_file_handle(filename, False) + h.seek(pos) + r.append(h.read(end - pos)) + r = ''.join(r) + if len(r) != amount: + raise BTFailure(_("Short read - something truncated files?")) + return r + + def write(self, pos, s): + # might raise an IOError + total = 0 + for filename, begin, end in self._intervals(pos, len(s)): + h = self._get_file_handle(filename, True) + h.seek(begin) + h.write(s[total: total + end - begin]) + total += end - begin + + def close(self): + error = None + for filename in self.handles.keys(): + if filename in self.myfiles: + try: + self.handles[filename].close() + except Exception, e: + error = e + del self.handles[filename] + if filename in self.whandles: + del self.whandles[filename] + handlebuffer = self.filepool.handlebuffer + if handlebuffer is not None: + handlebuffer = [f for f in handlebuffer if f not in self.myfiles] + self.filepool.handlebuffer = handlebuffer + if error is not None: + raise error + + def write_fastresume(self, resumefile, amount_done): + resumefile.write('BitTorrent resume state file, version 1\n') + resumefile.write(str(amount_done) + '\n') + for _, _, filename in self.ranges: + resumefile.write(str(os.path.getsize(filename)) + ' ' + + str(os.path.getmtime(filename)) + '\n') + + def check_fastresume(self, resumefile, return_filelist=False, + piece_size=None, numpieces=None, allfiles=None): + filenames = [name for _, _, name in self.ranges] + if resumefile is not None: + version = resumefile.readline() + if version != 'BitTorrent resume state file, version 1\n': + raise BTFailure(_("Unsupported fastresume file format, " + "maybe from another client version?")) + amount_done = int(resumefile.readline()) + else: + amount_done = size = mtime = 0 + for filename in filenames: + if resumefile is not None: + line = resumefile.readline() + size, mtime = line.split()[:2] # allow adding extra fields + size = int(size) + mtime = int(mtime) + if os.path.exists(filename): + fsize = os.path.getsize(filename) + else: + raise BTFailure(_("Another program appears to have moved, renamed, or deleted the file.")) + if fsize > 0 and mtime != os.path.getmtime(filename): + raise BTFailure(_("Another program appears to have modified the file.")) + if size != fsize: + raise BTFailure(_("Another program appears to have changed the file size.")) + if not return_filelist: + return amount_done + if resumefile is None: + return None + if numpieces < 32768: + typecode = 'h' + else: + typecode = 'l' + try: + r = array(typecode) + r.fromfile(resumefile, numpieces) + except Exception, e: + raise BTFailure(_("Couldn't read fastresume data: ") + str(e) + '.') + for i in range(numpieces): + if r[i] >= 0: + # last piece goes "past the end", doesn't matter + self.downloaded(r[i] * piece_size, piece_size) + if r[i] != -2: + self.allocated(i * piece_size, piece_size) + undl = self.undownloaded + unal = self.unallocated + return amount_done, [undl[x] for x in allfiles], \ + [not unal[x] for x in allfiles] + + def allocated(self, pos, length): + for filename, begin, end in self._intervals(pos, length): + self.unallocated[filename] -= end - begin + + def downloaded(self, pos, length): + for filename, begin, end in self._intervals(pos, length): + self.undownloaded[filename] -= end - begin diff --git a/BitTorrent/StorageWrapper.py b/BitTorrent/StorageWrapper.py new file mode 100755 index 0000000..ac14fdd --- /dev/null +++ b/BitTorrent/StorageWrapper.py @@ -0,0 +1,408 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from __future__ import division + +from sha import sha +from array import array +from binascii import b2a_hex + +from BitTorrent.bitfield import Bitfield +from BitTorrent import BTFailure, INFO, WARNING, ERROR, CRITICAL + +def toint(s): + return int(b2a_hex(s), 16) + +def tobinary(i): + return (chr(i >> 24) + chr((i >> 16) & 0xFF) + + chr((i >> 8) & 0xFF) + chr(i & 0xFF)) + +NO_PLACE = -1 + +ALLOCATED = -1 +UNALLOCATED = -2 +FASTRESUME_PARTIAL = -3 + +class StorageWrapper(object): + + def __init__(self, storage, config, hashes, piece_size, finished, + statusfunc, flag, data_flunked, infohash, errorfunc, resumefile): + self.numpieces = len(hashes) + self.storage = storage + self.config = config + check_hashes = config['check_hashes'] + self.hashes = hashes + self.piece_size = piece_size + self.data_flunked = data_flunked + self.errorfunc = errorfunc + self.total_length = storage.get_total_length() + self.amount_left = self.total_length + self.partial_mark = "BitTorrent - this part has not been "+\ + "downloaded yet."+infohash+\ + tobinary(config['download_slice_size']) + if self.total_length <= piece_size * (self.numpieces - 1): + raise BTFailure, _("bad data in responsefile - total too small") + if self.total_length > piece_size * self.numpieces: + raise BTFailure, _("bad data in responsefile - total too big") + self.finished = finished + self.numactive = array('H', [0] * self.numpieces) + self.inactive_requests = [1] * self.numpieces + self.amount_inactive = self.total_length + self.endgame = False + self.have = Bitfield(self.numpieces) + self.waschecked = Bitfield(self.numpieces) + if self.numpieces < 32768: + typecode = 'h' + else: + typecode = 'l' + self.places = array(typecode, [NO_PLACE] * self.numpieces) + if not check_hashes: + self.rplaces = array(typecode, range(self.numpieces)) + fastresume = True + else: + self.rplaces = self._load_fastresume(resumefile, typecode) + if self.rplaces is not None: + fastresume = True + else: + self.rplaces = array(typecode, [UNALLOCATED] * self.numpieces) + fastresume = False + self.holepos = 0 + self.stat_numfound = 0 + self.stat_numflunked = 0 + self.stat_numdownloaded = 0 + self.stat_active = {} + self.stat_new = {} + self.stat_dirty = {} + self.download_history = {} + self.failed_pieces = {} + + if self.numpieces == 0: + return + targets = {} + total = 0 + if not fastresume: + for i in xrange(self.numpieces): + if self._waspre(i): + self.rplaces[i] = ALLOCATED + total += 1 + else: + targets[hashes[i]] = i + if total and check_hashes: + statusfunc(_("checking existing file"), 0) + def markgot(piece, pos): + if self.have[piece]: + if piece != pos: + return + self.rplaces[self.places[pos]] = ALLOCATED + self.places[pos] = self.rplaces[pos] = pos + return + self.places[piece] = pos + self.rplaces[pos] = piece + self.have[piece] = True + self.amount_left -= self._piecelen(piece) + self.amount_inactive -= self._piecelen(piece) + self.inactive_requests[piece] = None + if not fastresume: + self.waschecked[piece] = True + self.stat_numfound += 1 + lastlen = self._piecelen(self.numpieces - 1) + partials = {} + for i in xrange(self.numpieces): + if not self._waspre(i): + if self.rplaces[i] != UNALLOCATED: + raise BTFailure(_("--check_hashes 0 or fastresume info " + "doesn't match file state (missing data)")) + continue + elif fastresume: + t = self.rplaces[i] + if t >= 0: + markgot(t, i) + continue + if t == UNALLOCATED: + raise BTFailure(_("Bad fastresume info (files contain more " + "data)")) + if t == ALLOCATED: + continue + if t!= FASTRESUME_PARTIAL: + raise BTFailure(_("Bad fastresume info (illegal value)")) + data = self.storage.read(self.piece_size * i, + self._piecelen(i)) + self._check_partial(i, partials, data) + self.rplaces[i] = ALLOCATED + else: + data = self.storage.read(piece_size * i, self._piecelen(i)) + sh = sha(buffer(data, 0, lastlen)) + sp = sh.digest() + sh.update(buffer(data, lastlen)) + s = sh.digest() + if s == hashes[i]: + markgot(i, i) + elif s in targets and self._piecelen(i) == self._piecelen(targets[s]): + markgot(targets[s], i) + elif not self.have[self.numpieces - 1] and sp == hashes[-1] and (i == self.numpieces - 1 or not self._waspre(self.numpieces - 1)): + markgot(self.numpieces - 1, i) + else: + self._check_partial(i, partials, data) + statusfunc(fractionDone = 1 - self.amount_left / + self.total_length) + if flag.isSet(): + return + self.amount_left_with_partials = self.amount_left + for piece in partials: + if self.places[piece] < 0: + pos = partials[piece][0] + self.places[piece] = pos + self.rplaces[pos] = piece + self._make_partial(piece, partials[piece][1]) + for i in xrange(self.numpieces): + if self.rplaces[i] != UNALLOCATED: + self.storage.allocated(piece_size * i, self._piecelen(i)) + if self.have[i]: + self.storage.downloaded(piece_size * i, self._piecelen(i)) + + def _waspre(self, piece): + return self.storage.was_preallocated(piece * self.piece_size, self._piecelen(piece)) + + def _piecelen(self, piece): + if piece < self.numpieces - 1: + return self.piece_size + else: + return self.total_length - piece * self.piece_size + + def _check_partial(self, pos, partials, data): + index = None + missing = False + marklen = len(self.partial_mark)+4 + for i in xrange(0, len(data) - marklen, + self.config['download_slice_size']): + if data[i:i+marklen-4] == self.partial_mark: + ind = toint(data[i+marklen-4:i+marklen]) + if index is None: + index = ind + parts = [] + if ind >= self.numpieces or ind != index: + return + parts.append(i) + else: + missing = True + if index is not None and missing: + i += self.config['download_slice_size'] + if i < len(data): + parts.append(i) + partials[index] = (pos, parts) + + def _make_partial(self, index, parts): + length = self._piecelen(index) + l = [] + self.inactive_requests[index] = l + x = 0 + self.amount_left_with_partials -= self._piecelen(index) + self.download_history[index] = {} + request_size = self.config['download_slice_size'] + for x in xrange(0, self._piecelen(index), request_size): + partlen = min(request_size, length - x) + if x in parts: + l.append((x, partlen)) + self.amount_left_with_partials += partlen + else: + self.amount_inactive -= partlen + self.download_history[index][x] = None + self.stat_dirty[index] = 1 + + def _initalloc(self, pos, piece): + assert self.rplaces[pos] < 0 + assert self.places[piece] == NO_PLACE + p = self.piece_size * pos + length = self._piecelen(pos) + if self.rplaces[pos] == UNALLOCATED: + self.storage.allocated(p, length) + self.places[piece] = pos + self.rplaces[pos] = piece + # "if self.rplaces[pos] != ALLOCATED:" to skip extra mark writes + mark = self.partial_mark + tobinary(piece) + mark += chr(0xff) * (self.config['download_slice_size'] - len(mark)) + mark *= (length - 1) // len(mark) + 1 + self.storage.write(p, buffer(mark, 0, length)) + + def _move_piece(self, oldpos, newpos): + assert self.rplaces[newpos] < 0 + assert self.rplaces[oldpos] >= 0 + data = self.storage.read(self.piece_size * oldpos, + self._piecelen(newpos)) + self.storage.write(self.piece_size * newpos, data) + if self.rplaces[newpos] == UNALLOCATED: + self.storage.allocated(self.piece_size * newpos, len(data)) + piece = self.rplaces[oldpos] + self.places[piece] = newpos + self.rplaces[oldpos] = ALLOCATED + self.rplaces[newpos] = piece + if not self.have[piece]: + return + data = data[:self._piecelen(piece)] + if sha(data).digest() != self.hashes[piece]: + raise BTFailure(_("data corrupted on disk - " + "maybe you have two copies running?")) + + def _get_free_place(self): + while self.rplaces[self.holepos] >= 0: + self.holepos += 1 + return self.holepos + + def get_amount_left(self): + return self.amount_left + + def do_I_have_anything(self): + return self.amount_left < self.total_length + + def _make_inactive(self, index): + length = self._piecelen(index) + l = [] + x = 0 + request_size = self.config['download_slice_size'] + while x + request_size < length: + l.append((x, request_size)) + x += request_size + l.append((x, length - x)) + self.inactive_requests[index] = l + + def _load_fastresume(self, resumefile, typecode): + if resumefile is not None: + try: + r = array(typecode) + r.fromfile(resumefile, self.numpieces) + return r + except Exception, e: + self.errorfunc(WARNING, _("Couldn't read fastresume data: ") + + str(e)) + return None + + def write_fastresume(self, resumefile): + for i in xrange(self.numpieces): + if self.rplaces[i] >= 0 and not self.have[self.rplaces[i]]: + self.rplaces[i] = FASTRESUME_PARTIAL + self.rplaces.tofile(resumefile) + + def get_have_list(self): + return self.have.tostring() + + def do_I_have(self, index): + return self.have[index] + + def do_I_have_requests(self, index): + return not not self.inactive_requests[index] + + def new_request(self, index): + # returns (begin, length) + if self.inactive_requests[index] == 1: + self._make_inactive(index) + self.numactive[index] += 1 + self.stat_active[index] = 1 + if index not in self.stat_dirty: + self.stat_new[index] = 1 + rs = self.inactive_requests[index] + r = min(rs) + rs.remove(r) + self.amount_inactive -= r[1] + if self.amount_inactive == 0: + self.endgame = True + return r + + def piece_came_in(self, index, begin, piece, source = None): + if self.places[index] < 0: + if self.rplaces[index] == ALLOCATED: + self._initalloc(index, index) + else: + n = self._get_free_place() + if self.places[n] >= 0: + oldpos = self.places[n] + self._move_piece(oldpos, n) + n = oldpos + if self.rplaces[index] < 0 or index == n: + self._initalloc(n, index) + else: + self._move_piece(index, n) + self._initalloc(index, index) + + if index in self.failed_pieces: + old = self.storage.read(self.places[index] * self.piece_size + + begin, len(piece)) + if old != piece: + self.failed_pieces[index][self.download_history[index][begin]]\ + = None + self.download_history.setdefault(index, {}) + self.download_history[index][begin] = source + + self.storage.write(self.places[index] * self.piece_size + begin, piece) + self.stat_dirty[index] = 1 + self.numactive[index] -= 1 + if self.numactive[index] == 0: + del self.stat_active[index] + if index in self.stat_new: + del self.stat_new[index] + if not self.inactive_requests[index] and not self.numactive[index]: + del self.stat_dirty[index] + if sha(self.storage.read(self.piece_size * self.places[index], self._piecelen(index))).digest() == self.hashes[index]: + self.have[index] = True + self.storage.downloaded(index * self.piece_size, + self._piecelen(index)) + self.inactive_requests[index] = None + self.waschecked[index] = True + self.amount_left -= self._piecelen(index) + self.stat_numdownloaded += 1 + for d in self.download_history[index].itervalues(): + if d is not None: + d.good(index) + del self.download_history[index] + if index in self.failed_pieces: + for d in self.failed_pieces[index]: + if d is not None: + d.bad(index) + del self.failed_pieces[index] + if self.amount_left == 0: + self.finished() + else: + self.data_flunked(self._piecelen(index), index) + self.inactive_requests[index] = 1 + self.amount_inactive += self._piecelen(index) + self.stat_numflunked += 1 + + self.failed_pieces[index] = {} + allsenders = {} + for d in self.download_history[index].itervalues(): + allsenders[d] = None + if len(allsenders) == 1: + culprit = allsenders.keys()[0] + if culprit is not None: + culprit.bad(index, bump = True) + del self.failed_pieces[index] # found the culprit already + return False + return True + + def request_lost(self, index, begin, length): + self.inactive_requests[index].append((begin, length)) + self.amount_inactive += length + self.numactive[index] -= 1 + if not self.numactive[index] and index in self.stat_active: + del self.stat_active[index] + if index in self.stat_new: + del self.stat_new[index] + + def get_piece(self, index, begin, length): + if not self.have[index]: + return None + if not self.waschecked[index]: + if sha(self.storage.read(self.piece_size * self.places[index], self._piecelen(index))).digest() != self.hashes[index]: + raise BTFailure, _("told file complete on start-up, but piece failed hash check") + self.waschecked[index] = True + if begin + length > self._piecelen(index): + return None + return self.storage.read(self.piece_size * self.places[index] + begin, length) diff --git a/BitTorrent/TorrentQueue.py b/BitTorrent/TorrentQueue.py new file mode 100755 index 0000000..4ddfd76 --- /dev/null +++ b/BitTorrent/TorrentQueue.py @@ -0,0 +1,810 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Uoti Urpala + +from __future__ import division + +import os +import sys +import threading +import traceback + +from BitTorrent.platform import bttime +from BitTorrent.download import Feedback, Multitorrent +from BitTorrent.controlsocket import ControlSocket +from BitTorrent.bencode import bdecode +from BitTorrent.ConvertedMetainfo import ConvertedMetainfo +from BitTorrent.prefs import Preferences +from BitTorrent import BTFailure, BTShutdown, INFO, WARNING, ERROR, CRITICAL +from BitTorrent import configfile +from BitTorrent import FAQ_URL +import BitTorrent + + +RUNNING = 0 +RUN_QUEUED = 1 +QUEUED = 2 +KNOWN = 3 +ASKING_LOCATION = 4 + + +class TorrentInfo(object): + + def __init__(self, config): + self.metainfo = None + self.dlpath = None + self.dl = None + self.state = None + self.completion = None + self.finishtime = None + self.uptotal = 0 + self.uptotal_old = 0 + self.downtotal = 0 + self.downtotal_old = 0 + self.config = config + + +def decode_position(l, pred, succ, default=None): + if default is None: + default = len(l) + if pred is None and succ is None: + return default + if pred is None: + return 0 + if succ is None: + return len(l) + try: + if l[0] == succ and pred not in l: + return 0 + if l[-1] == pred and succ not in l: + return len(l) + i = l.index(pred) + if l[i+1] == succ: + return i+1 + except (ValueError, IndexError): + pass + return default + + +class TorrentQueue(Feedback): + + def __init__(self, config, ui_options, controlsocket): + self.ui_options = ui_options + self.controlsocket = controlsocket + self.config = config + self.config['def_running_torrents'] = 1 # !@# XXX + self.config['max_running_torrents'] = 100 # !@# XXX + self.doneflag = threading.Event() + self.torrents = {} + self.starting_torrent = None + self.running_torrents = [] + self.queue = [] + self.other_torrents = [] + self.last_save_time = 0 + self.last_version_check = 0 + self.initialized = 0 + + def run(self, ui, ui_wrap, startflag): + try: + self.ui = ui + self.run_ui_task = ui_wrap + self.multitorrent = Multitorrent(self.config, self.doneflag, + self.global_error, listen_fail_ok=True) + self.rawserver = self.multitorrent.rawserver + self.controlsocket.set_rawserver(self.rawserver) + self.controlsocket.start_listening(self.external_command) + try: + self._restore_state() + except BTFailure, e: + self.torrents = {} + self.running_torrents = [] + self.queue = [] + self.other_torrents = [] + self.global_error(ERROR, _("Could not load saved state: ")+str(e)) + else: + for infohash in self.running_torrents + self.queue + \ + self.other_torrents: + t = self.torrents[infohash] + if t.dlpath is not None: + t.completion = self.multitorrent.get_completion( + self.config, t.metainfo, t.dlpath) + state = t.state + if state == RUN_QUEUED: + state = RUNNING + self.run_ui_task(self.ui.new_displayed_torrent, infohash, + t.metainfo, t.dlpath, state, t.config, + t.completion, t.uptotal, t.downtotal, ) + self._check_queue() + self.initialized = 1 + startflag.set() + except Exception, e: + # dump a normal exception traceback + traceback.print_exc() + # set the error flag + self.initialized = -1 + # signal the gui thread to stop waiting + startflag.set() + return + + self._queue_loop() + self.multitorrent.rawserver.listen_forever() + if self.doneflag.isSet(): + self.run_ui_task(self.ui.quit) + self.multitorrent.close_listening_socket() + self.controlsocket.close_socket() + for infohash in list(self.running_torrents): + t = self.torrents[infohash] + if t.state == RUN_QUEUED: + continue + t.dl.shutdown() + if t.dl is not None: # possibly set to none by failed() + totals = t.dl.get_total_transfer() + t.uptotal = t.uptotal_old + totals[0] + t.downtotal = t.downtotal_old + totals[1] + self._dump_state() + + def _check_version(self): + now = bttime() + if self.last_version_check > 0 and \ + self.last_version_check > now - 24*60*60: + return + self.last_version_check = now + self.run_ui_task(self.ui.check_version) + + def _dump_config(self): + configfile.save_ui_config(self.config, 'bittorrent', + self.ui_options, self.global_error) + for infohash,t in self.torrents.items(): + ec = lambda level, message: self.error(t.metainfo, level, message) + config = t.config.getDict() + if config: + configfile.save_torrent_config(self.config['data_dir'], + infohash, config, ec) + + def _dump_state(self): + self.last_save_time = bttime() + r = [] + def write_entry(infohash, t): + if t.dlpath is None: + assert t.state == ASKING_LOCATION + r.append(infohash.encode('hex') + '\n') + else: + r.append(infohash.encode('hex') + ' ' + str(t.uptotal) + ' ' + + str(t.downtotal)+' '+t.dlpath.encode('string_escape')+'\n') + r.append('BitTorrent UI state file, version 3\n') + r.append('Running torrents\n') + for infohash in self.running_torrents: + write_entry(infohash, self.torrents[infohash]) + r.append('Queued torrents\n') + for infohash in self.queue: + write_entry(infohash, self.torrents[infohash]) + r.append('Known torrents\n') + for infohash in self.other_torrents: + write_entry(infohash, self.torrents[infohash]) + r.append('End\n') + f = None + try: + filename = os.path.join(self.config['data_dir'], 'ui_state') + f = file(filename + '.new', 'wb') + f.write(''.join(r)) + f.close() + if os.access(filename, os.F_OK): + os.remove(filename) # no atomic rename on win32 + os.rename(filename + '.new', filename) + except Exception, e: + self.global_error(ERROR, _("Could not save UI state: ") + str(e)) + if f is not None: + f.close() + + def _restore_state(self): + def decode_line(line): + hashtext = line[:40] + try: + infohash = hashtext.decode('hex') + except: + raise BTFailure(_("Invalid state file contents")) + if len(infohash) != 20: + raise BTFailure(_("Invalid state file contents")) + try: + path = os.path.join(self.config['data_dir'], 'metainfo', + hashtext) + f = file(path, 'rb') + data = f.read() + f.close() + except Exception, e: + try: + f.close() + except: + pass + self.global_error(ERROR, + _("Error reading file ") + path + + " (" + str(e)+ "), " + + _("cannot restore state completely")) + return None + if infohash in self.torrents: + raise BTFailure(_("Invalid state file (duplicate entry)")) + t = TorrentInfo(Preferences(self.config)) + self.torrents[infohash] = t + try: + t.metainfo = ConvertedMetainfo(bdecode(data)) + except Exception, e: + self.global_error(ERROR, _("Corrupt data in ")+path+ + _(" , cannot restore torrent (")+str(e)+")") + return None + t.metainfo.reported_errors = True # suppress redisplay on restart + if infohash != t.metainfo.infohash: + self.global_error(ERROR, _("Corrupt data in ")+path+ + _(" , cannot restore torrent (")+'infohash mismatch'+")") + # BUG cannot localize due to string freeze + return None + if len(line) == 41: + t.dlpath = None + return infohash, t + config = configfile.read_torrent_config(self.config, + self.config['data_dir'], + infohash, self.global_error) + if config: + t.config.update(config) + try: + if version < 2: + t.dlpath = line[41:-1].decode('string_escape') + else: + up, down, dlpath = line[41:-1].split(' ', 2) + t.uptotal = t.uptotal_old = int(up) + t.downtotal = t.downtotal_old = int(down) + t.dlpath = dlpath.decode('string_escape') + except ValueError: # unpack, int(), decode() + raise BTFailure(_("Invalid state file (bad entry)")) + return infohash, t + filename = os.path.join(self.config['data_dir'], 'ui_state') + if not os.path.exists(filename): + return + f = None + try: + f = file(filename, 'rb') + lines = f.readlines() + f.close() + except Exception, e: + if f is not None: + f.close() + raise BTFailure(str(e)) + i = iter(lines) + try: + txt = 'BitTorrent UI state file, version ' + version = i.next() + if not version.startswith(txt): + raise BTFailure(_("Bad UI state file")) + try: + version = int(version[len(txt):-1]) + except: + raise BTFailure(_("Bad UI state file version")) + if version > 3: + raise BTFailure(_("Unsupported UI state file version (from " + "newer client version?)")) + if version < 3: + if i.next() != 'Running/queued torrents\n': + raise BTFailure(_("Invalid state file contents")) + else: + if i.next() != 'Running torrents\n': + raise BTFailure(_("Invalid state file contents")) + while True: + line = i.next() + if line == 'Queued torrents\n': + break + t = decode_line(line) + if t is None: + continue + infohash, t = t + if t.dlpath is None: + raise BTFailure(_("Invalid state file contents")) + t.state = RUN_QUEUED + self.running_torrents.append(infohash) + while True: + line = i.next() + if line == 'Known torrents\n': + break + t = decode_line(line) + if t is None: + continue + infohash, t = t + if t.dlpath is None: + raise BTFailure(_("Invalid state file contents")) + t.state = QUEUED + self.queue.append(infohash) + while True: + line = i.next() + if line == 'End\n': + break + t = decode_line(line) + if t is None: + continue + infohash, t = t + if t.dlpath is None: + t.state = ASKING_LOCATION + else: + t.state = KNOWN + self.other_torrents.append(infohash) + except StopIteration: + raise BTFailure(_("Invalid state file contents")) + + def _queue_loop(self): + if self.doneflag.isSet(): + return + self.rawserver.add_task(self._queue_loop, 20) + now = bttime() + self._check_version() + if self.queue and self.starting_torrent is None: + mintime = now - self.config['next_torrent_time'] * 60 + minratio = self.config['next_torrent_ratio'] / 100 + if self.config['seed_forever']: + minratio = 1e99 + else: + mintime = 0 + minratio = self.config['last_torrent_ratio'] / 100 + if self.config['seed_last_forever']: + minratio = 1e99 + if minratio >= 1e99: + return + for infohash in self.running_torrents: + t = self.torrents[infohash] + myminratio = minratio + if t.dl: + if self.queue and t.dl.config['seed_last_forever']: + myminratio = 1e99 + elif t.dl.config['seed_forever']: + myminratio = 1e99 + if t.state == RUN_QUEUED: + continue + totals = t.dl.get_total_transfer() + # not updated for remaining torrents if one is stopped, who cares + t.uptotal = t.uptotal_old + totals[0] + t.downtotal = t.downtotal_old + totals[1] + if t.finishtime is None or t.finishtime > now - 120: + continue + if t.finishtime > mintime: + if t.uptotal < t.metainfo.total_bytes * myminratio: + continue + self.change_torrent_state(infohash, RUNNING, KNOWN) + break + if self.running_torrents and self.last_save_time < now - 300: + self._dump_state() + + def _check_queue(self): + if self.starting_torrent is not None or self.config['pause']: + return + for infohash in self.running_torrents: + if self.torrents[infohash].state == RUN_QUEUED: + self.starting_torrent = infohash + t = self.torrents[infohash] + t.state = RUNNING + t.finishtime = None + t.dl = self.multitorrent.start_torrent(t.metainfo, t.config, + self, t.dlpath) + return + if not self.queue or len(self.running_torrents) >= \ + self.config['def_running_torrents']: + return + infohash = self.queue.pop(0) + self.starting_torrent = infohash + t = self.torrents[infohash] + assert t.state == QUEUED + t.state = RUNNING + t.finishtime = None + self.running_torrents.append(infohash) + t.dl = self.multitorrent.start_torrent(t.metainfo, t.config, self, + t.dlpath) + self._send_state(infohash) + + def _send_state(self, infohash): + t = self.torrents[infohash] + state = t.state + if state == RUN_QUEUED: + state = RUNNING + pos = None + if state in (KNOWN, RUNNING, QUEUED): + l = self._get_list(state) + if l[-1] != infohash: + pos = l.index(infohash) + self.run_ui_task(self.ui.torrent_state_changed, infohash, t.dlpath, + state, t.completion, t.uptotal_old, t.downtotal_old, pos) + + def _stop_running(self, infohash): + t = self.torrents[infohash] + if t.state == RUN_QUEUED: + self.running_torrents.remove(infohash) + t.state = KNOWN + return True + assert t.state == RUNNING + t.dl.shutdown() + if infohash == self.starting_torrent: + self.starting_torrent = None + try: + self.running_torrents.remove(infohash) + except ValueError: + self.other_torrents.remove(infohash) + return False + else: + t.state = KNOWN + totals = t.dl.get_total_transfer() + t.uptotal_old += totals[0] + t.uptotal = t.uptotal_old + t.downtotal_old += totals[1] + t.downtotal = t.downtotal_old + t.dl = None + t.completion = self.multitorrent.get_completion(self.config, + t.metainfo, t.dlpath) + return True + + def external_command(self, action, *datas): + if action == 'start_torrent': + assert len(datas) == 2 + self.start_new_torrent(datas[0], save_as=datas[1]) + elif action == 'show_error': + assert len(datas) == 1 + self.global_error(ERROR, datas[0]) + elif action == 'no-op': + pass + + def remove_torrent(self, infohash): + if infohash not in self.torrents: + return + state = self.torrents[infohash].state + if state == QUEUED: + self.queue.remove(infohash) + elif state in (RUNNING, RUN_QUEUED): + self._stop_running(infohash) + self._check_queue() + else: + self.other_torrents.remove(infohash) + self.run_ui_task(self.ui.removed_torrent, infohash) + del self.torrents[infohash] + + for d in ['metainfo', 'resume']: + filename = os.path.join(self.config['data_dir'], d, + infohash.encode('hex')) + try: + os.remove(filename) + except Exception, e: + self.global_error(WARNING, + (_("Could not delete cached %s file:")%d) + + str(e)) + ec = lambda level, message: self.global_error(level, message) + configfile.remove_torrent_config(self.config['data_dir'], + infohash, ec) + self._dump_state() + + def set_save_location(self, infohash, dlpath): + torrent = self.torrents.get(infohash) + if torrent is None or torrent.state == RUNNING: + return + torrent.dlpath = dlpath + torrent.completion = self.multitorrent.get_completion(self.config, + torrent.metainfo, dlpath) + if torrent.state == ASKING_LOCATION: + torrent.state = KNOWN + self.change_torrent_state(infohash, KNOWN, QUEUED) + else: + self._send_state(infohash) + self._dump_state() + + def start_new_torrent(self, data, save_as=None): + t = TorrentInfo(Preferences(self.config)) + try: + t.metainfo = ConvertedMetainfo(bdecode(data)) + except Exception, e: + self.global_error(ERROR, _("This is not a valid torrent file. (%s)") + % str(e)) + return + infohash = t.metainfo.infohash + if infohash in self.torrents: + real_state = self.torrents[infohash].state + if real_state in (RUNNING, RUN_QUEUED): + self.error(t.metainfo, ERROR, + _("This torrent (or one with the same contents) is " + "already running.")) + elif real_state == QUEUED: + self.error(t.metainfo, ERROR, + _("This torrent (or one with the same contents) is " + "already waiting to run.")) + elif real_state == ASKING_LOCATION: + pass + elif real_state == KNOWN: + self.change_torrent_state(infohash, KNOWN, newstate=QUEUED) + else: + raise BTFailure(_("Torrent in unknown state %d") % real_state) + return + + path = os.path.join(self.config['data_dir'], 'metainfo', + infohash.encode('hex')) + try: + f = file(path+'.new', 'wb') + f.write(data) + f.close() + if os.access(path, os.F_OK): + os.remove(path) # no atomic rename on win32 + os.rename(path+'.new', path) + except Exception, e: + try: + f.close() + except: + pass + self.global_error(ERROR, _("Could not write file ") + path + + ' (' + str(e) + '), ' + + _("torrent will not be restarted " + "correctly on client restart")) + + config = configfile.read_torrent_config(self.config, + self.config['data_dir'], + infohash, self.global_error) + if config: + t.config.update(config) + if save_as: + self.run_ui_task(self.ui.set_config, 'save_as', save_as) + else: + save_as = None + + self.torrents[infohash] = t + t.state = ASKING_LOCATION + self.other_torrents.append(infohash) + self._dump_state() + self.run_ui_task(self.ui.new_displayed_torrent, infohash, + t.metainfo, save_as, t.state, t.config) + + def show_error(level, text): + self.run_ui_task(self.ui.error, infohash, level, text) + t.metainfo.show_encoding_errors(show_error) + + def set_config(self, option, value, ihash=None): + if not ihash: + oldvalue = self.config[option] + self.config[option] = value + self.multitorrent.set_option(option, value) + if option == 'pause': + if value:# and not oldvalue: + self.set_zero_running_torrents() + elif not value:# and oldvalue: + self._check_queue() + else: + torrent = self.torrents[ihash] + if torrent.state == RUNNING: + torrent.dl.set_option(option, value) + if option in ('forwarded_port', 'maxport'): + torrent.dl.change_port() + torrent.config[option] = value + self._dump_config() + + def request_status(self, infohash, want_spew, want_fileinfo): + torrent = self.torrents.get(infohash) + if torrent is None or torrent.state != RUNNING: + return + status = torrent.dl.get_status(want_spew, want_fileinfo) + if torrent.finishtime is not None: + now = bttime() + uptotal = status['upTotal'] + torrent.uptotal_old + downtotal = status['downTotal'] + torrent.downtotal_old + ulspeed = status['upRate2'] + if self.queue: + ratio = torrent.dl.config['next_torrent_ratio'] / 100 + if torrent.dl.config['seed_forever']: + ratio = 1e99 + else: + ratio = torrent.dl.config['last_torrent_ratio'] / 100 + if torrent.dl.config['seed_last_forever']: + ratio = 1e99 + if ulspeed <= 0 or ratio >= 1e99: + rem = 1e99 + elif downtotal == 0: + rem = (torrent.metainfo.total_bytes * ratio - uptotal) / ulspeed + else: + rem = (downtotal * ratio - uptotal) / ulspeed + if self.queue and not torrent.dl.config['seed_forever']: + rem = min(rem, torrent.finishtime + + torrent.dl.config['next_torrent_time'] * 60 - now) + rem = max(rem, torrent.finishtime + 120 - now) + if rem <= 0: + rem = 1 + if rem >= 1e99: + rem = None + status['timeEst'] = rem + self.run_ui_task(self.ui.update_status, infohash, status) + + def _get_list(self, state): + if state == KNOWN: + return self.other_torrents + elif state == QUEUED: + return self.queue + elif state in (RUNNING, RUN_QUEUED): + return self.running_torrents + assert False + + def change_torrent_state(self, infohash, oldstate, newstate=None, + pred=None, succ=None, replaced=None, force_running=False): + t = self.torrents.get(infohash) + if t is None or (t.state != oldstate and not (t.state == RUN_QUEUED and + oldstate == RUNNING)): + return + if newstate is None: + newstate = oldstate + assert oldstate in (KNOWN, QUEUED, RUNNING) + assert newstate in (KNOWN, QUEUED, RUNNING) + pos = None + if oldstate != RUNNING and newstate == RUNNING and replaced is None: + if len(self.running_torrents) >= (force_running and self.config[ + 'max_running_torrents'] or self.config['def_running_torrents']): + if force_running: + self.global_error(ERROR, + _("Can't run more than %d torrents " + "simultaneously. For more info see the" + " FAQ at %s.")% + (self.config['max_running_torrents'], + FAQ_URL)) + newstate = QUEUED + pos = 0 + l = self._get_list(newstate) + if newstate == oldstate: + origpos = l.index(infohash) + del l[origpos] + if pos is None: + pos = decode_position(l, pred, succ, -1) + if pos == -1 or l == origpos: + l.insert(origpos, infohash) + return + l.insert(pos, infohash) + self._dump_state() + self.run_ui_task(self.ui.reorder_torrent, infohash, pos) + return + if pos is None: + pos = decode_position(l, pred, succ) + if newstate == RUNNING: + newstate = RUN_QUEUED + if replaced and len(self.running_torrents) >= \ + self.config['def_running_torrents']: + t2 = self.torrents.get(replaced) + if t2 is None or t2.state not in (RUNNING, RUN_QUEUED): + return + if self.running_torrents.index(replaced) < pos: + pos -= 1 + if self._stop_running(replaced): + t2.state = QUEUED + self.queue.insert(0, replaced) + self._send_state(replaced) + else: + self.other_torrents.append(replaced) + if oldstate == RUNNING: + if newstate == QUEUED and len(self.running_torrents) <= \ + self.config['def_running_torrents'] and pos == 0: + return + if not self._stop_running(infohash): + if newstate == KNOWN: + self.other_torrents.insert(pos, infohash) + self.run_ui_task(self.ui.reorder_torrent, infohash, pos) + else: + self.other_torrents.append(infohash) + return + else: + self._get_list(oldstate).remove(infohash) + t.state = newstate + l.insert(pos, infohash) + self._check_queue() # sends state if it starts the torrent from queue + if t.state != RUNNING or newstate == RUN_QUEUED: + self._send_state(infohash) + self._dump_state() + + def set_zero_running_torrents(self): + newrun = [] + for infohash in list(self.running_torrents): + t = self.torrents[infohash] + if self._stop_running(infohash): + newrun.append(infohash) + t.state = RUN_QUEUED + else: + self.other_torrents.append(infohash) + self.running_torrents = newrun + + def check_completion(self, infohash, filelist=False): + t = self.torrents.get(infohash) + if t is None: + return + r = self.multitorrent.get_completion(self.config, t.metainfo, + t.dlpath, filelist) + if r is None or not filelist: + self.run_ui_task(self.ui.update_completion, infohash, r) + else: + self.run_ui_task(self.ui.update_completion, infohash, *r) + + def global_error(self, level, text): + self.run_ui_task(self.ui.global_error, level, text) + + # callbacks from torrent instances + + def failed(self, torrent, is_external): + infohash = torrent.infohash + if infohash == self.starting_torrent: + self.starting_torrent = None + self.running_torrents.remove(infohash) + t = self.torrents[infohash] + t.state = KNOWN + if is_external: + t.completion = self.multitorrent.get_completion( + self.config, t.metainfo, t.dlpath) + else: + t.completion = None + totals = t.dl.get_total_transfer() + t.uptotal_old += totals[0] + t.uptotal = t.uptotal_old + t.downtotal_old += totals[1] + t.downtotal = t.downtotal_old + t.dl = None + self.other_torrents.append(infohash) + self._send_state(infohash) + if not self.doneflag.isSet(): + self._check_queue() + self._dump_state() + + def finished(self, torrent): + infohash = torrent.infohash + t = self.torrents[infohash] + totals = t.dl.get_total_transfer() + if t.downtotal == 0 and t.downtotal_old == 0 and totals[1] == 0: + self.set_config('seed_forever', True, infohash) + + if infohash == self.starting_torrent: + t = self.torrents[infohash] + if self.queue: + ratio = t.config['next_torrent_ratio'] / 100 + if t.config['seed_forever']: + ratio = 1e99 + msg = _("Not starting torrent as there are other torrents " + "waiting to run, and this one already meets the " + "settings for when to stop seeding.") + else: + ratio = t.config['last_torrent_ratio'] / 100 + if t.config['seed_last_forever']: + ratio = 1e99 + msg = _("Not starting torrent as it already meets the " + "settings for when to stop seeding the last " + "completed torrent.") + if ratio < 1e99 and t.uptotal >= t.metainfo.total_bytes * ratio: + raise BTShutdown(msg) + self.torrents[torrent.infohash].finishtime = bttime() + + def started(self, torrent): + infohash = torrent.infohash + assert infohash == self.starting_torrent + self.starting_torrent = None + self._check_queue() + + def error(self, torrent, level, text): + self.run_ui_task(self.ui.error, torrent.infohash, level, text) + + +class ThreadWrappedQueue(object): + + def __init__(self, wrapped): + self.wrapped = wrapped + + def set_done(self): + self.wrapped.doneflag.set() + # add a dummy task to make sure the thread wakes up and notices flag + def dummy(): + pass + self.wrapped.rawserver.external_add_task(dummy, 0) + +def _makemethod(methodname): + def wrapper(self, *args, **kws): + def f(): + getattr(self.wrapped, methodname)(*args, **kws) + self.wrapped.rawserver.external_add_task(f, 0) + return wrapper + +for methodname in "request_status set_config start_new_torrent remove_torrent set_save_location change_torrent_state check_completion".split(): + setattr(ThreadWrappedQueue, methodname, _makemethod(methodname)) +del _makemethod, methodname diff --git a/BitTorrent/Uploader.py b/BitTorrent/Uploader.py new file mode 100755 index 0000000..d02bfa8 --- /dev/null +++ b/BitTorrent/Uploader.py @@ -0,0 +1,97 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from BitTorrent.CurrentRateMeasure import Measure + + +class Upload(object): + + def __init__(self, connection, ratelimiter, totalup, totalup2, choker, + storage, max_slice_length, max_rate_period): + self.connection = connection + self.ratelimiter = ratelimiter + self.totalup = totalup + self.totalup2 = totalup2 + self.choker = choker + self.storage = storage + self.max_slice_length = max_slice_length + self.max_rate_period = max_rate_period + self.choked = True + self.unchoke_time = None + self.interested = False + self.buffer = [] + self.measure = Measure(max_rate_period) + if storage.do_I_have_anything(): + connection.send_bitfield(storage.get_have_list()) + + def got_not_interested(self): + if self.interested: + self.interested = False + del self.buffer[:] + self.choker.not_interested(self.connection) + + def got_interested(self): + if not self.interested: + self.interested = True + self.choker.interested(self.connection) + + def get_upload_chunk(self): + if not self.buffer: + return None + index, begin, length = self.buffer.pop(0) + piece = self.storage.get_piece(index, begin, length) + if piece is None: + self.connection.close() + return None + return (index, begin, piece) + + def update_rate(self, bytes): + self.measure.update_rate(bytes) + self.totalup.update_rate(bytes) + self.totalup2.update_rate(bytes) + + def got_request(self, index, begin, length): + if not self.interested or length > self.max_slice_length: + self.connection.close() + return + if not self.connection.choke_sent: + self.buffer.append((index, begin, length)) + if self.connection.next_upload is None and \ + self.connection.connection.is_flushed(): + self.ratelimiter.queue(self.connection, self.connection.encoder.context.rlgroup) + + def got_cancel(self, index, begin, length): + try: + self.buffer.remove((index, begin, length)) + except ValueError: + pass + + def choke(self): + if not self.choked: + self.choked = True + self.connection.send_choke() + + def sent_choke(self): + assert self.choked + del self.buffer[:] + + def unchoke(self, time): + if self.choked: + self.choked = False + self.unchoke_time = time + self.connection.send_unchoke() + + def has_queries(self): + return len(self.buffer) > 0 + + def get_rate(self): + return self.measure.get_rate() diff --git a/BitTorrent/__init__.py b/BitTorrent/__init__.py new file mode 100755 index 0000000..707cf2c --- /dev/null +++ b/BitTorrent/__init__.py @@ -0,0 +1,123 @@ +# -*- coding: UTF-8 -*- +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +app_name = 'BitTorrent' +version = '4.2.1' + +URL = 'http://www.bittorrent.com/' +DONATE_URL = URL + 'donate.html' +FAQ_URL = URL + 'FAQ.html' +HELP_URL = URL + 'documentation.html' +SEARCH_URL = 'http://search.bittorrent.com/search.jsp?client=%(client)s&query=%(query)s' + +import sys +assert sys.version_info >= (2, 2, 1), _("Python 2.2.1 or newer required") +import os +import time + +branch = None +if os.access('.cdv', os.F_OK): + branch = os.path.split(os.path.realpath(os.path.split(sys.argv[0])[0]))[1] + +from BitTorrent.platform import get_home_dir, is_frozen_exe + +# http://people.w3.org/rishida/names/languages.html +language_names = { + 'af' :u'Afrikaans' , 'bg' :u'Български' , + 'da' :u'Dansk' , 'ca' :u'Català' , + 'cs' :u'Čeština' , 'de' :u'Deutsch' , + 'en' :u'English' , 'es' :u'Español' , + 'es_MX':u'Español de Mexico ' , 'fr' :u'Français' , + 'gr' :u'Ελληνικά' , 'hu' :u'Magyar' , + 'it' :u'Italiano' , 'ja' :u'日本語' , + 'ko' :u'한국어' ,'nl' :u'Nederlands' , + 'nb_NO':u'Norsk bokmål' , 'pl' :u'Polski' , + 'pt' :u'Português' , 'pt_BR':u'Português do Brasil' , + 'ro' :u'Română' , 'ru' :u'Русский' , + 'sk' :u'Slovenský' , 'sl' :u'Slovensko' , + 'sv' :u'Svenska' , 'tr' :u'Türkçe' , + 'vi' :u'Tiếng Việt' , + 'zh_CN':u'简体中文' , # Simplified + 'zh_TW':u'繁體中文' , # Traditional + } + +unfinished_language_names = { + 'ar' :u'العربية' , 'bs' :u'Bosanski' , + 'eo' :u'Esperanto' , 'eu' :u'Euskara' , + 'et' :u'Eesti' , 'fi' :u'Suomi' , + 'ga' :u'Gaeilge' , 'gl' :u'Galego' , + 'he_IL':u'עברית' , 'hr' :u'Hrvatski' , + 'hy' :u'Հայերեն' , 'in' :u'Bahasa indonesia' , + 'ka' :u'ქართული ენა', 'lt' :u'Lietuvių' , + 'ms' :u'Bahasa melayu' , 'ml' :u'Malayalam' , + 'sq' :u'Shqipe' , 'th' :u'ภาษาไทย' , + 'tlh' :u'tlhIngan-Hol' , 'uk' :u'Українська' , + 'hi' :u'हिन्दी' , 'cy' :u'Cymraeg' , + 'is' :u'Íslenska' , 'nn_NO':u'Norsk Nynorsk' , + 'te' :u'తెలుగు' , + } + +#language_names.update(unfinished_language_names) + +languages = language_names.keys() +languages.sort() + +if os.name == 'posix': + if os.uname()[0] == "Darwin": + from BitTorrent.platform import install_translation + install_translation() + +# hackery to get around bug in py2exe that tries to write log files to +# application directories, which may not be writable by non-admin users +if is_frozen_exe: + baseclass = sys.stderr.__class__ + class Stderr(baseclass): + logroot = get_home_dir() + + if logroot is None: + logroot = os.path.splitdrive(sys.executable)[0] + if logroot[-1] != os.sep: + logroot += os.sep + logname = os.path.splitext(os.path.split(sys.executable)[1])[0] + '_errors.log' + logpath = os.path.join(logroot, logname) + + def __init__(self): + self.just_wrote_newline = True + + def write(self, text, alert=None, fname=logpath): + output = text + + if self.just_wrote_newline and not text.startswith('[%s ' % version): + output = '[%s %s] %s' % (version, time.strftime('%Y-%m-%d %H:%M:%S'), text) + + if 'GtkWarning' not in text: + baseclass.write(self, output, fname=fname) + + if output[-1] == '\n': + self.just_wrote_newline = True + else: + self.just_wrote_newline = False + + sys.stderr = Stderr() + +del sys, get_home_dir, is_frozen_exe + +INFO = 0 +WARNING = 1 +ERROR = 2 +CRITICAL = 3 + +class BTFailure(Exception): + pass + +class BTShutdown(BTFailure): + pass + diff --git a/BitTorrent/bencode.py b/BitTorrent/bencode.py new file mode 100755 index 0000000..8a3ccad --- /dev/null +++ b/BitTorrent/bencode.py @@ -0,0 +1,130 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Petru Paler + +from BitTorrent.obsoletepythonsupport import * + +from BitTorrent import BTFailure + +def decode_int(x, f): + f += 1 + newf = x.index('e', f) + n = int(x[f:newf]) + if x[f] == '-': + if x[f + 1] == '0': + raise ValueError + elif x[f] == '0' and newf != f+1: + raise ValueError + return (n, newf+1) + +def decode_string(x, f): + colon = x.index(':', f) + n = int(x[f:colon]) + if x[f] == '0' and colon != f+1: + raise ValueError + colon += 1 + return (x[colon:colon+n], colon+n) + +def decode_list(x, f): + r, f = [], f+1 + while x[f] != 'e': + v, f = decode_func[x[f]](x, f) + r.append(v) + return (r, f + 1) + +def decode_dict(x, f): + r, f = {}, f+1 + lastkey = None + while x[f] != 'e': + k, f = decode_string(x, f) + if lastkey >= k: + raise ValueError + lastkey = k + r[k], f = decode_func[x[f]](x, f) + return (r, f + 1) + +decode_func = {} +decode_func['l'] = decode_list +decode_func['d'] = decode_dict +decode_func['i'] = decode_int +decode_func['0'] = decode_string +decode_func['1'] = decode_string +decode_func['2'] = decode_string +decode_func['3'] = decode_string +decode_func['4'] = decode_string +decode_func['5'] = decode_string +decode_func['6'] = decode_string +decode_func['7'] = decode_string +decode_func['8'] = decode_string +decode_func['9'] = decode_string + +def bdecode(x): + try: + r, l = decode_func[x[0]](x, 0) + except (IndexError, KeyError, ValueError): + raise BTFailure, _("not a valid bencoded string") + if l != len(x): + raise BTFailure, _("invalid bencoded value (data after valid prefix)") + return r + +from types import StringType, IntType, LongType, DictType, ListType, TupleType + + +class Bencached(object): + + __slots__ = ['bencoded'] + + def __init__(self, s): + self.bencoded = s + +def encode_bencached(x,r): + r.append(x.bencoded) + +def encode_int(x, r): + r.extend(('i', str(x), 'e')) + +def encode_string(x, r): + r.extend((str(len(x)), ':', x)) + +def encode_list(x, r): + r.append('l') + for i in x: + encode_func[type(i)](i, r) + r.append('e') + +def encode_dict(x,r): + r.append('d') + ilist = x.items() + ilist.sort() + for k, v in ilist: + r.extend((str(len(k)), ':', k)) + encode_func[type(v)](v, r) + r.append('e') + +encode_func = {} +encode_func[Bencached] = encode_bencached +encode_func[IntType] = encode_int +encode_func[LongType] = encode_int +encode_func[StringType] = encode_string +encode_func[ListType] = encode_list +encode_func[TupleType] = encode_list +encode_func[DictType] = encode_dict + +try: + from types import BooleanType + encode_func[BooleanType] = encode_int +except ImportError: + pass + +def bencode(x): + r = [] + encode_func[type(x)](x, r) + return ''.join(r) diff --git a/BitTorrent/bitfield.py b/BitTorrent/bitfield.py new file mode 100755 index 0000000..f9fb511 --- /dev/null +++ b/BitTorrent/bitfield.py @@ -0,0 +1,77 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen, Uoti Urpala, and John Hoffman + +from array import array + +from BitTorrent.obsoletepythonsupport import * + +counts = [chr(sum([(i >> j) & 1 for j in xrange(8)])) for i in xrange(256)] +counts = ''.join(counts) + + +class Bitfield: + + def __init__(self, length, bitstring=None): + self.length = length + rlen, extra = divmod(length, 8) + if bitstring is None: + self.numfalse = length + if extra: + self.bits = array('B', chr(0) * (rlen + 1)) + else: + self.bits = array('B', chr(0) * rlen) + else: + if extra: + if len(bitstring) != rlen + 1: + raise ValueError + if (ord(bitstring[-1]) << extra) & 0xFF != 0: + raise ValueError + else: + if len(bitstring) != rlen: + raise ValueError + c = counts + self.numfalse = length - sum(array('B', + bitstring.translate(counts))) + if self.numfalse != 0: + self.bits = array('B', bitstring) + else: + self.bits = None + + def __setitem__(self, index, val): + assert val + pos = index >> 3 + mask = 128 >> (index & 7) + if self.bits[pos] & mask: + return + self.bits[pos] |= mask + self.numfalse -= 1 + if self.numfalse == 0: + self.bits = None + + def __getitem__(self, index): + bits = self.bits + if bits is None: + return 1 + return bits[index >> 3] & 128 >> (index & 7) + + def __len__(self): + return self.length + + def tostring(self): + if self.bits is None: + rlen, extra = divmod(self.length, 8) + r = chr(0xFF) * rlen + if extra: + r += chr((0xFF << (8 - extra)) & 0xFF) + return r + else: + return self.bits.tostring() diff --git a/BitTorrent/btformats.py b/BitTorrent/btformats.py new file mode 100755 index 0000000..820665a --- /dev/null +++ b/BitTorrent/btformats.py @@ -0,0 +1,140 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +import re + +from BitTorrent import BTFailure + +allowed_path_re = re.compile(r'^[^/\\.~][^/\\]*$') + +ints = (long, int) + +def check_info(info, check_paths=True): + if type(info) != dict: + raise BTFailure, _("bad metainfo - not a dictionary") + pieces = info.get('pieces') + if type(pieces) != str or len(pieces) % 20 != 0: + raise BTFailure, _("bad metainfo - bad pieces key") + piecelength = info.get('piece length') + if type(piecelength) not in ints or piecelength <= 0: + raise BTFailure, _("bad metainfo - illegal piece length") + name = info.get('name') + if type(name) != str: + raise BTFailure, _("bad metainfo - bad name") + if not allowed_path_re.match(name): + raise BTFailure, _("name %s disallowed for security reasons") % name + if info.has_key('files') == info.has_key('length'): + raise BTFailure, _("single/multiple file mix") + if info.has_key('length'): + length = info.get('length') + if type(length) not in ints or length < 0: + raise BTFailure, _("bad metainfo - bad length") + else: + files = info.get('files') + if type(files) != list: + raise BTFailure, _('bad metainfo - "files" is not a list of files') + for f in files: + if type(f) != dict: + raise BTFailure, _("bad metainfo - bad file value") + length = f.get('length') + if type(length) not in ints or length < 0: + raise BTFailure, _("bad metainfo - bad length") + path = f.get('path') + if type(path) != list or path == []: + raise BTFailure, _("bad metainfo - bad path") + for p in path: + if type(p) != str: + raise BTFailure, _("bad metainfo - bad path dir") + if check_paths and not allowed_path_re.match(p): + raise BTFailure, _("path %s disallowed for security reasons") % p + f = ['/'.join(x['path']) for x in files] + f.sort() + i = iter(f) + try: + name2 = i.next() + while True: + name1 = name2 + name2 = i.next() + if name2.startswith(name1): + if name1 == name2: + raise BTFailure, _("bad metainfo - duplicate path") + elif name2[len(name1)] == '/': + raise BTFailure(_("bad metainfo - name used as both" + "file and subdirectory name")) + except StopIteration: + pass + +def check_message(message, check_paths=True): + if type(message) != dict: + raise BTFailure, _("bad metainfo - wrong object type") + check_info(message.get('info'), check_paths) + if type(message.get('announce')) != str and type(message.get('nodes')) != list: + raise BTFailure, _("bad metainfo - no announce URL string") + if message.has_key('nodes'): + check_nodes(message.get('nodes')) + +def check_nodes(nodes): + ## note, these strings need changing + for node in nodes: + if type(node) != list: + raise BTFailure, _("bad metainfo - wrong object type") + "0" + if len(node) != 2: + raise BTFailure, _("bad metainfo - wrong object type") + "1" + host, port = node + if type(host) != str: + raise BTFailure, _("bad metainfo - wrong object type") + "2" + if type(port) != int: + raise BTFailure, _("bad metainfo - wrong object type") + "3" + +def check_peers(message): + if type(message) != dict: + raise BTFailure + if message.has_key('failure reason'): + if type(message['failure reason']) != str: + raise BTFailure, _("non-text failure reason") + return + if message.has_key('warning message'): + if type(message['warning message']) != str: + raise BTFailure, _("non-text warning message") + peers = message.get('peers') + if type(peers) == list: + for p in peers: + if type(p) != dict: + raise BTFailure, _("invalid entry in peer list1") + if type(p.get('ip')) != str: + raise BTFailure, _("invalid entry in peer list2") + port = p.get('port') + if type(port) not in ints or p <= 0: + raise BTFailure, _("invalid entry in peer list3") + if p.has_key('peer id'): + peerid = p.get('peer id') + if type(peerid) != str or len(peerid) != 20: + raise BTFailure, _("invalid entry in peer list4") + elif type(peers) != str or len(peers) % 6 != 0: + raise BTFailure, _("invalid peer list") + interval = message.get('interval', 1) + if type(interval) not in ints or interval <= 0: + raise BTFailure, _("invalid announce interval") + minint = message.get('min interval', 1) + if type(minint) not in ints or minint <= 0: + raise BTFailure, _("invalid min announce interval") + if type(message.get('tracker id', '')) != str: + raise BTFailure, _("invalid tracker id") + npeers = message.get('num peers', 0) + if type(npeers) not in ints or npeers < 0: + raise BTFailure, _("invalid peer count") + dpeers = message.get('done peers', 0) + if type(dpeers) not in ints or dpeers < 0: + raise BTFailure, _("invalid seed count") + last = message.get('last', 0) + if type(last) not in ints or last < 0: + raise BTFailure, _('invalid "last" entry') diff --git a/BitTorrent/configfile.py b/BitTorrent/configfile.py new file mode 100755 index 0000000..d6a3d0c --- /dev/null +++ b/BitTorrent/configfile.py @@ -0,0 +1,217 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Uoti Urpala and Matt Chisholm + +import os +import sys +import gettext +import locale + +# Python 2.2 doesn't have RawConfigParser +try: + from ConfigParser import RawConfigParser +except ImportError: + from ConfigParser import ConfigParser as RawConfigParser + +from ConfigParser import MissingSectionHeaderError, ParsingError +from BitTorrent import parseargs +from BitTorrent import app_name, version, ERROR, BTFailure +from BitTorrent.platform import get_config_dir, locale_root, is_frozen_exe +from BitTorrent.defaultargs import MYTRUE + +TORRENT_CONFIG_FILE = 'torrent_config' + +alt_uiname = {'bittorrent':'btdownloadgui', + 'maketorrent':'btmaketorrentgui',} + +def _read_config(filename): + # check for bad config files (Windows corrupts them all the time) + p = RawConfigParser() + fp = None + try: + fp = open(filename) + except IOError: + pass + + if fp is not None: + try: + p.readfp(fp, filename=filename) + except MissingSectionHeaderError: + fp.close() + del fp + bad_config(filename) + except ParsingError: + fp.close() + del fp + bad_config(filename) + else: + fp.close() + return p + + +def _write_config(error_callback, filename, p): + try: + f = file(filename, 'w') + p.write(f) + f.close() + except Exception, e: + try: + f.close() + except: + pass + error_callback(ERROR, _("Could not permanently save options: ")+ + str(e)) + + +def bad_config(filename): + base_bad_filename = filename + '.broken' + bad_filename = base_bad_filename + i = 0 + while os.access(bad_filename, os.F_OK): + bad_filename = base_bad_filename + str(i) + i+=1 + os.rename(filename, bad_filename) + sys.stderr.write(("Error reading config file. " + "Old config file stored in \"%s\"") % bad_filename) + + +def get_config(defaults, section): + dir_root = get_config_dir() + + if dir_root is None: + return {} + + configdir = os.path.join(dir_root, '.bittorrent') + + if not os.path.isdir(configdir): + try: + os.mkdir(configdir, 0700) + except: + pass + + p = _read_config(os.path.join(configdir, 'config')) + values = {} + if p.has_section(section): + for name, value in p.items(section): + if name in defaults: + values[name] = value + if p.has_section('common'): + for name, value in p.items('common'): + if name in defaults and name not in values: + values[name] = value + if defaults.get('data_dir') == '' and \ + 'data_dir' not in values and os.path.isdir(configdir): + datadir = os.path.join(configdir, 'data') + values['data_dir'] = datadir + parseargs.parse_options(defaults, values) + return values + + +def save_ui_config(defaults, section, save_options, error_callback): + filename = os.path.join(defaults['data_dir'], 'ui_config') + p = _read_config(filename) + p.remove_section(section) + p.add_section(section) + for name in save_options: + if defaults.has_key(name): + p.set(section, name, defaults[name]) + else: + err_str = "Configuration option mismatch: '%s'" % name + if is_frozen_exe: + err_str = "You must quit %s and reinstall it. (%s)" % (app_name, err_str) + error_callback(ERROR, err_str) + _write_config(error_callback, filename, p) + + +def save_torrent_config(path, infohash, config, error_callback): + section = infohash.encode('hex') + filename = os.path.join(path, TORRENT_CONFIG_FILE) + p = _read_config(filename) + p.remove_section(section) + p.add_section(section) + for key, value in config.items(): + p.set(section, key, value) + _write_config(error_callback, filename, p) + +def read_torrent_config(global_config, path, infohash, error_callback): + section = infohash.encode('hex') + filename = os.path.join(path, TORRENT_CONFIG_FILE) + p = _read_config(filename) + if not p.has_section(section): + return {} + else: + c = {} + for name, value in p.items(section): + if global_config.has_key(name): + t = type(global_config[name]) + if t == bool: + c[name] = value in ('1', 'True', MYTRUE, True) + else: + c[name] = type(global_config[name])(value) + return c + +def remove_torrent_config(path, infohash, error_callback): + section = infohash.encode('hex') + filename = os.path.join(path, TORRENT_CONFIG_FILE) + p = _read_config(filename) + if p.has_section(section): + p.remove_section(section) + _write_config(error_callback, filename, p) + +def parse_configuration_and_args(defaults, uiname, arglist=[], minargs=0, + maxargs=0): + defconfig = dict([(name, value) for (name, value, doc) in defaults]) + if arglist[0:] == ['--version']: + print version + sys.exit(0) + + if arglist[0:] in (['--help'], ['-h'], ['--usage'], ['-?']): + parseargs.printHelp(uiname, defaults) + sys.exit(0) + + presets = get_config(defconfig, uiname) + config, args = parseargs.parseargs(arglist, defaults, minargs, maxargs, + presets) + datadir = config['data_dir'] + if datadir: + if uiname in ('bittorrent', 'maketorrent'): + values = {} + p = _read_config(os.path.join(datadir, 'ui_config')) + if not p.has_section(uiname) and p.has_section(alt_uiname[uiname]): + uiname = alt_uiname[uiname] + if p.has_section(uiname): + for name, value in p.items(uiname): + if name in defconfig: + values[name] = value + parseargs.parse_options(defconfig, values) + presets.update(values) + config, args = parseargs.parseargs(arglist, defaults, minargs, + maxargs, presets) + + for d in ('', 'resume', 'metainfo'): + ddir = os.path.join(datadir, d) + try: + if not os.path.exists(ddir): + os.mkdir(ddir, 0700) + except: + pass + + if config['language'] != '': + try: + lang = gettext.translation('bittorrent', locale_root, + languages=[config['language']]) + lang.install() + except IOError: + # don't raise an error, just continue untranslated + sys.stderr.write('Could not find translation for language "%s"\n' % + config['language']) + + return config, args diff --git a/BitTorrent/controlsocket.py b/BitTorrent/controlsocket.py new file mode 100755 index 0000000..b5b8c5b --- /dev/null +++ b/BitTorrent/controlsocket.py @@ -0,0 +1,312 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written my Uoti Urpala +from __future__ import generators + +import os +import socket +import sys +if sys.platform.startswith('win'): + import win32api + import win32event + import winerror + +from binascii import b2a_hex + +from BitTorrent.RawServer_magic import RawServer, Handler +from BitTorrent.platform import get_home_dir, get_config_dir +from BitTorrent import BTFailure, app_name + +def toint(s): + return int(b2a_hex(s), 16) + +def tobinary(i): + return (chr(i >> 24) + chr((i >> 16) & 0xFF) + + chr((i >> 8) & 0xFF) + chr(i & 0xFF)) + +CONTROL_SOCKET_PORT = 46881 + +class ControlsocketListener(Handler): + + def __init__(self, callback): + self.callback = callback + + def connection_made(self, connection): + connection.handler = MessageReceiver(self.callback) + + +class MessageReceiver(Handler): + + def __init__(self, callback): + self.callback = callback + self._buffer = [] + self._buffer_len = 0 + self._reader = self._read_messages() + self._next_len = self._reader.next() + + def _read_messages(self): + while True: + yield 4 + l = toint(self._message) + yield l + action = self._message + + if action in ('no-op',): + self.callback(action, None) + else: + yield 4 + l = toint(self._message) + yield l + data = self._message + if action in ('show_error',): + self.callback(action, data) + else: + yield 4 + l = toint(self._message) + yield l + path = self._message + if action in ('start_torrent'): + self.callback(action, data, path) + + # copied from Connecter.py + def data_came_in(self, conn, s): + while True: + i = self._next_len - self._buffer_len + if i > len(s): + self._buffer.append(s) + self._buffer_len += len(s) + return + m = s[:i] + if self._buffer_len > 0: + self._buffer.append(m) + m = ''.join(self._buffer) + self._buffer = [] + self._buffer_len = 0 + s = s[i:] + self._message = m + try: + self._next_len = self._reader.next() + except StopIteration: + self._reader = None + conn.close() + return + + def connection_lost(self, conn): + self._reader = None + pass + + def connection_flushed(self, conn): + pass + + +class ControlSocket(object): + + def __init__(self, config): + self.port = CONTROL_SOCKET_PORT + self.mutex = None + self.master = 0 + + self.socket_filename = os.path.join(config['data_dir'], 'ui_socket') + + self.rawserver = None + self.controlsocket = None + + def set_rawserver(self, rawserver): + self.rawserver = rawserver + + def start_listening(self, callback): + self.rawserver.start_listening(self.controlsocket, + ControlsocketListener(callback)) + + def create_socket_inet(self, port = CONTROL_SOCKET_PORT): + + try: + controlsocket = RawServer.create_serversocket(port, + '127.0.0.1', reuse=True) + except socket.error, e: + raise BTFailure(_("Could not create control socket: ")+str(e)) + + self.controlsocket = controlsocket + +## def send_command_inet(self, rawserver, action, data = ''): +## r = MessageReceiver(lambda action, data: None) +## try: +## conn = rawserver.start_connection(('127.0.0.1', CONTROL_SOCKET_PORT), r) +## except socket.error, e: +## raise BTFailure(_("Could not send command: ") + str(e)) +## conn.write(tobinary(len(action))) +## conn.write(action) +## conn.write(tobinary(len(data))) +## conn.write(data) + + #blocking version without rawserver + def send_command_inet(self, action, *datas): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect(('127.0.0.1', self.port)) + s.send(tobinary(len(action))) + s.send(action) + for data in datas: + s.send(tobinary(len(data))) + s.send(data) + s.close() + except socket.error, e: + try: + s.close() + except: + pass + raise BTFailure(_("Could not send command: ") + str(e)) + + def create_socket_unix(self): + filename = self.socket_filename + if os.path.exists(filename): + try: + self.send_command_unix('no-op') + except BTFailure: + pass + else: + raise BTFailure(_("Could not create control socket: already in use")) + + try: + os.unlink(filename) + except OSError, e: + raise BTFailure(_("Could not remove old control socket filename:") + + str(e)) + try: + controlsocket = RawServer.create_unixserversocket(filename) + except socket.error, e: + raise BTFailure(_("Could not create control socket: ")+str(e)) + + self.controlsocket = controlsocket + +## def send_command_unix(self, rawserver, action, data = ''): +## s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) +## filename = self.socket_filename +## try: +## s.connect(filename) +## except socket.error, e: +## raise BTFailure(_("Could not send command: ") + str(e)) +## r = MessageReceiver(lambda action, data: None) +## conn = rawserver.wrap_socket(s, r, ip = s.getpeername()) +## conn.write(tobinary(len(action))) +## conn.write(action) +## conn.write(tobinary(len(data))) +## conn.write(data) + + # blocking version without rawserver + def send_command_unix(self, action, *datas): + s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + filename = self.socket_filename + try: + s.connect(filename) + s.send(tobinary(len(action))) + s.send(action) + for data in datas: + s.send(tobinary(len(data))) + s.send(data) + s.close() + except socket.error, e: + s.close() + raise BTFailure(_("Could not send command: ") + str(e)) + + def close_socket(self): + self.rawserver.stop_listening(self.controlsocket) + self.controlsocket.close() + + def get_sic_path(self): + directory = get_config_dir() + configdir = os.path.join(directory, '.bittorrent') + filename = os.path.join(configdir, ".btcontrol") + return filename + + def create_sic_socket(self): + obtain_mutex = 1 + mutex = win32event.CreateMutex(None, obtain_mutex, app_name) + + # prevent the PyHANDLE from going out of scope, ints are fine + self.mutex = int(mutex) + mutex.Detach() + + lasterror = win32api.GetLastError() + + if lasterror == winerror.ERROR_ALREADY_EXISTS: + raise BTFailure(_("Global mutex already created.")) + + self.master = 1 + + # where is the lower limit of the window random port pool? this should stop there + port_limit = 50000 + while self.port < port_limit: + try: + self.create_socket_inet(self.port) + break + except BTFailure: + self.port += 1 + + if self.port >= port_limit: + raise BTFailure(_("Could not find an open port!")) + + filename = self.get_sic_path() + (path, name) = os.path.split(filename) + try: + os.makedirs(path) + except OSError, e: + # 17 is dir exists + if e.errno != 17: + BTFailure(_("Could not create application data directory!")) + f = open(filename, "w") + f.write(str(self.port)) + f.close() + + # we're done writing the control file, release the mutex so other instances can lock it and read the file + # but don't destroy the handle until the application closes, so that the names mutex is still around + win32event.ReleaseMutex(self.mutex) + + def discover_sic_socket(self): + # mutex exists and has been opened (not created). wait for it so we can read the file + r = win32event.WaitForSingleObject(self.mutex, win32event.INFINITE) + + # WAIT_OBJECT_0 means the mutex was obtained + # WAIT_ABANDONED means the mutex was obtained, and it had previously been abandoned + if (r != win32event.WAIT_OBJECT_0) and (r != win32event.WAIT_ABANDONED): + BTFailure(_("Could not acquire global mutex lock for controlsocket file!")) + + filename = self.get_sic_path() + try: + f = open(filename, "r") + self.port = int(f.read()) + f.close() + except: + self.port = CONTROL_SOCKET_PORT + if (r != win32event.WAIT_ABANDONED): + sys.stderr.write(_("A previous instance of BT was not cleaned up properly. Continuing.")) + # what I should really do here is assume the role of master. + + # we're done reading the control file, release the mutex so other instances can lock it and read the file + win32event.ReleaseMutex(self.mutex) + + def close_sic_socket(self): + if self.master: + r = win32event.WaitForSingleObject(self.mutex, win32event.INFINITE) + filename = self.get_sic_path() + os.remove(filename) + self.master = 0 + win32event.ReleaseMutex(self.mutex) + # close it so the named mutex goes away + win32api.CloseHandle(self.mutex) + self.mutex = None + + if sys.platform.startswith('win'): + send_command = send_command_inet + create_socket = create_sic_socket + else: + send_command = send_command_unix + create_socket = create_socket_unix diff --git a/BitTorrent/defaultargs.py b/BitTorrent/defaultargs.py new file mode 100755 index 0000000..2edebe3 --- /dev/null +++ b/BitTorrent/defaultargs.py @@ -0,0 +1,267 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + + +# False and True are not distinct from 0 and 1 under Python 2.2, +# and we want to handle boolean options differently. +class MyBool(object): + + def __init__(self, value): + self.value = value + + def __repr__(self): + if self.value: + return 'True' + return 'False' + + def __nonzero__(self): + return self.value + +MYTRUE = MyBool(True) +MYFALSE = MyBool(False) + +from BitTorrent import languages + +basic_options = [ + ('data_dir', '', + _("directory under which variable data such as fastresume information " + "and GUI state is saved. Defaults to subdirectory 'data' of the " + "bittorrent config directory.")), + ('filesystem_encoding', '', + _("character encoding used on the local filesystem. " + "If left empty, autodetected. " + "Autodetection doesn't work under python versions older than 2.3")), + ('language', '', + _("ISO Language code to use") + ': ' + ', '.join(languages)), + ] + +common_options = [ + ('ip', '', + _("ip to report to the tracker (has no effect unless you are on the same " + "local network as the tracker)")), + ('forwarded_port', 0, + _("world-visible port number if it's different from the one the client " + "listens on locally")), + ('minport', 6881, + _("minimum port to listen on, counts up if unavailable")), + ('maxport', 6999, + _("maximum port to listen on")), + ('bind', '', + _("ip to bind to locally")), + ('display_interval', .5, + _("seconds between updates of displayed information")), + ('rerequest_interval', 5 * 60, + _("minutes to wait between requesting more peers")), + ('min_peers', 20, + _("minimum number of peers to not do rerequesting")), + ('max_initiate', 40, + _("number of peers at which to stop initiating new connections")), + ('max_allow_in', 80, + _("maximum number of connections to allow, after this new incoming " + "connections will be immediately closed")), + ('check_hashes', MYTRUE, + _("whether to check hashes on disk")), + ('max_upload_rate', 20, + _("maximum kB/s to upload at, 0 means no limit")), + ('min_uploads', 2, + _("the number of uploads to fill out to with extra optimistic unchokes")), + ('max_files_open', 50, + _("the maximum number of files in a multifile torrent to keep open at a " + "time, 0 means no limit. Used to avoid running out of file descriptors.")), + ('start_trackerless_client', MYTRUE, + _("Initialize a trackerless client. This must be enabled in order to download trackerless torrents.")) + ] + + +rare_options = [ + ('keepalive_interval', 120.0, + _("number of seconds to pause between sending keepalives")), + ('download_slice_size', 2 ** 14, + _("how many bytes to query for per request.")), + ('max_message_length', 2 ** 23, + _("maximum length prefix encoding you'll accept over the wire - larger " + "values get the connection dropped.")), + ('socket_timeout', 300.0, + _("seconds to wait between closing sockets which nothing has been " + "received on")), + ('timeout_check_interval', 60.0, + _("seconds to wait between checking if any connections have timed out")), + ('max_slice_length', 16384, + _("maximum length slice to send to peers, close connection if a larger " + "request is received")), + ('max_rate_period', 20.0, + _("maximum time interval over which to estimate the current upload and download rates")), + ('max_rate_period_seedtime', 100.0, + _("maximum time interval over which to estimate the current seed rate")), + ('max_announce_retry_interval', 1800, + _("maximum time to wait between retrying announces if they keep failing")), + ('snub_time', 30.0, + _("seconds to wait for data to come in over a connection before assuming " + "it's semi-permanently choked")), + ('rarest_first_cutoff', 4, + _("number of downloads at which to switch from random to rarest first")), + ('upload_unit_size', 1380, + _("how many bytes to write into network buffers at once.")), + ('retaliate_to_garbled_data', MYTRUE, + _("refuse further connections from addresses with broken or intentionally " + "hostile peers that send incorrect data")), + ('one_connection_per_ip', MYTRUE, + _("do not connect to several peers that have the same IP address")), + ('peer_socket_tos', 8, + _("if nonzero, set the TOS option for peer connections to this value")), + ('bad_libc_workaround', MYFALSE, + _("enable workaround for a bug in BSD libc that makes file reads very slow.")), + ('tracker_proxy', '', + _("address of HTTP proxy to use for tracker connections")), + ('close_with_rst', 0, + _("close connections with RST and avoid the TCP TIME_WAIT state")), + ('twisted', -1, + _("Use Twisted network libraries for network connections. 1 means use twisted, 0 means do not use twisted, -1 means autodetect, and prefer twisted")), + ] + + +def get_defaults(ui): + assert ui in ("bittorrent" , "bittorrent-curses", "bittorrent-console" , + "maketorrent", "maketorrent-console", + "launchmany-curses", "launchmany-console" , + ) + r = [] + + if ui.startswith('bittorrent') or ui.startswith('launchmany'): + r.extend(common_options) + + if ui == 'bittorrent': + r.extend([ + ('save_as', '', + _("file name (for single-file torrents) or directory name (for " + "batch torrents) to save the torrent as, overriding the default " + "name in the torrent. See also --save_in, if neither is " + "specified the user will be asked for save location")), + ('advanced', MYFALSE, + _("display advanced user interface")), + ('next_torrent_time', 300, + _("the maximum number of minutes to seed a completed torrent " + "before stopping seeding")), + ('next_torrent_ratio', 80, + _("the minimum upload/download ratio, in percent, to achieve " + "before stopping seeding. 0 means no limit.")), + ('last_torrent_ratio', 0, + _("the minimum upload/download ratio, in percent, to achieve " + "before stopping seeding the last torrent. 0 means no limit.")), + ('seed_forever', MYFALSE, + _("Seed each completed torrent indefinitely " + "(until the user cancels it)")), + ('seed_last_forever', MYTRUE, + _("Seed the last torrent indefinitely " + "(until the user cancels it)")), + ('pause', MYFALSE, + _("start downloader in paused state")), + ('start_torrent_behavior', 'replace', + _('specifies how the app should behave when the user manually ' + 'tries to start another torrent: "replace" means always replace ' + 'the running torrent with the new one, "add" means always add ' + 'the running torrent in parallel, and "ask" means ask the user ' + 'each time.')), + ('open_from', '', + 'local directory to look in for .torrent files to open'), + ('ask_for_save', MYFALSE, + 'whether or not to ask for a location to save downloaded files in'), + ]) + + if ui in ('bittorrent-console', 'bittorrent-curses'): + r.append( + ('save_as', '', + _("file name (for single-file torrents) or directory name (for " + "batch torrents) to save the torrent as, overriding the " + "default name in the torrent. See also --save_in"))) + + if ui.startswith('bittorrent'): + r.extend([ + ('max_uploads', -1, + _("the maximum number of uploads to allow at once. -1 means a " + "(hopefully) reasonable number based on --max_upload_rate. " + "The automatic values are only sensible when running one " + "torrent at a time.")), + ('save_in', '', + _("local directory where the torrent contents will be saved. The " + "file (single-file torrents) or directory (batch torrents) will " + "be created under this directory using the default name " + "specified in the .torrent file. See also --save_as.")), + ('responsefile', '', + _("deprecated, do not use")), + ('url', '', + _("deprecated, do not use")), + ('ask_for_save', 0, + _("whether or not to ask for a location to save downloaded files in")), + ]) + + if ui.startswith('launchmany'): + r.extend([ + ('max_uploads', 6, + _("the maximum number of uploads to allow at once. -1 means a " + "(hopefully) reasonable number based on --max_upload_rate. The " + "automatic values are only sensible when running one torrent at " + "a time.")), + ('save_in', '', + _("local directory where the torrents will be saved, using a " + "name determined by --saveas_style. If this is left empty " + "each torrent will be saved under the directory of the " + "corresponding .torrent file")), + ('parse_dir_interval', 60, + _("how often to rescan the torrent directory, in seconds") ), + ('saveas_style', 4, + _("How to name torrent downloads: " + "1: use name OF torrent file (minus .torrent); " + "2: use name encoded IN torrent file; " + "3: create a directory with name OF torrent file " + "(minus .torrent) and save in that directory using name " + "encoded IN torrent file; " + "4: if name OF torrent file (minus .torrent) and name " + "encoded IN torrent file are identical, use that " + "name (style 1/2), otherwise create an intermediate " + "directory as in style 3; " + "CAUTION: options 1 and 2 have the ability to " + "overwrite files without warning and may present " + "security issues." + ) ), + ('display_path', ui == 'launchmany-console' and MYTRUE or MYFALSE, + _("whether to display the full path or the torrent contents for " + "each torrent") ), + ]) + + if ui.startswith('launchmany') or ui == 'maketorrent': + r.append( + ('torrent_dir', '', + _("directory to look for .torrent files (semi-recursive)")),) + + if ui in ('bittorrent-curses', 'bittorrent-console'): + r.append( + ('spew', MYFALSE, + _("whether to display diagnostic info to stdout"))) + + if ui.startswith('maketorrent'): + r.extend([ + ('piece_size_pow2', 18, + _("which power of two to set the piece size to")), + ('tracker_name', 'http://my.tracker:6969/announce', + _("default tracker name")), + ('tracker_list', '', ''), + ('use_tracker', MYTRUE, + _("if false then make a trackerless torrent, instead of " + "announce URL, use reliable node in form of : or an " + "empty string to pull some nodes from your routing table")), + ]) + + r.extend(basic_options) + + if ui.startswith('bittorrent') or ui.startswith('launchmany'): + r.extend(rare_options) + + return r diff --git a/BitTorrent/defer.py b/BitTorrent/defer.py new file mode 100755 index 0000000..4531271 --- /dev/null +++ b/BitTorrent/defer.py @@ -0,0 +1,56 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +class Deferred(object): + def __init__(self): + self.callbacks = [] + self.errbacks = [] + self.calledBack = False + self.erredBack = False + self.results = [] + self.failures = [] + + def addCallback(self, cb, args=(), kwargs={}): + assert callable(cb) + self.callbacks.append((cb, args, kwargs)) + if self.calledBack: + self.doCallbacks(self.results, [(cb, args, kwargs)]) + return self + + def addErrback(self, cb, args=(), kwargs={}): + assert callable(cb) + self.errbacks.append((cb, args, kwargs)) + if self.erredBack: + self.doCallbacks(self.failures, [(cb, args, kwargs)]) + return self + + def addCallbacks(self, cb, eb, args=(), kwargs={}, + ebargs=(), ebkwargs={}): + assert callable(cb) + assert callable(eb) + self.addCallback(cb, args, kwargs) + self.addErrback(eb, ebargs, ebkwargs) + + def callback(self, result): + self.results.append(result) + self.calledBack = True + if self.callbacks: + self.doCallbacks([result], self.callbacks) + + def errback(self, failed): + self.failures.append(failed) + self.erredBack = True + if self.errbacks: + self.doCallbacks([failed], self.errbacks) + + def doCallbacks(self, results, callbacks): + for result in results: + for cb, args, kwargs in callbacks: + result = cb(result, *args, **kwargs) diff --git a/BitTorrent/download.py b/BitTorrent/download.py new file mode 100755 index 0000000..5d7f91c --- /dev/null +++ b/BitTorrent/download.py @@ -0,0 +1,583 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen and Uoti Urpala + +from __future__ import division +# required for python 2.2 +from __future__ import generators + +import os +import sys +import threading +import errno +import gc +from sha import sha +from socket import error as socketerror +from random import seed +from time import time +from cStringIO import StringIO +from traceback import print_exc +from math import sqrt +try: + getpid = os.getpid +except AttributeError: + def getpid(): + return 1 + +from BitTorrent.btformats import check_message +from BitTorrent.Choker import Choker +from BitTorrent.Storage import Storage, FilePool +from BitTorrent.StorageWrapper import StorageWrapper +from BitTorrent.Uploader import Upload +from BitTorrent.Downloader import Downloader +from BitTorrent.Encoder import Encoder, SingleportListener + +from BitTorrent.RateLimiter import MultiRateLimiter as RateLimiter +from BitTorrent.RateLimiter import RateLimitedGroup + +from BitTorrent.RawServer_magic import RawServer +from BitTorrent.Rerequester import Rerequester, DHTRerequester +from BitTorrent.DownloaderFeedback import DownloaderFeedback +from BitTorrent.RateMeasure import RateMeasure +from BitTorrent.CurrentRateMeasure import Measure +from BitTorrent.PiecePicker import PiecePicker +from BitTorrent.ConvertedMetainfo import set_filesystem_encoding +from BitTorrent import version +from BitTorrent import BTFailure, BTShutdown, INFO, WARNING, ERROR, CRITICAL + +from khashmir.utkhashmir import UTKhashmir +from khashmir import const + +class Feedback(object): + + def finished(self, torrent): + pass + + def failed(self, torrent, is_external): + pass + + def error(self, torrent, level, text): + pass + + def exception(self, torrent, text): + self.error(torrent, CRITICAL, text) + + def started(self, torrent): + pass + + +class Multitorrent(object): + + def __init__(self, config, doneflag, errorfunc, listen_fail_ok=False): + self.dht = None + self.config = config + self.errorfunc = errorfunc + self.rawserver = RawServer(doneflag, config, errorfunc=errorfunc, + tos=config['peer_socket_tos']) + self.singleport_listener = SingleportListener(self.rawserver) + self.ratelimiter = RateLimiter(self.rawserver.add_task) + self.ratelimiter.set_parameters(config['max_upload_rate'], + config['upload_unit_size']) + self._find_port(listen_fail_ok) + self.filepool = FilePool(config['max_files_open']) + set_filesystem_encoding(config['filesystem_encoding'], + errorfunc) + + + def _find_port(self, listen_fail_ok=True): + e = _("maxport less than minport - no ports to check") + if self.config['minport'] <= 0: + self.config['minport'] = 1 + for port in xrange(self.config['minport'], self.config['maxport'] + 1): + try: + self.singleport_listener.open_port(port, self.config) + if self.config['start_trackerless_client']: + self.dht = UTKhashmir(self.config['bind'], + self.singleport_listener.get_port(), + self.config['data_dir'], self.rawserver, + int(self.config['max_upload_rate'] * 1024 * 0.01), + rlcount=self.ratelimiter.increase_offset, + config=self.config) + break + except socketerror, e: + pass + else: + if not listen_fail_ok: + raise BTFailure, _("Could not open a listening port: %s.") % str(e) + self.errorfunc(CRITICAL, + _("Could not open a listening port: %s. ") % + str(e) + + _("Check your port range settings.")) + + def close_listening_socket(self): + self.singleport_listener.close_sockets() + + def start_torrent(self, metainfo, config, feedback, filename): + torrent = _SingleTorrent(self.rawserver, self.singleport_listener, + self.ratelimiter, self.filepool, config, self.dht) + torrent.rlgroup = RateLimitedGroup(config['max_upload_rate'], torrent.got_exception) + self.rawserver.add_context(torrent) + def start(): + torrent.start_download(metainfo, feedback, filename) + self.rawserver.external_add_task(start, 0, context=torrent) + return torrent + + def set_option(self, option, value): + self.config[option] = value + if option in ['max_upload_rate', 'upload_unit_size']: + self.ratelimiter.set_parameters(self.config['max_upload_rate'], + self.config['upload_unit_size']) + elif option == 'max_files_open': + self.filepool.set_max_files_open(value) + elif option == 'maxport': + if not self.config['minport'] <= self.singleport_listener.port <= \ + self.config['maxport']: + self._find_port() + + def get_completion(self, config, metainfo, save_path, filelist=False): + if not config['data_dir']: + return None + infohash = metainfo.infohash + if metainfo.is_batch: + myfiles = [os.path.join(save_path, f) for f in metainfo.files_fs] + else: + myfiles = [save_path] + + if metainfo.total_bytes == 0: + if filelist: + return None + return 1 + try: + s = Storage(None, None, zip(myfiles, metainfo.sizes), + check_only=True) + except: + return None + filename = os.path.join(config['data_dir'], 'resume', + infohash.encode('hex')) + try: + f = file(filename, 'rb') + except: + f = None + try: + r = s.check_fastresume(f, filelist, metainfo.piece_length, + len(metainfo.hashes), myfiles) + except: + r = None + if f is not None: + f.close() + if r is None: + return None + if filelist: + return r[0] / metainfo.total_bytes, r[1], r[2] + return r / metainfo.total_bytes + + +class _SingleTorrent(object): + + def __init__(self, rawserver, singleport_listener, ratelimiter, filepool, + config, dht): + self._rawserver = rawserver + self._singleport_listener = singleport_listener + self._ratelimiter = ratelimiter + self._filepool = filepool + self._dht = dht + self._storage = None + self._storagewrapper = None + self._ratemeasure = None + self._upmeasure = None + self._downmeasure = None + self._encoder = None + self._rerequest = None + self._statuscollecter = None + self._announced = False + self._listening = False + self.reserved_ports = [] + self.reported_port = None + self._myfiles = None + self.started = False + self.is_seed = False + self.closed = False + self.infohash = None + self.total_bytes = None + self._doneflag = threading.Event() + self.finflag = threading.Event() + self._hashcheck_thread = None + self._contfunc = None + self._activity = (_("Initial startup"), 0) + self.feedback = None + self.errors = [] + self.rlgroup = None + self.config = config + + def start_download(self, *args, **kwargs): + it = self._start_download(*args, **kwargs) + def cont(): + try: + it.next() + except StopIteration: + self._contfunc = None + def contfunc(): + self._rawserver.external_add_task(cont, 0, context=self) + self._contfunc = contfunc + contfunc() + + def _start_download(self, metainfo, feedback, save_path): + self.feedback = feedback + config = self.config + + self.infohash = metainfo.infohash + self.total_bytes = metainfo.total_bytes + if not metainfo.reported_errors: + metainfo.show_encoding_errors(self._error) + + myid = self._make_id() + seed(myid) + def schedfunc(func, delay): + self._rawserver.add_task(func, delay, context=self) + def externalsched(func, delay): + self._rawserver.external_add_task(func, delay, context=self) + if metainfo.is_batch: + myfiles = [os.path.join(save_path, f) for f in metainfo.files_fs] + else: + myfiles = [save_path] + self._filepool.add_files(myfiles, self) + self._myfiles = myfiles + self._storage = Storage(config, self._filepool, zip(myfiles, + metainfo.sizes)) + resumefile = None + if config['data_dir']: + filename = os.path.join(config['data_dir'], 'resume', + self.infohash.encode('hex')) + if os.path.exists(filename): + try: + resumefile = file(filename, 'rb') + if self._storage.check_fastresume(resumefile) == 0: + resumefile.close() + resumefile = None + except Exception, e: + self._error(WARNING, + _("Could not load fastresume data: %s.") % str(e) + + ' ' + _("Will perform full hash check.")) + if resumefile is not None: + resumefile.close() + resumefile = None + def data_flunked(amount, index): + self._ratemeasure.data_rejected(amount) + self._error(INFO, + _("piece %d failed hash check, re-downloading it") + % index) + backthread_exception = [] + def errorfunc(level, text): + def e(): + self._error(level, text) + externalsched(e, 0) + def hashcheck(): + def statusfunc(activity = None, fractionDone = 0): + if activity is None: + activity = self._activity[0] + self._activity = (activity, fractionDone) + try: + self._storagewrapper = StorageWrapper(self._storage, + config, metainfo.hashes, metainfo.piece_length, + self._finished, statusfunc, self._doneflag, data_flunked, + self.infohash, errorfunc, resumefile) + except: + backthread_exception.append(sys.exc_info()) + self._contfunc() + thread = threading.Thread(target = hashcheck) + thread.setDaemon(False) + self._hashcheck_thread = thread + thread.start() + yield None + self._hashcheck_thread = None + if resumefile is not None: + resumefile.close() + if backthread_exception: + a, b, c = backthread_exception[0] + raise a, b, c + + if self._storagewrapper.amount_left == 0: + self._finished() + choker = Choker(config, schedfunc, self.finflag.isSet) + upmeasure = Measure(config['max_rate_period']) + upmeasure_seedtime = Measure(config['max_rate_period_seedtime']) + downmeasure = Measure(config['max_rate_period']) + self._upmeasure = upmeasure + self._upmeasure_seedtime = upmeasure_seedtime + self._downmeasure = downmeasure + self._ratemeasure = RateMeasure(self._storagewrapper. + amount_left_with_partials) + picker = PiecePicker(len(metainfo.hashes), config) + for i in xrange(len(metainfo.hashes)): + if self._storagewrapper.do_I_have(i): + picker.complete(i) + for i in self._storagewrapper.stat_dirty: + picker.requested(i) + def kickpeer(connection): + def kick(): + connection.close() + schedfunc(kick, 0) + def banpeer(ip): + self._encoder.ban(ip) + downloader = Downloader(config, self._storagewrapper, picker, + len(metainfo.hashes), downmeasure, self._ratemeasure.data_came_in, + kickpeer, banpeer) + def make_upload(connection): + return Upload(connection, self._ratelimiter, upmeasure, + upmeasure_seedtime, choker, self._storagewrapper, + config['max_slice_length'], config['max_rate_period']) + + + self.reported_port = self.config['forwarded_port'] + if not self.reported_port: + self.reported_port = self._singleport_listener.get_port() + self.reserved_ports.append(self.reported_port) + + if self._dht: + addContact = self._dht.addContact + else: + addContact = None + self._encoder = Encoder(make_upload, downloader, choker, + len(metainfo.hashes), self._ratelimiter, self._rawserver, + config, myid, schedfunc, self.infohash, self, addContact, self.reported_port) + + self._singleport_listener.add_torrent(self.infohash, self._encoder) + self._listening = True + if metainfo.is_trackerless: + if not self._dht: + self._error(self, CRITICAL, _("Attempt to download a trackerless torrent with trackerless client turned off.")) + return + else: + if len(self._dht.table.findNodes(metainfo.infohash, invalid=False)) < const.K: + for host, port in metainfo.nodes: + self._dht.addContact(host, port) + self._rerequest = DHTRerequester(config, + schedfunc, self._encoder.how_many_connections, + self._encoder.start_connection, externalsched, + self._storagewrapper.get_amount_left, upmeasure.get_total, + downmeasure.get_total, self.reported_port, myid, + self.infohash, self._error, self.finflag, upmeasure.get_rate, + downmeasure.get_rate, self._encoder.ever_got_incoming, + self.internal_shutdown, self._announce_done, self._dht) + else: + self._rerequest = Rerequester(metainfo.announce, config, + schedfunc, self._encoder.how_many_connections, + self._encoder.start_connection, externalsched, + self._storagewrapper.get_amount_left, upmeasure.get_total, + downmeasure.get_total, self.reported_port, myid, + self.infohash, self._error, self.finflag, upmeasure.get_rate, + downmeasure.get_rate, self._encoder.ever_got_incoming, + self.internal_shutdown, self._announce_done) + + self._statuscollecter = DownloaderFeedback(choker, upmeasure.get_rate, + upmeasure_seedtime.get_rate, downmeasure.get_rate, + upmeasure.get_total, downmeasure.get_total, + self._ratemeasure.get_time_left, self._ratemeasure.get_size_left, + self.total_bytes, self.finflag, downloader, self._myfiles, + self._encoder.ever_got_incoming, self._rerequest) + + self._announced = True + if self._dht and len(self._dht.table.findNodes(self.infohash)) == 0: + self._rawserver.add_task(self._dht.findCloseNodes, 5) + self._rawserver.add_task(self._rerequest.begin, 20) + else: + self._rerequest.begin() + self.started = True + if not self.finflag.isSet(): + self._activity = (_("downloading"), 0) + self.feedback.started(self) + + def got_exception(self, e): + is_external = False + if isinstance(e, BTShutdown): + self._error(ERROR, str(e)) + is_external = True + elif isinstance(e, BTFailure): + self._error(CRITICAL, str(e)) + self._activity = ( _("download failed: ") + str(e), 0) + elif isinstance(e, IOError): + msg = 'IO Error ' + str(e) + if e.errno == errno.ENOSPC: + msg = _("IO Error: No space left on disk, " + "or cannot create a file that large:") + str(e) + self._error(CRITICAL, msg) + self._activity = (_("killed by IO error: ") + str(e), 0) + elif isinstance(e, OSError): + self._error(CRITICAL, 'OS Error ' + str(e)) + self._activity = (_("killed by OS error: ") + str(e), 0) + else: + data = StringIO() + print_exc(file=data) + self._error(CRITICAL, data.getvalue(), True) + self._activity = (_("killed by internal exception: ") + str(e), 0) + try: + self._close() + except Exception, e: + self._error(ERROR, + _("Additional error when closing down due to error: ") + + str(e)) + if is_external: + self.feedback.failed(self, True) + return + if self.config['data_dir'] and self._storage is not None: + filename = os.path.join(self.config['data_dir'], 'resume', + self.infohash.encode('hex')) + if os.path.exists(filename): + try: + os.remove(filename) + except Exception, e: + self._error(WARNING, + _("Could not remove fastresume file after " + "failure:") + + str(e)) + self.feedback.failed(self, False) + + def _finished(self): + self.finflag.set() + # Call self._storage.close() to flush buffers and change files to + # read-only mode (when they're possibly reopened). Let exceptions + # from self._storage.close() kill the torrent since files might not + # be correct on disk if file.close() failed. + self._storage.close() + # If we haven't announced yet, normal first announce done later will + # tell the tracker about seed status. + self.is_seed = True + if self._announced: + self._rerequest.announce_finish() + self._activity = (_("seeding"), 1) + if self.config['check_hashes']: + self._save_fastresume(True) + self.feedback.finished(self) + + def _save_fastresume(self, on_finish=False): + if not on_finish and (self.finflag.isSet() or not self.started): + return + if not self.config['data_dir']: + return + if on_finish: # self._ratemeasure might not exist yet + amount_done = self.total_bytes + else: + amount_done = self.total_bytes - self._ratemeasure.get_size_left() + filename = os.path.join(self.config['data_dir'], 'resume', + self.infohash.encode('hex')) + resumefile = None + try: + resumefile = file(filename, 'wb') + self._storage.write_fastresume(resumefile, amount_done) + self._storagewrapper.write_fastresume(resumefile) + resumefile.close() + except Exception, e: + self._error(WARNING, _("Could not write fastresume data: ") + str(e)) + if resumefile is not None: + resumefile.close() + + def shutdown(self): + if self.closed: + return + try: + self._close() + self._save_fastresume() + self._activity = (_("shut down"), 0) + except Exception, e: + self.got_exception(e) + + def internal_shutdown(self, level, text): + # This is only called when announce fails with no peers, + # don't try to announce again telling we're leaving the torrent + self._announced = False + self._error(level, text) + self.shutdown() + self.feedback.failed(self, True) + + def _close(self): + if self.closed: + return + self.closed = True + self._rawserver.remove_context(self) + self._doneflag.set() + if self._announced: + self._rerequest.announce_stop() + self._rerequest.cleanup() + if self._hashcheck_thread is not None: + self._hashcheck_thread.join() # should die soon after doneflag set + if self._myfiles is not None: + self._filepool.remove_files(self._myfiles) + if self._listening: + self._singleport_listener.remove_torrent(self.infohash) + for port in self.reserved_ports: + self._singleport_listener.release_port(port) + if self._encoder is not None: + self._encoder.close_connections() + if self._storage is not None: + self._storage.close() + self._ratelimiter.clean_closed() + self._rawserver.add_task(gc.collect, 0) + + def get_status(self, spew = False, fileinfo=False): + if self.started and not self.closed: + r = self._statuscollecter.get_statistics(spew, fileinfo) + r['activity'] = self._activity[0] + else: + r = dict(zip(('activity', 'fractionDone'), self._activity)) + return r + + def get_total_transfer(self): + if self._upmeasure is None: + return (0, 0) + return (self._upmeasure.get_total(), self._downmeasure.get_total()) + + def set_option(self, option, value): + if self.closed: + return + if self.config.has_key(option) and self.config[option] == value: + return + self.config[option] = value + if option == 'max_upload_rate': + # make sure counters get reset so new rate applies immediately + self.rlgroup.set_rate(value) + + def change_port(self): + if not self._listening: + return + r = self.config['forwarded_port'] + if r: + for port in self.reserved_ports: + self._singleport_listener.release_port(port) + del self.reserved_ports[:] + if self.reported_port == r: + return + elif self._singleport_listener.port != self.reported_port: + r = self._singleport_listener.get_port() + self.reserved_ports.append(r) + else: + return + self.reported_port = r + myid = self._make_id() + self._encoder.my_id = myid + self._rerequest.change_port(myid, r) + + def _announce_done(self): + for port in self.reserved_ports[:-1]: + self._singleport_listener.release_port(port) + del self.reserved_ports[:-1] + + def _make_id(self): + myid = 'M' + version.split()[0].replace('.', '-') + myid = myid + ('-' * (8-len(myid)))+sha(repr(time())+ ' ' + + str(getpid())).digest()[-6:].encode('hex') + return myid + + def _error(self, level, text, exception=False): + self.errors.append((time(), level, text)) + if exception: + self.feedback.exception(self, text) + else: + self.feedback.error(self, level, text) diff --git a/BitTorrent/launchmanycore.py b/BitTorrent/launchmanycore.py new file mode 100755 index 0000000..92bc531 --- /dev/null +++ b/BitTorrent/launchmanycore.py @@ -0,0 +1,260 @@ +#!/usr/bin/env python + +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Original version written by John Hoffman, heavily modified for different +# multitorrent architecture by Uoti Urpala (over 40% shorter than original) + +import os +from cStringIO import StringIO +from traceback import print_exc + +from BitTorrent import configfile +from BitTorrent.parsedir import parsedir +from BitTorrent.download import Multitorrent, Feedback +from BitTorrent.ConvertedMetainfo import ConvertedMetainfo +from BitTorrent import BTFailure + +from threading import Event +from time import time + + +class LaunchMany(Feedback): + + def __init__(self, config, output, configfile_key): + try: + self.config = config + self.output = output + self.configfile_key = configfile_key + + self.torrent_dir = config['torrent_dir'] + self.torrent_cache = {} + self.file_cache = {} + self.blocked_files = {} + + self.torrent_list = [] + self.downloads = {} + self.doneflag = Event() + + self.hashcheck_queue = [] + self.hashcheck_store = {} + self.hashcheck_current = None + + self.multitorrent = Multitorrent(config, self.doneflag, + self.global_error) + self.rawserver = self.multitorrent.rawserver + + self.rawserver.add_task(self.scan, 0) + self.rawserver.add_task(self.stats, 0) + + try: + import signal + def handler(signum, frame): + self.rawserver.external_add_task(self.read_config, 0) + signal.signal(signal.SIGHUP, handler) + self.rawserver.install_sigint_handler() + except Exception, e: + self.output.message(_("Could not set signal handler: ") + str(e)) + + self.rawserver.listen_forever() + + self.output.message(_("shutting down")) + for infohash in self.torrent_list: + self.output.message(_('dropped "%s"') % + self.torrent_cache[infohash]['path']) + torrent = self.downloads[infohash] + if torrent is not None: + torrent.shutdown() + except: + data = StringIO() + print_exc(file = data) + output.exception(data.getvalue()) + + def scan(self): + self.rawserver.add_task(self.scan, self.config['parse_dir_interval']) + + r = parsedir(self.torrent_dir, self.torrent_cache, + self.file_cache, self.blocked_files, + self.output.message) + + ( self.torrent_cache, self.file_cache, self.blocked_files, + added, removed ) = r + + for infohash, data in removed.items(): + self.output.message(_('dropped "%s"') % data['path']) + self.remove(infohash) + for infohash, data in added.items(): + self.output.message(_('added "%s"' ) % data['path']) + self.add(infohash, data) + + def stats(self): + self.rawserver.add_task(self.stats, self.config['display_interval']) + data = [] + for infohash in self.torrent_list: + cache = self.torrent_cache[infohash] + if self.config['display_path']: + name = cache['path'] + else: + name = cache['name'] + size = cache['length'] + d = self.downloads[infohash] + progress = '0.0%' + peers = 0 + seeds = 0 + seedsmsg = "S" + dist = 0.0 + uprate = 0.0 + dnrate = 0.0 + upamt = 0 + dnamt = 0 + t = 0 + msg = '' + if d is None: + status = _("waiting for hash check") + else: + stats = d.get_status() + status = stats['activity'] + progress = '%.1f%%' % (int(stats['fractionDone']*1000)/10.0) + if d.started and not d.closed: + s = stats + dist = s['numCopies'] + if d.is_seed: + seeds = 0 # s['numOldSeeds'] + seedsmsg = "s" + else: + if s['numSeeds'] + s['numPeers']: + t = stats['timeEst'] + if t is None: + t = -1 + if t == 0: # unlikely + t = 0.01 + status = _("downloading") + else: + t = -1 + status = _("connecting to peers") + seeds = s['numSeeds'] + dnrate = stats['downRate'] + peers = s['numPeers'] + uprate = stats['upRate'] + upamt = s['upTotal'] + dnamt = s['downTotal'] + if d.errors and (d.closed or d.errors[-1][0] + 300 > time()): + msg = d.errors[-1][2] + + data.append(( name, status, progress, peers, seeds, seedsmsg, dist, + uprate, dnrate, upamt, dnamt, size, t, msg )) + stop = self.output.display(data) + if stop: + self.doneflag.set() + + def remove(self, infohash): + self.torrent_list.remove(infohash) + if self.downloads[infohash] is not None: + self.downloads[infohash].shutdown() + self.was_stopped(infohash) + del self.downloads[infohash] + + def add(self, infohash, data): + self.torrent_list.append(infohash) + self.downloads[infohash] = None + self.hashcheck_queue.append(infohash) + self.hashcheck_store[infohash] = data['metainfo'] + self.check_hashcheck_queue() + + def check_hashcheck_queue(self): + if self.hashcheck_current is not None or not self.hashcheck_queue: + return + self.hashcheck_current = self.hashcheck_queue.pop(0) + metainfo = self.hashcheck_store[self.hashcheck_current] + del self.hashcheck_store[self.hashcheck_current] + filename = self.determine_filename(self.hashcheck_current) + self.downloads[self.hashcheck_current] = self.multitorrent. \ + start_torrent(ConvertedMetainfo(metainfo), + self.config, self, filename) + + def determine_filename(self, infohash): + x = self.torrent_cache[infohash] + name = x['name'] + savein = self.config['save_in'] + isdir = not x['metainfo']['info'].has_key('length') + style = self.config['saveas_style'] + if style == 4: + torrentname = os.path.split(x['path'][:-8])[1] + suggestedname = name + if torrentname == suggestedname: + style = 1 + else: + style = 3 + + if style == 1 or style == 3: + if savein: + saveas = os.path.join(savein,x['file'][:-8]) # strip '.torrent' + else: + saveas = x['path'][:-8] # strip '.torrent' + if style == 3 and not isdir: + saveas = os.path.join(saveas, name) + else: + if savein: + saveas = os.path.join(savein, name) + else: + saveas = os.path.join(os.path.split(x['path'])[0], name) + return saveas + + def was_stopped(self, infohash): + try: + self.hashcheck_queue.remove(infohash) + except: + pass + else: + del self.hashcheck_store[infohash] + if self.hashcheck_current == infohash: + self.hashcheck_current = None + self.check_hashcheck_queue() + + def global_error(self, level, text): + self.output.message(text) + + def exchandler(self, s): + self.output.exception(s) + + def read_config(self): + try: + newvalues = configfile.get_config(self.config, self.configfile_key) + except Exception, e: + self.output.message(_("Error reading config: ") + str(e)) + return + self.output.message(_("Rereading config file")) + self.config.update(newvalues) + # The set_option call can potentially trigger something that kills + # the torrent (when writing this the only possibility is a change in + # max_files_open causing an IOError while closing files), and so + # the self.failed() callback can run during this loop. + for option, value in newvalues.iteritems(): + self.multitorrent.set_option(option, value) + for torrent in self.downloads.values(): + if torrent is not None: + for option, value in newvalues.iteritems(): + torrent.set_option(option, value) + + # rest are callbacks from torrent instances + + def started(self, torrent): + self.hashcheck_current = None + self.check_hashcheck_queue() + + def failed(self, torrent, is_external): + infohash = torrent.infohash + self.was_stopped(infohash) + if self.torrent_cache.has_key(infohash): + self.output.message('DIED: "'+self.torrent_cache[infohash]['path']+'"') + + def exception(self, torrent, text): + self.exchandler(text) diff --git a/BitTorrent/makemetafile.py b/BitTorrent/makemetafile.py new file mode 100755 index 0000000..35aee66 --- /dev/null +++ b/BitTorrent/makemetafile.py @@ -0,0 +1,263 @@ +#!/usr/bin/env python + +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from __future__ import division + +import os +import sys +from sha import sha +from time import time +from threading import Event + +from BitTorrent.bencode import bencode, bdecode +from BitTorrent.btformats import check_info +from BitTorrent.parseargs import parseargs, printHelp +from BitTorrent.obsoletepythonsupport import * +from BitTorrent import BTFailure + +from khashmir.node import Node +from khashmir.ktable import KTable +from khashmir.util import packPeers, compact_peer_info + +ignore = ['core', 'CVS', 'Thumbs.db', 'desktop.ini'] + +noncharacter_translate = {} +for i in range(0xD800, 0xE000): + noncharacter_translate[i] = None +for i in range(0xFDD0, 0xFDF0): + noncharacter_translate[i] = None +for i in (0xFFFE, 0xFFFF): + noncharacter_translate[i] = None + +del i + +def dummy(v): + pass + +def make_meta_files(url, + files, + flag=Event(), + progressfunc=dummy, + filefunc=dummy, + piece_len_pow2=None, + target=None, + comment=None, + filesystem_encoding=None, + use_tracker=True, + data_dir = None): + if len(files) > 1 and target: + raise BTFailure(_("You can't specify the name of the .torrent file " + "when generating multiple torrents at once")) + + if not filesystem_encoding: + try: + getattr(sys, 'getfilesystemencoding') + except AttributeError: + pass + else: + filesystem_encoding = sys.getfilesystemencoding() + if not filesystem_encoding: + filesystem_encoding = 'ascii' + try: + 'a1'.decode(filesystem_encoding) + except: + raise BTFailure(_('Filesystem encoding "%s" is not supported in this version') + % filesystem_encoding) + files.sort() + ext = '.torrent' + + togen = [] + for f in files: + if not f.endswith(ext): + togen.append(f) + + total = 0 + for f in togen: + total += calcsize(f) + + subtotal = [0] + def callback(x): + subtotal[0] += x + progressfunc(subtotal[0] / total) + for f in togen: + if flag.isSet(): + break + t = os.path.split(f) + if t[1] == '': + f = t[0] + filefunc(f) + if use_tracker: + make_meta_file(f, url, flag=flag, progress=callback, + piece_len_exp=piece_len_pow2, target=target, + comment=comment, encoding=filesystem_encoding) + else: + make_meta_file_dht(f, url, flag=flag, progress=callback, + piece_len_exp=piece_len_pow2, target=target, + comment=comment, encoding=filesystem_encoding, data_dir=data_dir) + + +def make_meta_file(path, url, piece_len_exp, flag=Event(), progress=dummy, + comment=None, target=None, encoding='ascii'): + data = {'announce': url.strip(),'creation date': int(time())} + piece_length = 2 ** piece_len_exp + 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 + info = makeinfo(path, piece_length, flag, progress, encoding) + if flag.isSet(): + return + check_info(info) + h = file(f, 'wb') + + data['info'] = info + if comment: + data['comment'] = comment + h.write(bencode(data)) + h.close() + +def make_meta_file_dht(path, nodes, piece_len_exp, flag=Event(), progress=dummy, + comment=None, target=None, encoding='ascii', data_dir=None): + # if nodes is empty, then get them out of the routing table in data_dir + # else, expect nodes to be a string of comma seperated : pairs + # this has a lot of duplicated code from make_meta_file + piece_length = 2 ** piece_len_exp + 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 + info = makeinfo(path, piece_length, flag, progress, encoding) + if flag.isSet(): + return + check_info(info) + info_hash = sha(bencode(info)).digest() + + if not nodes: + x = open(os.path.join(data_dir, 'routing_table'), 'rb') + d = bdecode(x.read()) + x.close() + t = KTable(Node().initWithDict({'id':d['id'], 'host':'127.0.0.1','port': 0})) + for n in d['rt']: + t.insertNode(Node().initWithDict(n)) + nodes = [(node.host, node.port) for node in t.findNodes(info_hash) if node.host != '127.0.0.1'] + else: + nodes = [(a[0], int(a[1])) for a in [node.strip().split(":") for node in nodes.split(",")]] + data = {'nodes': nodes, 'creation date': int(time())} + h = file(f, 'wb') + + data['info'] = info + if comment: + data['comment'] = comment + h.write(bencode(data)) + h.close() + + +def calcsize(path): + total = 0 + for s in subfiles(os.path.abspath(path)): + total += os.path.getsize(s[1]) + return total + +def makeinfo(path, piece_length, flag, progress, encoding): + def to_utf8(name): + try: + u = name.decode(encoding) + except Exception, e: + raise BTFailure(_('Could not convert file/directory name "%s" to ' + 'utf-8 (%s). Either the assumed filesystem ' + 'encoding "%s" is wrong or the filename contains ' + 'illegal bytes.') % (name, str(e), encoding)) + if u.translate(noncharacter_translate) != u: + raise BTFailure(_('File/directory name "%s" contains reserved ' + 'unicode values that do not correspond to ' + 'characters.') % name) + return u.encode('utf-8') + path = os.path.abspath(path) + if os.path.isdir(path): + subs = subfiles(path) + subs.sort() + pieces = [] + sh = sha() + done = 0 + fs = [] + totalsize = 0.0 + totalhashed = 0 + for p, f in subs: + totalsize += os.path.getsize(f) + + for p, f in subs: + pos = 0 + size = os.path.getsize(f) + p2 = [to_utf8(name) for name in p] + fs.append({'length': size, 'path': p2}) + h = file(f, 'rb') + while pos < size: + a = min(size - pos, piece_length - done) + sh.update(h.read(a)) + if flag.isSet(): + return + done += a + pos += a + totalhashed += a + + if done == piece_length: + pieces.append(sh.digest()) + done = 0 + sh = sha() + progress(a) + h.close() + if done > 0: + pieces.append(sh.digest()) + return {'pieces': ''.join(pieces), + 'piece length': piece_length, 'files': fs, + 'name': to_utf8(os.path.split(path)[1])} + else: + size = os.path.getsize(path) + pieces = [] + p = 0 + h = file(path, 'rb') + while p < size: + x = h.read(min(piece_length, size - p)) + if flag.isSet(): + return + pieces.append(sha(x).digest()) + p += piece_length + if p > size: + p = size + progress(min(piece_length, size - p)) + h.close() + return {'pieces': ''.join(pieces), + 'piece length': piece_length, 'length': size, + 'name': to_utf8(os.path.split(path)[1])} + +def subfiles(d): + r = [] + stack = [([], d)] + while stack: + p, n = stack.pop() + if os.path.isdir(n): + for s in os.listdir(n): + if s not in ignore and not s.startswith('.'): + stack.append((p + [s], os.path.join(n, s))) + else: + r.append((p, n)) + return r diff --git a/BitTorrent/obsoletepythonsupport.py b/BitTorrent/obsoletepythonsupport.py new file mode 100755 index 0000000..75aecde --- /dev/null +++ b/BitTorrent/obsoletepythonsupport.py @@ -0,0 +1,33 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from __future__ import generators + +import sys + +if sys.version_info < (2, 3): + # Allow int() to create numbers larger than "small ints". + # This is NOT SAFE if int is used as the name of the type instead + # (as in "type(x) in (int, long)"). + int = long + + def enumerate(x): + i = 0 + for y in x: + yield (i, y) + i += 1 + + def sum(seq): + r = 0 + for x in seq: + r += x + return r + +del sys diff --git a/BitTorrent/parseargs.py b/BitTorrent/parseargs.py new file mode 100755 index 0000000..2db0b9a --- /dev/null +++ b/BitTorrent/parseargs.py @@ -0,0 +1,187 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bill Bumgarner and Bram Cohen + +from types import * +from cStringIO import StringIO + +from BitTorrent.obsoletepythonsupport import * + +from BitTorrent.defaultargs import MyBool, MYTRUE +from BitTorrent import BTFailure +from BitTorrent.bencode import bdecode +from BitTorrent.platform import is_frozen_exe +from BitTorrent.RawServer_magic import switch_rawserver + +def makeHelp(uiname, defaults): + ret = '' + ret += (_("Usage: %s ") % uiname) + if uiname.startswith('launchmany'): + ret += _("[OPTIONS] [TORRENTDIRECTORY]\n\n") + ret += _("If a non-option argument is present it's taken as the value\n" + "of the torrent_dir option.\n") + elif uiname == 'bittorrent': + ret += _("[OPTIONS] [TORRENTFILES]\n") + elif uiname.startswith('bittorrent'): + ret += _("[OPTIONS] [TORRENTFILE]\n") + elif uiname.startswith('maketorrent'): + ret += _("[OPTION] TRACKER_URL FILE [FILE]\n") + ret += '\n' + ret += _("arguments are -\n") + formatDefinitions(defaults, 80) + return ret + +def printHelp(uiname, defaults): + if uiname in ('bittorrent','maketorrent') and is_frozen_exe: + from BitTorrent.GUI import HelpWindow + HelpWindow(None, makeHelp(uiname, defaults)) + else: + print makeHelp(uiname, defaults) + +def formatDefinitions(options, COLS): + s = StringIO() + indent = " " * 10 + width = COLS - 11 + + if width < 15: + width = COLS - 2 + indent = " " + + for option in options: + (longname, default, doc) = option + if doc == '': + continue + s.write('--' + longname) + is_boolean = type(default) is MyBool + if is_boolean: + s.write(', --no_' + longname) + else: + s.write(' ') + s.write('\n') + if default is not None: + doc += _(" (defaults to ") + repr(default) + ')' + i = 0 + for word in doc.split(): + if i == 0: + s.write(indent + word) + i = len(word) + elif i + len(word) >= width: + s.write('\n' + indent + word) + i = len(word) + else: + s.write(' ' + word) + i += len(word) + 1 + s.write('\n\n') + return s.getvalue() + +def usage(str): + raise BTFailure(str) + +def format_key(key): + if len(key) == 1: + return '-%s'%key + else: + return '--%s'%key + +def parseargs(argv, options, minargs=None, maxargs=None, presets=None): + config = {} + for option in options: + longname, default, doc = option + config[longname] = default + args = [] + pos = 0 + if presets is None: + presets = {} + else: + presets = presets.copy() + while pos < len(argv): + if argv[pos][:1] != '-': # not a cmdline option + args.append(argv[pos]) + pos += 1 + else: + key, value = None, None + if argv[pos].startswith('--'): # --aaa 1 + if argv[pos].startswith('--no_'): + key = argv[pos][5:] + boolval = False + else: + key = argv[pos][2:] + boolval = True + if key not in config: + raise BTFailure(_("unknown key ") + format_key(key)) + if type(config[key]) is MyBool: # boolean cmd line switch, no value + value = boolval + pos += 1 + else: # --argument value + if pos == len(argv) - 1: + usage(_("parameter passed in at end with no value")) + key, value = argv[pos][2:], argv[pos+1] + pos += 2 + elif argv[pos][:1] == '-': + key = argv[pos][1:2] + if len(argv[pos]) > 2: # -a1 + value = argv[pos][2:] + pos += 1 + else: # -a 1 + if pos == len(argv) - 1: + usage(_("parameter passed in at end with no value")) + value = argv[pos+1] + pos += 2 + else: + raise BTFailure(_("command line parsing failed at ")+argv[pos]) + + presets[key] = value + parse_options(config, presets) + config.update(presets) + for key, value in config.items(): + if value is None: + usage(_("Option %s is required.") % format_key(key)) + if minargs is not None and len(args) < minargs: + usage(_("Must supply at least %d arguments.") % minargs) + if maxargs is not None and len(args) > maxargs: + usage(_("Too many arguments - %d maximum.") % maxargs) + + if config.has_key('twisted'): + if config['twisted'] == 0: + switch_rawserver('untwisted') + elif config['twisted'] == 1: + switch_rawserver('twisted') + + return (config, args) + +def parse_options(defaults, newvalues): + for key, value in newvalues.iteritems(): + if not defaults.has_key(key): + raise BTFailure(_("unknown key ") + format_key(key)) + try: + t = type(defaults[key]) + if t is MyBool: + if value in ('True', '1', MYTRUE, True): + value = True + else: + value = False + newvalues[key] = value + elif t in (StringType, NoneType): + newvalues[key] = value + elif t in (IntType, LongType): + if value == 'False': + newvalues[key] == 0 + elif value == 'True': + newvalues[key] == 1 + else: + newvalues[key] = int(value) + elif t is FloatType: + newvalues[key] = float(value) + else: + raise TypeError, str(t) + + except ValueError, e: + raise BTFailure(_("wrong format of %s - %s") % (format_key(key), str(e))) + diff --git a/BitTorrent/parsedir.py b/BitTorrent/parsedir.py new file mode 100755 index 0000000..3b86a03 --- /dev/null +++ b/BitTorrent/parsedir.py @@ -0,0 +1,150 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by John Hoffman and Uoti Urpala + +import os +from sha import sha + +from BitTorrent.bencode import bencode, bdecode +from BitTorrent.btformats import check_message + +NOISY = False + +def parsedir(directory, parsed, files, blocked, errfunc, + include_metainfo=True): + if NOISY: + errfunc('checking dir') + dirs_to_check = [directory] + new_files = {} + new_blocked = {} + while dirs_to_check: # first, recurse directories and gather torrents + directory = dirs_to_check.pop() + newtorrents = False + try: + dir_contents = os.listdir(directory) + except (IOError, OSError), e: + errfunc(_("Could not read directory ") + directory) + continue + for f in dir_contents: + if f.endswith('.torrent'): + newtorrents = True + p = os.path.join(directory, f) + try: + new_files[p] = [(os.path.getmtime(p),os.path.getsize(p)),0] + except (IOError, OSError), e: + errfunc(_("Could not stat ") + p + " : " + str(e)) + if not newtorrents: + for f in dir_contents: + p = os.path.join(directory, f) + if os.path.isdir(p): + dirs_to_check.append(p) + + new_parsed = {} + to_add = [] + added = {} + removed = {} + # files[path] = [(modification_time, size), hash], hash is 0 if the file + # has not been successfully parsed + for p,v in new_files.items(): # re-add old items and check for changes + oldval = files.get(p) + if oldval is None: # new file + to_add.append(p) + continue + h = oldval[1] + if oldval[0] == v[0]: # file is unchanged from last parse + if h: + if p in blocked: # parseable + blocked means duplicate + to_add.append(p) # other duplicate may have gone away + else: + new_parsed[h] = parsed[h] + new_files[p] = oldval + else: + new_blocked[p] = None # same broken unparseable file + continue + if p not in blocked and h in parsed: # modified; remove+add + if NOISY: + errfunc(_("removing %s (will re-add)") % p) + removed[h] = parsed[h] + to_add.append(p) + + to_add.sort() + for p in to_add: # then, parse new and changed torrents + new_file = new_files[p] + v = new_file[0] + if new_file[1] in new_parsed: # duplicate + if p not in blocked or files[p][0] != v: + errfunc(_("**warning** %s is a duplicate torrent for %s") % + (p, new_parsed[new_file[1]]['path'])) + new_blocked[p] = None + continue + + if NOISY: + errfunc('adding '+p) + try: + ff = open(p, 'rb') + d = bdecode(ff.read()) + check_message(d) + h = sha(bencode(d['info'])).digest() + new_file[1] = h + if new_parsed.has_key(h): + errfunc(_("**warning** %s is a duplicate torrent for %s") % + (p, new_parsed[h]['path'])) + new_blocked[p] = None + continue + + a = {} + a['path'] = p + f = os.path.basename(p) + a['file'] = f + i = d['info'] + l = 0 + nf = 0 + if i.has_key('length'): + l = i.get('length',0) + nf = 1 + elif i.has_key('files'): + for li in i['files']: + nf += 1 + if li.has_key('length'): + l += li['length'] + a['numfiles'] = nf + a['length'] = l + a['name'] = i.get('name', f) + def setkey(k, d = d, a = a): + if d.has_key(k): + a[k] = d[k] + setkey('failure reason') + setkey('warning message') + setkey('announce-list') + if include_metainfo: + a['metainfo'] = d + except: + errfunc(_("**warning** %s has errors") % p) + new_blocked[p] = None + continue + try: + ff.close() + except: + pass + if NOISY: + errfunc(_("... successful")) + new_parsed[h] = a + added[h] = a + + for p,v in files.iteritems(): # and finally, mark removed torrents + if p not in new_files and p not in blocked: + if NOISY: + errfunc(_("removing %s") % p) + removed[v[1]] = parsed[v[1]] + + if NOISY: + errfunc(_("done checking")) + return (new_parsed, new_files, new_blocked, added, removed) diff --git a/BitTorrent/platform.py b/BitTorrent/platform.py new file mode 100755 index 0000000..c222573 --- /dev/null +++ b/BitTorrent/platform.py @@ -0,0 +1,290 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Matt Chisholm and Uoti Urpala + +# This module is strictly for cross platform compatibility items and +# should not import anything from other BitTorrent modules. + +import os +import re +import sys +import time +import gettext +import locale +if os.name == 'nt': + import win32api + from win32com.shell import shellcon, shell +elif os.name == 'posix' and os.uname()[0] == 'Darwin': + has_pyobjc = False + try: + from Foundation import NSBundle + has_pyobjc = True + except ImportError: + pass + +from BitTorrent import app_name, version + +if sys.platform.startswith('win'): + bttime = time.clock +else: + bttime = time.time + +is_frozen_exe = (os.name == 'nt') and hasattr(sys, 'frozen') and (sys.frozen == 'windows_exe') + +os_name = os.name +os_version = None +if os_name == 'nt': + wh = {(1, 4, 0): "95", + (1, 4, 10): "98", + (1, 4, 90): "ME", + (2, 4, 0): "NT", + (2, 5, 0): "2000", + (2, 5, 1): "XP" , + (2, 5, 2): "2003", + } + wv = sys.getwindowsversion() + wk = (wv[3], wv[0], wv[1]) + if wh.has_key(wk): + os_version = wh[wk] + del wh, wv, wk +elif os_name == 'posix': + os_version = os.uname()[0] + +user_agent = "M" + version.replace('.', '-') + "--(%s/%s)" % (os_name, os_version) + +def calc_unix_dirs(): + appdir = '%s-%s'%(app_name, version) + ip = os.path.join('share', 'pixmaps', appdir) + dp = os.path.join('share', 'doc' , appdir) + lp = os.path.join('share', 'locale') + return ip, dp, lp + +app_root = os.path.split(os.path.abspath(sys.argv[0]))[0] +doc_root = app_root +osx = False +if os.name == 'posix': + if os.uname()[0] == "Darwin": + doc_root = app_root = app_root.encode('utf8') + if has_pyobjc: + doc_root = NSBundle.mainBundle().resourcePath() + osx = True +image_root = os.path.join(app_root, 'images') +locale_root = os.path.join(app_root, 'locale') + +if not os.access(image_root, os.F_OK) or not os.access(locale_root, os.F_OK): + # we guess that probably we are installed on *nix in this case + # (I have no idea whether this is right or not -- matt) + if app_root[-4:] == '/bin': + # yep, installed on *nix + installed_prefix = app_root[:-4] + image_root, doc_root, locale_root = map( + lambda p: os.path.join(installed_prefix, p), calc_unix_dirs() + ) + +# a cross-platform way to get user's config directory +def get_config_dir(): + shellvars = ['${APPDATA}', '${HOME}', '${USERPROFILE}'] + dir_root = get_dir_root(shellvars) + + if (dir_root is None) and (os.name == 'nt'): + app_dir = get_shell_dir(shellcon.CSIDL_APPDATA) + if app_dir is not None: + dir_root = app_dir + + if dir_root is None and os.name == 'nt': + tmp_dir_root = os.path.split(sys.executable)[0] + if os.access(tmp_dir_root, os.R_OK|os.W_OK): + dir_root = tmp_dir_root + + return dir_root + +def get_cache_dir(): + dir = None + if os.name == 'nt': + dir = get_shell_dir(shellcon.CSIDL_INTERNET_CACHE) + return dir + +def get_home_dir(): + shellvars = ['${HOME}', '${USERPROFILE}'] + dir_root = get_dir_root(shellvars) + + if (dir_root is None) and (os.name == 'nt'): + dir = get_shell_dir(shellcon.CSIDL_PROFILE) + if dir is None: + # there's no clear best fallback here + # MS discourages you from writing directly in the home dir, + # and sometimes (i.e. win98) there isn't one + dir = get_shell_dir(shellcon.CSIDL_DESKTOPDIRECTORY) + + dir_root = dir + + return dir_root + +def get_temp_dir(): + shellvars = ['${TMP}', '${TEMP}'] + dir_root = get_dir_root(shellvars, default_to_home=False) + + #this method is preferred to the envvars + if os.name == 'nt': + try_dir_root = win32api.GetTempPath() + if try_dir_root is not None: + dir_root = try_dir_root + + if dir_root is None: + try_dir_root = None + if os.name == 'nt': + # this should basically never happen. GetTempPath always returns something + try_dir_root = r'C:\WINDOWS\Temp' + elif os.name == 'posix': + try_dir_root = '/tmp' + if (try_dir_root is not None and + os.path.isdir(try_dir_root) and + os.access(try_dir_root, os.R_OK|os.W_OK)): + dir_root = try_dir_root + return dir_root + +def get_dir_root(shellvars, default_to_home=True): + def check_sysvars(x): + y = os.path.expandvars(x) + if y != x and os.path.isdir(y): + return y + return None + + dir_root = None + for d in shellvars: + dir_root = check_sysvars(d) + if dir_root is not None: + break + else: + if default_to_home: + dir_root = os.path.expanduser('~') + if dir_root == '~' or not os.path.isdir(dir_root): + dir_root = None + return dir_root + +# this function is the preferred way to get windows' paths +def get_shell_dir(value): + dir = None + if os.name == 'nt': + try: + dir = shell.SHGetFolderPath(0, value, 0, 0) + dir = dir.encode('mbcs') + except: + pass + return dir + +def path_wrap(path): + return path + +if os.name == 'nt': + def path_wrap(path): + return path.decode('mbcs').encode('utf-8') + +def spawn(torrentqueue, cmd, *args): + ext = '' + if is_frozen_exe: + ext = '.exe' + path = os.path.join(app_root,cmd+ext) + if not os.access(path, os.F_OK): + if os.access(path+'.py', os.F_OK): + path = path+'.py' + args = [path] + list(args) # $0 + if os.name == 'nt': + # do proper argument quoting since exec/spawn on Windows doesn't + args = ['"%s"'%a.replace('"', '\"') for a in args] + argstr = ' '.join(args[1:]) + # use ShellExecute instead of spawn*() because we don't want + # handles (like the controlsocket) to be duplicated + win32api.ShellExecute(0, "open", args[0], argstr, None, 1) # 1 == SW_SHOW + else: + if os.access(path, os.X_OK): + forkback = os.fork() + if forkback == 0: + if torrentqueue is not None: + #BUG: should we do this? + #torrentqueue.set_done() + torrentqueue.wrapped.controlsocket.close_socket() + os.execl(path, *args) + else: + #BUG: what should we do here? + pass + + +def _gettext_install(domain, localedir=None, languages=None, unicode=False): + # gettext on win32 does not use locale.getdefaultlocale() by default + # other os's will fall through and gettext.find() will do this task + if os_name == 'nt': + # this code is straight out of gettext.find() + if languages is None: + languages = [] + for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'): + val = os.environ.get(envar) + if val: + languages = val.split(':') + break + + # this is the important addition - since win32 does not typically + # have any enironment variable set, append the default locale before 'C' + languages.append(locale.getdefaultlocale()[0]) + + if 'C' not in languages: + languages.append('C') + + # this code is straight out of gettext.install + t = gettext.translation(domain, localedir, languages=languages, fallback=True) + t.install(unicode) + + +def language_path(): + config_dir = get_config_dir() + lang_file_name = os.path.join(config_dir, '.bittorrent', 'data', 'language') + return lang_file_name + + +def read_language_file(): + lang_file_name = language_path() + lang = None + if os.access(lang_file_name, os.F_OK|os.R_OK): + mode = 'r' + if sys.version_info >= (2, 3): + mode = 'U' + lang_file = open(lang_file_name, mode) + lang_line = lang_file.readline() + lang_file.close() + if lang_line: + lang = '' + for i in lang_line[:5]: + if not i.isalpha() and i != '_': + break + lang += i + if lang == '': + lang = None + return lang + + +def write_language_file(lang): + lang_file_name = language_path() + lang_file = open(lang_file_name, 'w') + lang_file.write(lang) + lang_file.close() + + +def install_translation(): + languages = None + try: + lang = read_language_file() + if lang is not None: + languages = [lang,] + except: + #pass + from traceback import print_exc + print_exc() + _gettext_install('bittorrent', locale_root, languages=languages) diff --git a/BitTorrent/prefs.py b/BitTorrent/prefs.py new file mode 100755 index 0000000..62bbd9a --- /dev/null +++ b/BitTorrent/prefs.py @@ -0,0 +1,88 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + + +class Preferences(object): + def __init__(self, parent=None): + self._parent = None + self._options = {} + if parent: + self._parent = parent + + def initWithDict(self, dict): + self._options = dict + return self + + def getDict(self): + return dict(self._options) + + def getDifference(self): + if self._parent: + return dict([(x, y) for x, y in self._options.items() if y != self._parent.get(x, None)]) + else: + return dict(self._options) + + def __getitem__(self, option): + if self._options.has_key(option): + return self._options[option] + elif self._parent: + return self._parent[option] + return None + + def __setitem__(self, option, value): + self._options.__setitem__(option, value) + + def __len__(self): + l = len(self._options) + if self._parent: + return l + len(self._parent) + else: + return l + + def __delitem__(self, option): + del(self._options[option]) + + def clear(self): self._options.clear() + + def has_key(self, option): + if self._options.has_key(option): + return True + elif self._parent: + return self._parent.has_key(option) + return False + + def keys(self): + l = self._options.keys() + if self._parent: + l += [key for key in self._parent.keys() if key not in l] + return l + + def values(self): + l = self._options.values() + if self._parent: + l += [value for value in self._parent.values() if value not in l] + return l + + def items(self): + l = self._options.items() + if self._parent: + l += [item for item in self._parent.items() if item not in l] + return l + + def __iter__(self): return self.iterkeys() + def iteritems(self): return self.items().__iter__() + def iterkeys(self): return self.keys().__iter__() + def itervalues(self): return self.values().__iter__() + def update(self, dict): return self._options.update(dict) + + def get(self, key, failobj=None): + if not self.has_key(key): + return failobj + return self[key] diff --git a/BitTorrent/selectpoll.py b/BitTorrent/selectpoll.py new file mode 100755 index 0000000..d01f1ef --- /dev/null +++ b/BitTorrent/selectpoll.py @@ -0,0 +1,68 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen + +from select import select, error +from time import sleep +from types import IntType +from bisect import bisect +POLLIN = 1 +POLLOUT = 2 +POLLERR = 8 +POLLHUP = 16 + + +class poll(object): + + def __init__(self): + self.rlist = [] + self.wlist = [] + + def register(self, f, t): + if type(f) != IntType: + f = f.fileno() + if (t & POLLIN) != 0: + insert(self.rlist, f) + else: + remove(self.rlist, f) + if (t & POLLOUT) != 0: + insert(self.wlist, f) + else: + remove(self.wlist, f) + + def unregister(self, f): + if type(f) != IntType: + f = f.fileno() + remove(self.rlist, f) + remove(self.wlist, f) + + def poll(self, timeout = None): + if self.rlist != [] or self.wlist != []: + r, w, e = select(self.rlist, self.wlist, [], timeout) + else: + sleep(timeout) + return [] + result = [] + for s in r: + result.append((s, POLLIN)) + for s in w: + result.append((s, POLLOUT)) + return result + +def remove(list, item): + i = bisect(list, item) + if i > 0 and list[i-1] == item: + del list[i-1] + +def insert(list, item): + i = bisect(list, item) + if i == 0 or list[i-1] != item: + list.insert(i, item) diff --git a/BitTorrent/track.py b/BitTorrent/track.py new file mode 100755 index 0000000..fc1cd60 --- /dev/null +++ b/BitTorrent/track.py @@ -0,0 +1,874 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# Written by Bram Cohen and John Hoffman + +import sys +import os +import signal +import re +from threading import Event +from urlparse import urlparse +from traceback import print_exc +from time import time, gmtime, strftime, localtime +from random import shuffle +from types import StringType, IntType, LongType, ListType, DictType +from binascii import b2a_hex +from cStringIO import StringIO + +from BitTorrent.obsoletepythonsupport import * + +from BitTorrent.parseargs import parseargs, formatDefinitions +from BitTorrent.RawServer_magic import RawServer +from BitTorrent.HTTPHandler import HTTPHandler, months, weekdays +from BitTorrent.parsedir import parsedir +from BitTorrent.NatCheck import NatCheck +from BitTorrent.bencode import bencode, bdecode, Bencached +from BitTorrent.zurllib import quote, unquote +from BitTorrent import version + + +defaults = [ + ('port', 80, + _("Port to listen on.")), + ('dfile', None, + _("file to store recent downloader info in")), + ('bind', '', + _("ip to bind to locally")), + ('socket_timeout', 15, + _("timeout for closing connections")), + ('close_with_rst', 0, + _("close connections with RST and avoid the TCP TIME_WAIT state")), + ('save_dfile_interval', 5 * 60, + _("seconds between saving dfile")), + ('timeout_downloaders_interval', 45 * 60, + _("seconds between expiring downloaders")), + ('reannounce_interval', 30 * 60, + _("seconds downloaders should wait between reannouncements")), + ('response_size', 50, + _("default number of peers to send an info message to if the " + "client does not specify a number")), + ('timeout_check_interval', 5, + _("time to wait between checking if any connections have timed out")), + ('nat_check', 3, + _("how many times to check if a downloader is behind a NAT " + "(0 = don't check)")), + ('log_nat_checks', 0, + _("whether to add entries to the log for nat-check results")), + ('min_time_between_log_flushes', 3.0, + _("minimum time it must have been since the last flush to do " + "another one")), + ('min_time_between_cache_refreshes', 600.0, + _("minimum time in seconds before a cache is considered stale " + "and is flushed")), + ('allowed_dir', '', + _("only allow downloads for .torrents in this dir (and recursively in " + "subdirectories of directories that have no .torrent files " + "themselves). If set, torrents in this directory show up on " + "infopage/scrape whether they have peers or not")), + ('parse_dir_interval', 60, + _("how often to rescan the torrent directory, in seconds")), + ('allowed_controls', 0, + _("allow special keys in torrents in the allowed_dir to affect " + "tracker access")), + ('hupmonitor', 0, + _("whether to reopen the log file upon receipt of HUP signal")), + ('show_infopage', 1, + _("whether to display an info page when the tracker's root dir " + "is loaded")), + ('infopage_redirect', '', + _("a URL to redirect the info page to")), + ('show_names', 1, + _("whether to display names from allowed dir")), + ('favicon', '', + _("file containing x-icon data to return when browser requests " + "favicon.ico")), + ('only_local_override_ip', 2, + _("ignore the ip GET parameter from machines which aren't on " + "local network IPs (0 = never, 1 = always, 2 = ignore if NAT " + "checking is not enabled). HTTP proxy headers giving address " + "of original client are treated the same as --ip.")), + ('logfile', '', + _("file to write the tracker logs, use - for stdout (default)")), + ('allow_get', 0, + _("use with allowed_dir; adds a /file?hash={hash} url that " + "allows users to download the torrent file")), + ('keep_dead', 0, + _("keep dead torrents after they expire (so they still show up on your " + "/scrape and web page). Only matters if allowed_dir is not set")), + ('scrape_allowed', 'full', + _("scrape access allowed (can be none, specific or full)")), + ('max_give', 200, + _("maximum number of peers to give with any one request")), + ('twisted', -1, + _("Use Twisted network libraries for network connections. 1 means use twisted, 0 means do not use twisted, -1 means autodetect, and prefer twisted")), + ] + +def statefiletemplate(x): + if type(x) != DictType: + raise ValueError + for cname, cinfo in x.items(): + if cname == 'peers': + for y in cinfo.values(): # The 'peers' key is a dictionary of SHA hashes (torrent ids) + if type(y) != DictType: # ... for the active torrents, and each is a dictionary + raise ValueError + for peerid, info in y.items(): # ... of client ids interested in that torrent + if (len(peerid) != 20): + raise ValueError + if type(info) != DictType: # ... each of which is also a dictionary + raise ValueError # ... which has an IP, a Port, and a Bytes Left count for that client for that torrent + if type(info.get('ip', '')) != StringType: + raise ValueError + port = info.get('port') + if type(port) not in (IntType, LongType) or port < 0: + raise ValueError + left = info.get('left') + if type(left) not in (IntType, LongType) or left < 0: + raise ValueError + elif cname == 'completed': + if (type(cinfo) != DictType): # The 'completed' key is a dictionary of SHA hashes (torrent ids) + raise ValueError # ... for keeping track of the total completions per torrent + for y in cinfo.values(): # ... each torrent has an integer value + if type(y) not in (IntType,LongType): + raise ValueError # ... for the number of reported completions for that torrent + elif cname == 'allowed': + if (type(cinfo) != DictType): # a list of info_hashes and included data + raise ValueError + if x.has_key('allowed_dir_files'): + adlist = [z[1] for z in x['allowed_dir_files'].values()] + for y in cinfo.keys(): # and each should have a corresponding key here + if not y in adlist: + raise ValueError + elif cname == 'allowed_dir_files': + if (type(cinfo) != DictType): # a list of files, their attributes and info hashes + raise ValueError + dirkeys = {} + for y in cinfo.values(): # each entry should have a corresponding info_hash + if not y[1]: + continue + if not x['allowed'].has_key(y[1]): + raise ValueError + if dirkeys.has_key(y[1]): # and each should have a unique info_hash + raise ValueError + dirkeys[y[1]] = 1 + + +alas = _("your file may exist elsewhere in the universe\nbut alas, not here\n") + +def isotime(secs = None): + if secs == None: + secs = time() + return strftime('%Y-%m-%d %H:%M UTC', gmtime(secs)) + +http_via_filter = re.compile(' for ([0-9.]+)\Z') + +def _get_forwarded_ip(headers): + if headers.has_key('http_x_forwarded_for'): + header = headers['http_x_forwarded_for'] + try: + x,y = header.split(',') + except: + return header + if not is_local_ip(x): + return x + return y + if headers.has_key('http_client_ip'): + return headers['http_client_ip'] + if headers.has_key('http_via'): + x = http_via_filter.search(headers['http_via']) + try: + return x.group(1) + except: + pass + if headers.has_key('http_from'): + return headers['http_from'] + return None + +def get_forwarded_ip(headers): + x = _get_forwarded_ip(headers) + if x is None or not is_valid_ipv4(x) or is_local_ip(x): + return None + return x + +def compact_peer_info(ip, port): + try: + s = ( ''.join([chr(int(i)) for i in ip.split('.')]) + + chr((port & 0xFF00) >> 8) + chr(port & 0xFF) ) + if len(s) != 6: + s = '' + except: + s = '' # not a valid IP, must be a domain name + return s + +def is_valid_ipv4(ip): + a = ip.split('.') + if len(a) != 4: + return False + try: + for x in a: + chr(int(x)) + return True + except: + return False + +def is_local_ip(ip): + try: + v = [int(x) for x in ip.split('.')] + if v[0] == 10 or v[0] == 127 or v[:2] in ([192, 168], [169, 254]): + return 1 + if v[0] == 172 and v[1] >= 16 and v[1] <= 31: + return 1 + except ValueError: + return 0 + + +class Tracker(object): + + def __init__(self, config, rawserver): + self.config = config + self.response_size = config['response_size'] + self.max_give = config['max_give'] + self.dfile = config['dfile'] + self.natcheck = config['nat_check'] + favicon = config['favicon'] + self.favicon = None + if favicon: + try: + h = open(favicon,'r') + self.favicon = h.read() + h.close() + except: + print _("**warning** specified favicon file -- %s -- does not exist.") % favicon + self.rawserver = rawserver + self.cached = {} # format: infohash: [[time1, l1, s1], [time2, l2, s2], [time3, l3, s3]] + self.cached_t = {} # format: infohash: [time, cache] + self.times = {} + self.state = {} + self.seedcount = {} + + self.only_local_override_ip = config['only_local_override_ip'] + if self.only_local_override_ip == 2: + self.only_local_override_ip = not config['nat_check'] + + if os.path.exists(self.dfile): + try: + h = open(self.dfile, 'rb') + ds = h.read() + h.close() + tempstate = bdecode(ds) + if not tempstate.has_key('peers'): + tempstate = {'peers': tempstate} + statefiletemplate(tempstate) + self.state = tempstate + except: + print _("**warning** statefile %s corrupt; resetting") % \ + self.dfile + self.downloads = self.state.setdefault('peers', {}) + self.completed = self.state.setdefault('completed', {}) + + self.becache = {} # format: infohash: [[l1, s1], [l2, s2], [l3, s3]] + for infohash, ds in self.downloads.items(): + self.seedcount[infohash] = 0 + for x,y in ds.items(): + if not y.get('nat',-1): + ip = y.get('given_ip') + if not (ip and self.allow_local_override(y['ip'], ip)): + ip = y['ip'] + self.natcheckOK(infohash,x,ip,y['port'],y['left']) + if not y['left']: + self.seedcount[infohash] += 1 + + for infohash in self.downloads: + self.times[infohash] = {} + for peerid in self.downloads[infohash]: + self.times[infohash][peerid] = 0 + + self.reannounce_interval = config['reannounce_interval'] + self.save_dfile_interval = config['save_dfile_interval'] + self.show_names = config['show_names'] + rawserver.add_task(self.save_dfile, self.save_dfile_interval) + self.prevtime = time() + self.timeout_downloaders_interval = config['timeout_downloaders_interval'] + rawserver.add_task(self.expire_downloaders, self.timeout_downloaders_interval) + self.logfile = None + self.log = None + if (config['logfile'] != '') and (config['logfile'] != '-'): + try: + self.logfile = config['logfile'] + self.log = open(self.logfile,'a') + sys.stdout = self.log + print _("# Log Started: "), isotime() + except: + print _("**warning** could not redirect stdout to log file: "), sys.exc_info()[0] + + if config['hupmonitor']: + def huphandler(signum, frame, self = self): + try: + self.log.close () + self.log = open(self.logfile,'a') + sys.stdout = self.log + print _("# Log reopened: "), isotime() + except: + print _("**warning** could not reopen logfile") + + signal.signal(signal.SIGHUP, huphandler) + + self.allow_get = config['allow_get'] + + if config['allowed_dir'] != '': + self.allowed_dir = config['allowed_dir'] + self.parse_dir_interval = config['parse_dir_interval'] + self.allowed = self.state.setdefault('allowed',{}) + self.allowed_dir_files = self.state.setdefault('allowed_dir_files',{}) + self.allowed_dir_blocked = {} + self.parse_allowed() + else: + try: + del self.state['allowed'] + except: + pass + try: + del self.state['allowed_dir_files'] + except: + pass + self.allowed = None + + self.uq_broken = unquote('+') != ' ' + self.keep_dead = config['keep_dead'] + + def allow_local_override(self, ip, given_ip): + return is_valid_ipv4(given_ip) and ( + not self.only_local_override_ip or is_local_ip(ip) ) + + def get_infopage(self): + try: + if not self.config['show_infopage']: + return (404, 'Not Found', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, alas) + red = self.config['infopage_redirect'] + if red != '': + return (302, 'Found', {'Content-Type': 'text/html', 'Location': red}, + 'Click Here') + + s = StringIO() + s.write('\n' \ + 'BitTorrent download info\n') + if self.favicon is not None: + s.write('\n') + s.write('\n\n' \ + '

BitTorrent download info

\n'\ + '
    \n' + '
  • tracker version: %s
  • \n' \ + '
  • server time: %s
  • \n' \ + '
\n' % (version, isotime())) + if self.allowed is not None: + if self.show_names: + names = [ (value['name'], infohash) + for infohash, value in self.allowed.iteritems()] + else: + names = [(None, infohash) for infohash in self.allowed] + else: + names = [ (None, infohash) for infohash in self.downloads] + if not names: + s.write('

not tracking any files yet...

\n') + else: + names.sort() + tn = 0 + tc = 0 + td = 0 + tt = 0 # Total transferred + ts = 0 # Total size + nf = 0 # Number of files displayed + if self.allowed is not None and self.show_names: + s.write('\n' \ + '\n') + else: + s.write('
info hashtorrent namesizecompletedownloadingdownloadedtransferred
\n' \ + '\n') + for name, infohash in names: + l = self.downloads[infohash] + n = self.completed.get(infohash, 0) + tn = tn + n + c = self.seedcount[infohash] + tc = tc + c + d = len(l) - c + td = td + d + nf = nf + 1 + if self.allowed is not None and self.show_names: + if self.allowed.has_key(infohash): + sz = self.allowed[infohash]['length'] # size + ts = ts + sz + szt = sz * n # Transferred for this torrent + tt = tt + szt + if self.allow_get == 1: + linkname = '' + name + '' + else: + linkname = name + s.write('\n' \ + % (b2a_hex(infohash), linkname, size_format(sz), c, d, n, size_format(szt))) + else: + s.write('\n' \ + % (b2a_hex(infohash), c, d, n)) + ttn = 0 + for i in self.completed.values(): + ttn = ttn + i + if self.allowed is not None and self.show_names: + s.write('\n' + % (nf, size_format(ts), tc, td, tn, ttn, size_format(tt))) + else: + s.write('\n' + % (nf, tc, td, tn, ttn)) + s.write('
info hashcompletedownloadingdownloaded
%s%s%s%i%i%i%s
%s%i%i%i
%i files%s%i%i%i/%i%s
%i files%i%i%i/%i
\n' \ + '
    \n' \ + '
  • info hash: SHA1 hash of the "info" section of the metainfo (*.torrent)
  • \n' \ + '
  • complete: number of connected clients with the complete file
  • \n' \ + '
  • downloading: number of connected clients still downloading
  • \n' \ + '
  • downloaded: reported complete downloads (total: current/all)
  • \n' \ + '
  • transferred: torrent size * total downloaded (does not include partial transfers)
  • \n' \ + '
\n') + + s.write('\n' \ + '\n') + return (200, 'OK', {'Content-Type': 'text/html; charset=iso-8859-1'}, s.getvalue()) + except: + print_exc() + return (500, 'Internal Server Error', {'Content-Type': 'text/html; charset=iso-8859-1'}, 'Server Error') + + def scrapedata(self, infohash, return_name = True): + l = self.downloads[infohash] + n = self.completed.get(infohash, 0) + c = self.seedcount[infohash] + d = len(l) - c + f = {'complete': c, 'incomplete': d, 'downloaded': n} + if return_name and self.show_names and self.allowed is not None: + f['name'] = self.allowed[infohash]['name'] + return (f) + + def get_scrape(self, paramslist): + fs = {} + if paramslist.has_key('info_hash'): + if self.config['scrape_allowed'] not in ['specific', 'full']: + return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, + bencode({'failure reason': + _("specific scrape function is not available with this tracker.")})) + for infohash in paramslist['info_hash']: + if self.allowed is not None and infohash not in self.allowed: + continue + if infohash in self.downloads: + fs[infohash] = self.scrapedata(infohash) + else: + if self.config['scrape_allowed'] != 'full': + return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, + bencode({'failure reason': + _("full scrape function is not available with this tracker.")})) + if self.allowed is not None: + hashes = self.allowed + else: + hashes = self.downloads + for infohash in hashes: + fs[infohash] = self.scrapedata(infohash) + + return (200, 'OK', {'Content-Type': 'text/plain'}, bencode({'files': fs})) + + def get_file(self, infohash): + if not self.allow_get: + return (400, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, + _("get function is not available with this tracker.")) + if not self.allowed.has_key(infohash): + return (404, 'Not Found', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, alas) + fname = self.allowed[infohash]['file'] + fpath = self.allowed[infohash]['path'] + return (200, 'OK', {'Content-Type': 'application/x-bittorrent', + 'Content-Disposition': 'attachment; filename=' + fname}, + open(fpath, 'rb').read()) + + def check_allowed(self, infohash, paramslist): + if self.allowed is not None: + if not self.allowed.has_key(infohash): + return (200, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, + bencode({'failure reason': + _("Requested download is not authorized for use with this tracker.")})) + if self.config['allowed_controls']: + if self.allowed[infohash].has_key('failure reason'): + return (200, 'Not Authorized', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, + bencode({'failure reason': self.allowed[infohash]['failure reason']})) + + return None + + def add_data(self, infohash, event, ip, paramslist): + peers = self.downloads.setdefault(infohash, {}) + ts = self.times.setdefault(infohash, {}) + self.completed.setdefault(infohash, 0) + self.seedcount.setdefault(infohash, 0) + + def params(key, default = None, l = paramslist): + if l.has_key(key): + return l[key][0] + return default + + myid = params('peer_id','') + if len(myid) != 20: + raise ValueError, 'id not of length 20' + if event not in ['started', 'completed', 'stopped', 'snooped', None]: + raise ValueError, 'invalid event' + port = int(params('port','')) + if port < 0 or port > 65535: + raise ValueError, 'invalid port' + left = int(params('left','')) + if left < 0: + raise ValueError, 'invalid amount left' + + peer = peers.get(myid) + mykey = params('key') + auth = not peer or peer.get('key', -1) == mykey or peer.get('ip') == ip + + gip = params('ip') + local_override = gip and self.allow_local_override(ip, gip) + if local_override: + ip1 = gip + else: + ip1 = ip + if not auth and local_override and self.only_local_override_ip: + auth = True + + if params('numwant') is not None: + rsize = min(int(params('numwant')), self.max_give) + else: + rsize = self.response_size + + if event == 'stopped': + if peer and auth: + self.delete_peer(infohash,myid) + + elif not peer: + ts[myid] = time() + peer = {'ip': ip, 'port': port, 'left': left} + if mykey: + peer['key'] = mykey + if gip: + peer['given ip'] = gip + if port: + if not self.natcheck or (local_override and self.only_local_override_ip): + peer['nat'] = 0 + self.natcheckOK(infohash,myid,ip1,port,left) + else: + NatCheck(self.connectback_result,infohash,myid,ip1,port,self.rawserver) + else: + peer['nat'] = 2**30 + if event == 'completed': + self.completed[infohash] += 1 + if not left: + self.seedcount[infohash] += 1 + + peers[myid] = peer + + else: + if not auth: + return rsize # return w/o changing stats + + ts[myid] = time() + if not left and peer['left']: + self.completed[infohash] += 1 + self.seedcount[infohash] += 1 + if not peer.get('nat', -1): + for bc in self.becache[infohash]: + bc[1][myid] = bc[0][myid] + del bc[0][myid] + if peer['left']: + peer['left'] = left + + recheck = False + if ip != peer['ip']: + peer['ip'] = ip + recheck = True + if gip != peer.get('given ip'): + if gip: + peer['given ip'] = gip + elif peer.has_key('given ip'): + del peer['given ip'] + if local_override: + if self.only_local_override_ip: + self.natcheckOK(infohash,myid,ip1,port,left) + else: + recheck = True + + if port and self.natcheck: + if recheck: + if peer.has_key('nat'): + if not peer['nat']: + l = self.becache[infohash] + y = not peer['left'] + for x in l: + del x[y][myid] + del peer['nat'] # restart NAT testing + else: + natted = peer.get('nat', -1) + if natted and natted < self.natcheck: + recheck = True + + if recheck: + NatCheck(self.connectback_result,infohash,myid,ip1,port,self.rawserver) + + return rsize + + def peerlist(self, infohash, stopped, is_seed, return_type, rsize): + data = {} # return data + seeds = self.seedcount[infohash] + data['complete'] = seeds + data['incomplete'] = len(self.downloads[infohash]) - seeds + + if ( self.allowed is not None and self.config['allowed_controls'] and + self.allowed[infohash].has_key('warning message') ): + data['warning message'] = self.allowed[infohash]['warning message'] + + data['interval'] = self.reannounce_interval + if stopped or not rsize: # save some bandwidth + data['peers'] = [] + return data + + bc = self.becache.setdefault(infohash,[[{}, {}], [{}, {}], [{}, {}]]) + len_l = len(bc[0][0]) + len_s = len(bc[0][1]) + if not (len_l+len_s): # caches are empty! + data['peers'] = [] + return data + l_get_size = int(float(rsize)*(len_l)/(len_l+len_s)) + cache = self.cached.setdefault(infohash,[None,None,None])[return_type] + if cache: + if cache[0] + self.config['min_time_between_cache_refreshes'] < time(): + cache = None + else: + if ( (is_seed and len(cache[1]) < rsize) + or len(cache[1]) < l_get_size or not cache[1] ): + cache = None + if not cache: + vv = [[],[],[]] + cache = [ time(), + bc[return_type][0].values()+vv[return_type], + bc[return_type][1].values() ] + shuffle(cache[1]) + shuffle(cache[2]) + self.cached[infohash][return_type] = cache + for rr in xrange(len(self.cached[infohash])): + if rr != return_type: + try: + self.cached[infohash][rr][1].extend(vv[rr]) + except: + pass + if len(cache[1]) < l_get_size: + peerdata = cache[1] + if not is_seed: + peerdata.extend(cache[2]) + cache[1] = [] + cache[2] = [] + else: + if not is_seed: + peerdata = cache[2][l_get_size-rsize:] + del cache[2][l_get_size-rsize:] + rsize -= len(peerdata) + else: + peerdata = [] + if rsize: + peerdata.extend(cache[1][-rsize:]) + del cache[1][-rsize:] + if return_type == 2: + peerdata = ''.join(peerdata) + data['peers'] = peerdata + return data + + def get(self, connection, path, headers): + ip = connection.get_ip() + + nip = get_forwarded_ip(headers) + if nip and not self.only_local_override_ip: + ip = nip + + paramslist = {} + def params(key, default = None, l = paramslist): + if l.has_key(key): + return l[key][0] + return default + + try: + (scheme, netloc, path, pars, query, fragment) = urlparse(path) + if self.uq_broken == 1: + path = path.replace('+',' ') + query = query.replace('+',' ') + path = unquote(path)[1:] + for s in query.split('&'): + if s != '': + i = s.index('=') + kw = unquote(s[:i]) + paramslist.setdefault(kw, []) + paramslist[kw] += [unquote(s[i+1:])] + + if path == '' or path == 'index.html': + return self.get_infopage() + if path == 'scrape': + return self.get_scrape(paramslist) + if (path == 'file'): + return self.get_file(params('info_hash')) + if path == 'favicon.ico' and self.favicon is not None: + return (200, 'OK', {'Content-Type' : 'image/x-icon'}, self.favicon) + if path != 'announce': + return (404, 'Not Found', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, alas) + + # main tracker function + infohash = params('info_hash') + if not infohash: + raise ValueError, 'no info hash' + + notallowed = self.check_allowed(infohash, paramslist) + if notallowed: + return notallowed + + event = params('event') + + rsize = self.add_data(infohash, event, ip, paramslist) + + except ValueError, e: + return (400, 'Bad Request', {'Content-Type': 'text/plain'}, + 'you sent me garbage - ' + str(e)) + + if params('compact'): + return_type = 2 + elif params('no_peer_id'): + return_type = 1 + else: + return_type = 0 + + data = self.peerlist(infohash, event=='stopped', not params('left'), + return_type, rsize) + + if paramslist.has_key('scrape'): + data['scrape'] = self.scrapedata(infohash, False) + + return (200, 'OK', {'Content-Type': 'text/plain', 'Pragma': 'no-cache'}, bencode(data)) + + def natcheckOK(self, infohash, peerid, ip, port, not_seed): + bc = self.becache.setdefault(infohash,[[{}, {}], [{}, {}], [{}, {}]]) + bc[0][not not_seed][peerid] = Bencached(bencode({'ip': ip, 'port': port, + 'peer id': peerid})) + bc[1][not not_seed][peerid] = Bencached(bencode({'ip': ip, 'port': port})) + bc[2][not not_seed][peerid] = compact_peer_info(ip, port) + + def natchecklog(self, peerid, ip, port, result): + year, month, day, hour, minute, second, a, b, c = localtime(time()) + print '%s - %s [%02d/%3s/%04d:%02d:%02d:%02d] "!natcheck-%s:%i" %i 0 - -' % ( + ip, quote(peerid), day, months[month], year, hour, minute, second, + ip, port, result) + + def connectback_result(self, result, downloadid, peerid, ip, port): + record = self.downloads.get(downloadid, {}).get(peerid) + if ( record is None + or (record['ip'] != ip and record.get('given ip') != ip) + or record['port'] != port ): + if self.config['log_nat_checks']: + self.natchecklog(peerid, ip, port, 404) + return + if self.config['log_nat_checks']: + if result: + x = 200 + else: + x = 503 + self.natchecklog(peerid, ip, port, x) + if not record.has_key('nat'): + record['nat'] = int(not result) + if result: + self.natcheckOK(downloadid,peerid,ip,port,record['left']) + elif result and record['nat']: + record['nat'] = 0 + self.natcheckOK(downloadid,peerid,ip,port,record['left']) + elif not result: + record['nat'] += 1 + + def save_dfile(self): + self.rawserver.add_task(self.save_dfile, self.save_dfile_interval) + h = open(self.dfile, 'wb') + h.write(bencode(self.state)) + h.close() + + def parse_allowed(self): + self.rawserver.add_task(self.parse_allowed, self.parse_dir_interval) + + # logging broken .torrent files would be useful but could confuse + # programs parsing log files, so errors are just ignored for now + def ignore(message): + pass + r = parsedir(self.allowed_dir, self.allowed, self.allowed_dir_files, + self.allowed_dir_blocked, ignore,include_metainfo = False) + ( self.allowed, self.allowed_dir_files, self.allowed_dir_blocked, + added, garbage2 ) = r + + for infohash in added: + self.downloads.setdefault(infohash, {}) + self.completed.setdefault(infohash, 0) + self.seedcount.setdefault(infohash, 0) + + self.state['allowed'] = self.allowed + self.state['allowed_dir_files'] = self.allowed_dir_files + + def delete_peer(self, infohash, peerid): + dls = self.downloads[infohash] + peer = dls[peerid] + if not peer['left']: + self.seedcount[infohash] -= 1 + if not peer.get('nat',-1): + l = self.becache[infohash] + y = not peer['left'] + for x in l: + del x[y][peerid] + del self.times[infohash][peerid] + del dls[peerid] + + def expire_downloaders(self): + for infohash, peertimes in self.times.items(): + for myid, t in peertimes.items(): + if t < self.prevtime: + self.delete_peer(infohash, myid) + self.prevtime = time() + if (self.keep_dead != 1): + for key, peers in self.downloads.items(): + if len(peers) == 0 and (self.allowed is None or + key not in self.allowed): + del self.times[key] + del self.downloads[key] + del self.seedcount[key] + self.rawserver.add_task(self.expire_downloaders, self.timeout_downloaders_interval) + +def track(args): + if len(args) == 0: + print formatDefinitions(defaults, 80) + return + try: + config, files = parseargs(args, defaults, 0, 0) + except ValueError, e: + print _("error: ") + str(e) + print _("run with no arguments for parameter explanations") + return + r = RawServer(Event(), config) + t = Tracker(config, r) + s = r.create_serversocket(config['port'], config['bind'], True) + r.start_listening(s, HTTPHandler(t.get, config['min_time_between_log_flushes'])) + r.listen_forever() + t.save_dfile() + print _("# Shutting down: ") + isotime() + +def size_format(s): + if (s < 1024): + r = str(s) + 'B' + elif (s < 1048576): + r = str(int(s/1024)) + 'KiB' + elif (s < 1073741824): + r = str(int(s/1048576)) + 'MiB' + elif (s < 1099511627776): + r = str(int((s/1073741824.0)*100.0)/100.0) + 'GiB' + else: + r = str(int((s/1099511627776.0)*100.0)/100.0) + 'TiB' + return(r) diff --git a/BitTorrent/zurllib.py b/BitTorrent/zurllib.py new file mode 100755 index 0000000..926a08d --- /dev/null +++ b/BitTorrent/zurllib.py @@ -0,0 +1,164 @@ +# +# zurllib.py +# +# This is (hopefully) a drop-in for urllib which will request gzip/deflate +# compression and then decompress the output if a compressed response is +# received while maintaining the API. +# +# by Robert Stone 2/22/2003 +# extended by Matt Chisholm +# + +from BitTorrent.platform import user_agent +import urllib2 +OldOpenerDirector = urllib2.OpenerDirector + +class MyOpenerDirector(OldOpenerDirector): + def __init__(self): + OldOpenerDirector.__init__(self) + server_version = user_agent + self.addheaders = [('User-agent', server_version)] + +urllib2.OpenerDirector = MyOpenerDirector + +del urllib2 + +from urllib import * +from urllib2 import * +from gzip import GzipFile +from StringIO import StringIO +import pprint + +DEBUG=0 + + +class HTTPContentEncodingHandler(HTTPHandler): + """Inherit and add gzip/deflate/etc support to HTTP gets.""" + def http_open(self, req): + # add the Accept-Encoding header to the request + # support gzip encoding (identity is assumed) + req.add_header("Accept-Encoding","gzip") + if DEBUG: + print "Sending:" + print req.headers + print "\n" + fp = HTTPHandler.http_open(self,req) + headers = fp.headers + if DEBUG: + pprint.pprint(headers.dict) + url = fp.url + resp = addinfourldecompress(fp, headers, url) + if hasattr(fp, 'code'): + resp.code = fp.code + if hasattr(fp, 'msg'): + resp.msg = fp.msg + return resp + + +class addinfourldecompress(addinfourl): + """Do gzip decompression if necessary. Do addinfourl stuff too.""" + def __init__(self, fp, headers, url): + # we need to do something more sophisticated here to deal with + # multiple values? What about other weird crap like q-values? + # basically this only works for the most simplistic case and will + # break in some other cases, but for now we only care about making + # this work with the BT tracker so.... + if headers.has_key('content-encoding') and headers['content-encoding'] == 'gzip': + if DEBUG: + print "Contents of Content-encoding: " + headers['Content-encoding'] + "\n" + self.gzip = 1 + self.rawfp = fp + fp = GzipStream(fp) + else: + self.gzip = 0 + return addinfourl.__init__(self, fp, headers, url) + + def close(self): + self.fp.close() + if self.gzip: + self.rawfp.close() + + def iscompressed(self): + return self.gzip + +class GzipStream(StringIO): + """Magically decompress a file object. + + This is not the most efficient way to do this but GzipFile() wants + to seek, etc, which won't work for a stream such as that from a socket. + So we copy the whole shebang info a StringIO object, decompress that + then let people access the decompressed output as a StringIO object. + + The disadvantage is memory use and the advantage is random access. + + Will mess with fixing this later. + """ + + def __init__(self,fp): + self.fp = fp + + # this is nasty and needs to be fixed at some point + # copy everything into a StringIO (compressed) + compressed = StringIO() + r = fp.read() + while r: + compressed.write(r) + r = fp.read() + # now, unzip (gz) the StringIO to a string + compressed.seek(0,0) + gz = GzipFile(fileobj = compressed) + str = '' + r = gz.read() + while r: + str += r + r = gz.read() + # close our utility files + compressed.close() + gz.close() + # init our stringio selves with the string + StringIO.__init__(self, str) + del str + + def close(self): + self.fp.close() + return StringIO.close(self) + + +def test(): + """Test this module. + + At the moment this is lame. + """ + + print "Running unit tests.\n" + + def printcomp(fp): + try: + if fp.iscompressed(): + print "GET was compressed.\n" + else: + print "GET was uncompressed.\n" + except: + print "no iscompressed function! this shouldn't happen" + + print "Trying to GET a compressed document...\n" + fp = urlopen('http://a.scarywater.net/hng/index.shtml') + print fp.read() + printcomp(fp) + fp.close() + + print "Trying to GET an unknown document...\n" + fp = urlopen('http://www.otaku.org/') + print fp.read() + printcomp(fp) + fp.close() + + +# +# Install the HTTPContentEncodingHandler that we've defined above. +# +install_opener(build_opener(HTTPContentEncodingHandler, ProxyHandler({}))) + +if __name__ == '__main__': + test() + diff --git a/Foundation/Conversion.py b/Foundation/Conversion.py new file mode 100755 index 0000000..6078ae2 --- /dev/null +++ b/Foundation/Conversion.py @@ -0,0 +1,10 @@ +""" +Compatibility module +""" +import warnings + +warnings.warn( + "import PyObjCTools.Conversion instead of Foundation.Conversion", + DeprecationWarning) + +from PyObjCTools.Conversion import * diff --git a/Foundation/_Foundation.so b/Foundation/_Foundation.so new file mode 100755 index 0000000000000000000000000000000000000000..ad9d34c652d492573626c65eac6be1e895bddd91 GIT binary patch literal 439824 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 Ke4Xf6DE$9{czUh? literal 0 HcmV?d00001 diff --git a/Foundation/__init__.py b/Foundation/__init__.py new file mode 100755 index 0000000..04a4dad --- /dev/null +++ b/Foundation/__init__.py @@ -0,0 +1,49 @@ +import objc as _objc +from _Foundation import * + +NSClassFromString = _objc.lookUpClass + +# Do something smart to collect Foundation classes... + +if _objc.platform == 'MACOSX': + _objc.loadBundle( + 'Foundation', + globals(), + bundle_identifier=u'com.apple.Foundation', + ) +else: + _objc.loadBundle( + 'Foundation', + globals(), + bundle_path=_objc.pathForFramework( + u'/System/Library/Frameworks/Foundation.framework', + ), + ) + +def _initialize(): + import sys, os + if 'PYOBJCFRAMEWORKS' in os.environ: + paths = os.environ['PYOBJCFRAMEWORKS'].split(":") + count = 0 + for path in paths: + bundle = NSBundle.bundleWithPath_(path) + bundle.principalClass() + sys.path.insert(count, str(bundle.resourcePath())) + count = count + 1 + + initPath = bundle.pathForResource_ofType_( "Init", "py") + if initPath: + execfile(initPath, globals(), locals()) + +_initialize() + +import protocols # no need to export these, just register with PyObjC + +# +# (informal) protocols eported for b/w compatibility +# +from protocols import NSConnectionDelegateMethods, \ + NSDistantObjectRequestMethods, \ + NSCopyLinkMoveHandler, NSKeyedArchiverDelegate, \ + NSKeyedUnarchiverDelegate, NSNetServiceDelegateMethods, \ + NSNetServiceBrowserDelegateMethods, NSPortDelegateMethods diff --git a/Foundation/protocols.py b/Foundation/protocols.py new file mode 100755 index 0000000..f548033 --- /dev/null +++ b/Foundation/protocols.py @@ -0,0 +1,1856 @@ +# generated from '/System/Library/Frameworks/Foundation.framework' +import objc as _objc + + +NSArchiverCallback = _objc.informal_protocol( + "NSArchiverCallback", + [ +# (Class)classForArchiver + _objc.selector( + None, + selector='classForArchiver', + signature='#@:', + isRequired=0, + ), +# (id)replacementObjectForArchiver:(NSArchiver *)archiver + _objc.selector( + None, + selector='replacementObjectForArchiver:', + signature='@@:@', + isRequired=0, + ), + ] +) + +NSClassDescriptionPrimitives = _objc.informal_protocol( + "NSClassDescriptionPrimitives", + [ +# (NSArray *)attributeKeys + _objc.selector( + None, + selector='attributeKeys', + signature='@@:', + isRequired=0, + ), +# (NSClassDescription *)classDescription + _objc.selector( + None, + selector='classDescription', + signature='@@:', + isRequired=0, + ), +# (NSString *)inverseForRelationshipKey:(NSString *)relationshipKey + _objc.selector( + None, + selector='inverseForRelationshipKey:', + signature='@@:@', + isRequired=0, + ), +# (NSArray *)toManyRelationshipKeys + _objc.selector( + None, + selector='toManyRelationshipKeys', + signature='@@:', + isRequired=0, + ), +# (NSArray *)toOneRelationshipKeys + _objc.selector( + None, + selector='toOneRelationshipKeys', + signature='@@:', + isRequired=0, + ), + ] +) + +NSCoding = _objc.informal_protocol( + "NSCoding", + [ +# (void)encodeWithCoder:(NSCoder *)aCoder + _objc.selector( + None, + selector='encodeWithCoder:', + signature='v@:@', + isRequired=0, + ), +# (id)initWithCoder:(NSCoder *)aDecoder + _objc.selector( + None, + selector='initWithCoder:', + signature='@@:@', + isRequired=0, + ), + ] +) + +NSComparisonMethods = _objc.informal_protocol( + "NSComparisonMethods", + [ +# (BOOL)doesContain:(id)object + _objc.selector( + None, + selector='doesContain:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isCaseInsensitiveLike:(NSString *)object + _objc.selector( + None, + selector='isCaseInsensitiveLike:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isEqualTo:(id)object + _objc.selector( + None, + selector='isEqualTo:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isGreaterThan:(id)object + _objc.selector( + None, + selector='isGreaterThan:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isGreaterThanOrEqualTo:(id)object + _objc.selector( + None, + selector='isGreaterThanOrEqualTo:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isLessThan:(id)object + _objc.selector( + None, + selector='isLessThan:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isLessThanOrEqualTo:(id)object + _objc.selector( + None, + selector='isLessThanOrEqualTo:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isLike:(NSString *)object + _objc.selector( + None, + selector='isLike:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isNotEqualTo:(id)object + _objc.selector( + None, + selector='isNotEqualTo:', + signature='c@:@', + isRequired=0, + ), + ] +) + +NSConnectionDelegateMethods = _objc.informal_protocol( + "NSConnectionDelegateMethods", + [ +# (BOOL)authenticateComponents:(NSArray *)components withData:(NSData *)signature + _objc.selector( + None, + selector='authenticateComponents:withData:', + signature='c@:@@', + isRequired=0, + ), +# (NSData *)authenticationDataForComponents:(NSArray *)components + _objc.selector( + None, + selector='authenticationDataForComponents:', + signature='@@:@', + isRequired=0, + ), +# (BOOL)connection:(NSConnection *)ancestor shouldMakeNewConnection:(NSConnection *)conn + _objc.selector( + None, + selector='connection:shouldMakeNewConnection:', + signature='c@:@@', + isRequired=0, + ), +# (id)createConversationForConnection:(NSConnection *)conn + _objc.selector( + None, + selector='createConversationForConnection:', + signature='@@:@', + isRequired=0, + ), +# (BOOL)makeNewConnection:(NSConnection *)conn sender:(NSConnection *)ancestor + _objc.selector( + None, + selector='makeNewConnection:sender:', + signature='c@:@@', + isRequired=0, + ), + ] +) + +NSCopyLinkMoveHandler = _objc.informal_protocol( + "NSCopyLinkMoveHandler", + [ +# (BOOL)fileManager:(NSFileManager *)fm shouldProceedAfterError:(NSDictionary *)errorInfo + _objc.selector( + None, + selector='fileManager:shouldProceedAfterError:', + signature='c@:@@', + isRequired=0, + ), +# (void)fileManager:(NSFileManager *)fm willProcessPath:(NSString *)path + _objc.selector( + None, + selector='fileManager:willProcessPath:', + signature='v@:@@', + isRequired=0, + ), + ] +) + +NSCopying = _objc.informal_protocol( + "NSCopying", + [ +# (id)copyWithZone:(NSZone *)zone + _objc.selector( + None, + selector='copyWithZone:', + signature='@@:^{_NSZone=}', + isRequired=0, + ), + ] +) + +NSDecimalNumberBehaviors = _objc.informal_protocol( + "NSDecimalNumberBehaviors", + [ +# (NSDecimalNumber *)exceptionDuringOperation:(SEL)operation error:(NSCalculationError)error leftOperand:(NSDecimalNumber *)leftOperand rightOperand:(NSDecimalNumber *)rightOperand + _objc.selector( + None, + selector='exceptionDuringOperation:error:leftOperand:rightOperand:', + signature='@@::i@@', + isRequired=0, + ), +# (NSRoundingMode)roundingMode + _objc.selector( + None, + selector='roundingMode', + signature='i@:', + isRequired=0, + ), +# (short)scale + _objc.selector( + None, + selector='scale', + signature='s@:', + isRequired=0, + ), + ] +) + +NSDelayedPerforming = _objc.informal_protocol( + "NSDelayedPerforming", + [ +# (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget + _objc.selector( + None, + selector='cancelPreviousPerformRequestsWithTarget:', + signature='v@:@', + isClassMethod=1, + isRequired=0, + ), +# (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument + _objc.selector( + None, + selector='cancelPreviousPerformRequestsWithTarget:selector:object:', + signature='v@:@:@', + isClassMethod=1, + isRequired=0, + ), +# (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay + _objc.selector( + None, + selector='performSelector:withObject:afterDelay:', + signature='v@::@d', + isRequired=0, + ), +# (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes + _objc.selector( + None, + selector='performSelector:withObject:afterDelay:inModes:', + signature='v@::@d@', + isRequired=0, + ), + ] +) + +NSDeprecatedKeyValueCoding = _objc.informal_protocol( + "NSDeprecatedKeyValueCoding", + [ +# (id)handleQueryWithUnboundKey:(NSString *)key + _objc.selector( + None, + selector='handleQueryWithUnboundKey:', + signature='@@:@', + isRequired=0, + ), +# (void)handleTakeValue:(id)value forUnboundKey:(NSString *)key + _objc.selector( + None, + selector='handleTakeValue:forUnboundKey:', + signature='v@:@@', + isRequired=0, + ), +# (id)storedValueForKey:(NSString *)key + _objc.selector( + None, + selector='storedValueForKey:', + signature='@@:@', + isRequired=0, + ), +# (void)takeStoredValue:(id)value forKey:(NSString *)key + _objc.selector( + None, + selector='takeStoredValue:forKey:', + signature='v@:@@', + isRequired=0, + ), +# (void)takeValue:(id)value forKey:(NSString *)key + _objc.selector( + None, + selector='takeValue:forKey:', + signature='v@:@@', + isRequired=0, + ), +# (void)takeValue:(id)value forKeyPath:(NSString *)keyPath + _objc.selector( + None, + selector='takeValue:forKeyPath:', + signature='v@:@@', + isRequired=0, + ), +# (void)takeValuesFromDictionary:(NSDictionary *)properties + _objc.selector( + None, + selector='takeValuesFromDictionary:', + signature='v@:@', + isRequired=0, + ), +# (void)unableToSetNilForKey:(NSString *)key + _objc.selector( + None, + selector='unableToSetNilForKey:', + signature='v@:@', + isRequired=0, + ), +# (BOOL)useStoredAccessor + _objc.selector( + None, + selector='useStoredAccessor', + signature='c@:', + isClassMethod=1, + isRequired=0, + ), +# (NSDictionary *)valuesForKeys:(NSArray *)keys + _objc.selector( + None, + selector='valuesForKeys:', + signature='@@:@', + isRequired=0, + ), + ] +) + +NSDistantObjectRequestMethods = _objc.informal_protocol( + "NSDistantObjectRequestMethods", + [ +# (BOOL)connection:(NSConnection *)connection handleRequest:(NSDistantObjectRequest *)doreq + _objc.selector( + None, + selector='connection:handleRequest:', + signature='c@:@@', + isRequired=0, + ), + ] +) + +NSDistributedObjects = _objc.informal_protocol( + "NSDistributedObjects", + [ +# (Class)classForPortCoder + _objc.selector( + None, + selector='classForPortCoder', + signature='#@:', + isRequired=0, + ), +# (id)replacementObjectForPortCoder:(NSPortCoder *)coder + _objc.selector( + None, + selector='replacementObjectForPortCoder:', + signature='@@:@', + isRequired=0, + ), + ] +) + +NSErrorRecoveryAttempting = _objc.informal_protocol( + "NSErrorRecoveryAttempting", + [ +# (BOOL)attemptRecoveryFromError:(NSError *)error optionIndex:(unsigned int)recoveryOptionIndex + _objc.selector( + None, + selector='attemptRecoveryFromError:optionIndex:', + signature='c@:@I', + isRequired=0, + ), +# (void)attemptRecoveryFromError:(NSError *)error optionIndex:(unsigned int)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo + _objc.selector( + None, + selector='attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo:', + signature='v@:@I@:^v', + isRequired=0, + ), + ] +) + +NSKeyValueCoding = _objc.informal_protocol( + "NSKeyValueCoding", + [ +# (BOOL)accessInstanceVariablesDirectly + _objc.selector( + None, + selector='accessInstanceVariablesDirectly', + signature='c@:', + isClassMethod=1, + isRequired=0, + ), +# (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys + _objc.selector( + None, + selector='dictionaryWithValuesForKeys:', + signature='@@:@', + isRequired=0, + ), +# (NSMutableArray *)mutableArrayValueForKey:(NSString *)key + _objc.selector( + None, + selector='mutableArrayValueForKey:', + signature='@@:@', + isRequired=0, + ), +# (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath + _objc.selector( + None, + selector='mutableArrayValueForKeyPath:', + signature='@@:@', + isRequired=0, + ), +# (NSMutableSet *)mutableSetValueForKey:(NSString *)key + _objc.selector( + None, + selector='mutableSetValueForKey:', + signature='@@:@', + isRequired=0, + ), +# (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath + _objc.selector( + None, + selector='mutableSetValueForKeyPath:', + signature='@@:@', + isRequired=0, + ), +# (void)setNilValueForKey:(NSString *)key + _objc.selector( + None, + selector='setNilValueForKey:', + signature='v@:@', + isRequired=0, + ), +# (void)setValue:(id)value forKey:(NSString *)key + _objc.selector( + None, + selector='setValue:forKey:', + signature='v@:@@', + isRequired=0, + ), +# (void)setValue:(id)value forKeyPath:(NSString *)keyPath + _objc.selector( + None, + selector='setValue:forKeyPath:', + signature='v@:@@', + isRequired=0, + ), +# (void)setValue:(id)value forUndefinedKey:(NSString *)key + _objc.selector( + None, + selector='setValue:forUndefinedKey:', + signature='v@:@@', + isRequired=0, + ), +# (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues + _objc.selector( + None, + selector='setValuesForKeysWithDictionary:', + signature='v@:@', + isRequired=0, + ), +# (BOOL)validateValue:(id *)ioValue forKey:(NSString *)inKey error:(NSError **)outError + _objc.selector( + None, + selector='validateValue:forKey:error:', + signature='c@:^@@^@', + isRequired=0, + ), +# (BOOL)validateValue:(id *)ioValue forKeyPath:(NSString *)inKeyPath error:(NSError **)outError + _objc.selector( + None, + selector='validateValue:forKeyPath:error:', + signature='c@:^@@^@', + isRequired=0, + ), +# (id)valueForKey:(NSString *)key + _objc.selector( + None, + selector='valueForKey:', + signature='@@:@', + isRequired=0, + ), +# (id)valueForKeyPath:(NSString *)keyPath + _objc.selector( + None, + selector='valueForKeyPath:', + signature='@@:@', + isRequired=0, + ), +# (id)valueForUndefinedKey:(NSString *)key + _objc.selector( + None, + selector='valueForUndefinedKey:', + signature='@@:@', + isRequired=0, + ), + ] +) + +NSKeyValueObserverNotification = _objc.informal_protocol( + "NSKeyValueObserverNotification", + [ +# (void)didChange:(NSKeyValueChange)changeKind valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key + _objc.selector( + None, + selector='didChange:valuesAtIndexes:forKey:', + signature='v@:i@@', + isRequired=0, + ), +# (void)didChangeValueForKey:(NSString *)key + _objc.selector( + None, + selector='didChangeValueForKey:', + signature='v@:@', + isRequired=0, + ), +# (void)didChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects + _objc.selector( + None, + selector='didChangeValueForKey:withSetMutation:usingObjects:', + signature='v@:@i@', + isRequired=0, + ), +# (void)willChange:(NSKeyValueChange)changeKind valuesAtIndexes:(NSIndexSet *)indexes forKey:(NSString *)key + _objc.selector( + None, + selector='willChange:valuesAtIndexes:forKey:', + signature='v@:i@@', + isRequired=0, + ), +# (void)willChangeValueForKey:(NSString *)key + _objc.selector( + None, + selector='willChangeValueForKey:', + signature='v@:@', + isRequired=0, + ), +# (void)willChangeValueForKey:(NSString *)key withSetMutation:(NSKeyValueSetMutationKind)mutationKind usingObjects:(NSSet *)objects + _objc.selector( + None, + selector='willChangeValueForKey:withSetMutation:usingObjects:', + signature='v@:@i@', + isRequired=0, + ), + ] +) + +NSKeyValueObserverRegistration = _objc.informal_protocol( + "NSKeyValueObserverRegistration", + [ +# (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context + _objc.selector( + None, + selector='addObserver:forKeyPath:options:context:', + signature='v@:@@I^v', + isRequired=0, + ), +# (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath + _objc.selector( + None, + selector='removeObserver:forKeyPath:', + signature='v@:@@', + isRequired=0, + ), + ] +) + +NSKeyValueObserving = _objc.informal_protocol( + "NSKeyValueObserving", + [ +# (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context + _objc.selector( + None, + selector='observeValueForKeyPath:ofObject:change:context:', + signature='v@:@@@^v', + isRequired=0, + ), + ] +) + +NSKeyValueObservingCustomization = _objc.informal_protocol( + "NSKeyValueObservingCustomization", + [ +# (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key + _objc.selector( + None, + selector='automaticallyNotifiesObserversForKey:', + signature='c@:@', + isClassMethod=1, + isRequired=0, + ), +# (void *)observationInfo + _objc.selector( + None, + selector='observationInfo', + signature='^v@:', + isRequired=0, + ), +# (void)setKeys:(NSArray *)keys triggerChangeNotificationsForDependentKey:(NSString *)dependentKey + _objc.selector( + None, + selector='setKeys:triggerChangeNotificationsForDependentKey:', + signature='v@:@@', + isClassMethod=1, + isRequired=0, + ), +# (void)setObservationInfo:(void *)observationInfo + _objc.selector( + None, + selector='setObservationInfo:', + signature='v@:^v', + isRequired=0, + ), + ] +) + +NSKeyedArchiverDelegate = _objc.informal_protocol( + "NSKeyedArchiverDelegate", + [ +# (void)archiver:(NSKeyedArchiver *)archiver didEncodeObject:(id)object + _objc.selector( + None, + selector='archiver:didEncodeObject:', + signature='v@:@@', + isRequired=0, + ), +# (id)archiver:(NSKeyedArchiver *)archiver willEncodeObject:(id)object + _objc.selector( + None, + selector='archiver:willEncodeObject:', + signature='@@:@@', + isRequired=0, + ), +# (void)archiver:(NSKeyedArchiver *)archiver willReplaceObject:(id)object withObject:(id)newObject + _objc.selector( + None, + selector='archiver:willReplaceObject:withObject:', + signature='v@:@@@', + isRequired=0, + ), +# (void)archiverDidFinish:(NSKeyedArchiver *)archiver + _objc.selector( + None, + selector='archiverDidFinish:', + signature='v@:@', + isRequired=0, + ), +# (void)archiverWillFinish:(NSKeyedArchiver *)archiver + _objc.selector( + None, + selector='archiverWillFinish:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSKeyedArchiverObjectSubstitution = _objc.informal_protocol( + "NSKeyedArchiverObjectSubstitution", + [ +# (NSArray *)classFallbacksForKeyedArchiver + _objc.selector( + None, + selector='classFallbacksForKeyedArchiver', + signature='@@:', + isClassMethod=1, + isRequired=0, + ), +# (Class)classForKeyedArchiver + _objc.selector( + None, + selector='classForKeyedArchiver', + signature='#@:', + isRequired=0, + ), +# (id)replacementObjectForKeyedArchiver:(NSKeyedArchiver *)archiver + _objc.selector( + None, + selector='replacementObjectForKeyedArchiver:', + signature='@@:@', + isRequired=0, + ), + ] +) + +NSKeyedUnarchiverDelegate = _objc.informal_protocol( + "NSKeyedUnarchiverDelegate", + [ +# (Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames + _objc.selector( + None, + selector='unarchiver:cannotDecodeObjectOfClassName:originalClasses:', + signature='#@:@@@', + isRequired=0, + ), +# (id)unarchiver:(NSKeyedUnarchiver *)unarchiver didDecodeObject:(id)object + _objc.selector( + None, + selector='unarchiver:didDecodeObject:', + signature='@@:@@', + isRequired=0, + ), +# (void)unarchiver:(NSKeyedUnarchiver *)unarchiver willReplaceObject:(id)object withObject:(id)newObject + _objc.selector( + None, + selector='unarchiver:willReplaceObject:withObject:', + signature='v@:@@@', + isRequired=0, + ), +# (void)unarchiverDidFinish:(NSKeyedUnarchiver *)unarchiver + _objc.selector( + None, + selector='unarchiverDidFinish:', + signature='v@:@', + isRequired=0, + ), +# (void)unarchiverWillFinish:(NSKeyedUnarchiver *)unarchiver + _objc.selector( + None, + selector='unarchiverWillFinish:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSKeyedUnarchiverObjectSubstitution = _objc.informal_protocol( + "NSKeyedUnarchiverObjectSubstitution", + [ +# (Class)classForKeyedUnarchiver + _objc.selector( + None, + selector='classForKeyedUnarchiver', + signature='#@:', + isClassMethod=1, + isRequired=0, + ), + ] +) + +NSLocking = _objc.informal_protocol( + "NSLocking", + [ +# (void)lock + _objc.selector( + None, + selector='lock', + signature='v@:', + isRequired=0, + ), +# (void)unlock + _objc.selector( + None, + selector='unlock', + signature='v@:', + isRequired=0, + ), + ] +) + +NSMachPortDelegateMethods = _objc.informal_protocol( + "NSMachPortDelegateMethods", + [ +# (void)handleMachMessage:(void *)msg + _objc.selector( + None, + selector='handleMachMessage:', + signature='v@:^v', + isRequired=0, + ), + ] +) + +NSMainThreadPerformAdditions = _objc.informal_protocol( + "NSMainThreadPerformAdditions", + [ +# (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait + _objc.selector( + None, + selector='performSelectorOnMainThread:withObject:waitUntilDone:', + signature='v@::@c', + isRequired=0, + ), +# (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait modes:(NSArray *)array + _objc.selector( + None, + selector='performSelectorOnMainThread:withObject:waitUntilDone:modes:', + signature='v@::@c@', + isRequired=0, + ), + ] +) + +NSMetadataQueryDelegate = _objc.informal_protocol( + "NSMetadataQueryDelegate", + [ +# (id)metadataQuery:(NSMetadataQuery *)query replacementObjectForResultObject:(NSMetadataItem *)result + _objc.selector( + None, + selector='metadataQuery:replacementObjectForResultObject:', + signature='@@:@@', + isRequired=0, + ), +# (id)metadataQuery:(NSMetadataQuery *)query replacementValueForAttribute:(NSString *)attrName value:(id)attrValue + _objc.selector( + None, + selector='metadataQuery:replacementValueForAttribute:value:', + signature='@@:@@@', + isRequired=0, + ), + ] +) + +NSMutableCopying = _objc.informal_protocol( + "NSMutableCopying", + [ +# (id)mutableCopyWithZone:(NSZone *)zone + _objc.selector( + None, + selector='mutableCopyWithZone:', + signature='@@:^{_NSZone=}', + isRequired=0, + ), + ] +) + +NSNetServiceBrowserDelegateMethods = _objc.informal_protocol( + "NSNetServiceBrowserDelegateMethods", + [ +# (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindDomain:(NSString *)domainString moreComing:(BOOL)moreComing + _objc.selector( + None, + selector='netServiceBrowser:didFindDomain:moreComing:', + signature='v@:@@c', + isRequired=0, + ), +# (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing + _objc.selector( + None, + selector='netServiceBrowser:didFindService:moreComing:', + signature='v@:@@c', + isRequired=0, + ), +# (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict + _objc.selector( + None, + selector='netServiceBrowser:didNotSearch:', + signature='v@:@@', + isRequired=0, + ), +# (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveDomain:(NSString *)domainString moreComing:(BOOL)moreComing + _objc.selector( + None, + selector='netServiceBrowser:didRemoveDomain:moreComing:', + signature='v@:@@c', + isRequired=0, + ), +# (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didRemoveService:(NSNetService *)aNetService moreComing:(BOOL)moreComing + _objc.selector( + None, + selector='netServiceBrowser:didRemoveService:moreComing:', + signature='v@:@@c', + isRequired=0, + ), +# (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser + _objc.selector( + None, + selector='netServiceBrowserDidStopSearch:', + signature='v@:@', + isRequired=0, + ), +# (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser + _objc.selector( + None, + selector='netServiceBrowserWillSearch:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSNetServiceDelegateMethods = _objc.informal_protocol( + "NSNetServiceDelegateMethods", + [ +# (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict + _objc.selector( + None, + selector='netService:didNotPublish:', + signature='v@:@@', + isRequired=0, + ), +# (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict + _objc.selector( + None, + selector='netService:didNotResolve:', + signature='v@:@@', + isRequired=0, + ), +# (void)netService:(NSNetService *)sender didUpdateTXTRecordData:(NSData *)data + _objc.selector( + None, + selector='netService:didUpdateTXTRecordData:', + signature='v@:@@', + isRequired=0, + ), +# (void)netServiceDidPublish:(NSNetService *)sender + _objc.selector( + None, + selector='netServiceDidPublish:', + signature='v@:@', + isRequired=0, + ), +# (void)netServiceDidResolveAddress:(NSNetService *)sender + _objc.selector( + None, + selector='netServiceDidResolveAddress:', + signature='v@:@', + isRequired=0, + ), +# (void)netServiceDidStop:(NSNetService *)sender + _objc.selector( + None, + selector='netServiceDidStop:', + signature='v@:@', + isRequired=0, + ), +# (void)netServiceWillPublish:(NSNetService *)sender + _objc.selector( + None, + selector='netServiceWillPublish:', + signature='v@:@', + isRequired=0, + ), +# (void)netServiceWillResolve:(NSNetService *)sender + _objc.selector( + None, + selector='netServiceWillResolve:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSObjCTypeSerializationCallBack = _objc.informal_protocol( + "NSObjCTypeSerializationCallBack", + [ +# (void)deserializeObjectAt:(id *)object ofObjCType:(const char *)type fromData:(NSData *)data atCursor:(unsigned *)cursor + _objc.selector( + None, + selector='deserializeObjectAt:ofObjCType:fromData:atCursor:', + signature='v@:^@r*@^I', + isRequired=0, + ), +# (void)serializeObjectAt:(id *)object ofObjCType:(const char *)type intoData:(NSMutableData *)data + _objc.selector( + None, + selector='serializeObjectAt:ofObjCType:intoData:', + signature='v@:^@r*@', + isRequired=0, + ), + ] +) + +NSObject = _objc.informal_protocol( + "NSObject", + [ +# (id)autorelease + _objc.selector( + None, + selector='autorelease', + signature='@@:', + isRequired=0, + ), +# (Class)class + _objc.selector( + None, + selector='class', + signature='#@:', + isRequired=0, + ), +# (BOOL)conformsToProtocol:(Protocol *)aProtocol + _objc.selector( + None, + selector='conformsToProtocol:', + signature='c@:@', + isRequired=0, + ), +# (NSString *)description + _objc.selector( + None, + selector='description', + signature='@@:', + isRequired=0, + ), +# (unsigned)hash + _objc.selector( + None, + selector='hash', + signature='I@:', + isRequired=0, + ), +# (BOOL)isEqual:(id)object + _objc.selector( + None, + selector='isEqual:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)isKindOfClass:(Class)aClass + _objc.selector( + None, + selector='isKindOfClass:', + signature='c@:#', + isRequired=0, + ), +# (BOOL)isMemberOfClass:(Class)aClass + _objc.selector( + None, + selector='isMemberOfClass:', + signature='c@:#', + isRequired=0, + ), +# (BOOL)isProxy + _objc.selector( + None, + selector='isProxy', + signature='c@:', + isRequired=0, + ), +# (id)performSelector:(SEL)aSelector + _objc.selector( + None, + selector='performSelector:', + signature='@@::', + isRequired=0, + ), +# (id)performSelector:(SEL)aSelector withObject:(id)object + _objc.selector( + None, + selector='performSelector:withObject:', + signature='@@::@', + isRequired=0, + ), +# (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2 + _objc.selector( + None, + selector='performSelector:withObject:withObject:', + signature='@@::@@', + isRequired=0, + ), +# (oneway void)release + _objc.selector( + None, + selector='release', + signature='v@:', + isRequired=0, + ), +# (BOOL)respondsToSelector:(SEL)aSelector + _objc.selector( + None, + selector='respondsToSelector:', + signature='c@::', + isRequired=0, + ), +# (id)retain + _objc.selector( + None, + selector='retain', + signature='@@:', + isRequired=0, + ), +# (unsigned)retainCount + _objc.selector( + None, + selector='retainCount', + signature='I@:', + isRequired=0, + ), +# (id)self + _objc.selector( + None, + selector='self', + signature='@@:', + isRequired=0, + ), +# (Class)superclass + _objc.selector( + None, + selector='superclass', + signature='#@:', + isRequired=0, + ), +# (NSZone *)zone + _objc.selector( + None, + selector='zone', + signature='^{_NSZone=}@:', + isRequired=0, + ), + ] +) + +NSPortDelegateMethods = _objc.informal_protocol( + "NSPortDelegateMethods", + [ +# (void)handlePortMessage:(NSPortMessage *)message + _objc.selector( + None, + selector='handlePortMessage:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSScriptClassDescription = _objc.informal_protocol( + "NSScriptClassDescription", + [ +# (unsigned long)classCode + _objc.selector( + None, + selector='classCode', + signature='L@:', + isRequired=0, + ), +# (NSString *)className + _objc.selector( + None, + selector='className', + signature='@@:', + isRequired=0, + ), + ] +) + +NSScriptKeyValueCoding = _objc.informal_protocol( + "NSScriptKeyValueCoding", + [ +# (id)coerceValue:(id)value forKey:(NSString *)key + _objc.selector( + None, + selector='coerceValue:forKey:', + signature='@@:@@', + isRequired=0, + ), +# (void)insertValue:(id)value atIndex:(unsigned)index inPropertyWithKey:(NSString *)key + _objc.selector( + None, + selector='insertValue:atIndex:inPropertyWithKey:', + signature='v@:@I@', + isRequired=0, + ), +# (void)insertValue:(id)value inPropertyWithKey:(NSString *)key + _objc.selector( + None, + selector='insertValue:inPropertyWithKey:', + signature='v@:@@', + isRequired=0, + ), +# (void)removeValueAtIndex:(unsigned)index fromPropertyWithKey:(NSString *)key + _objc.selector( + None, + selector='removeValueAtIndex:fromPropertyWithKey:', + signature='v@:I@', + isRequired=0, + ), +# (void)replaceValueAtIndex:(unsigned)index inPropertyWithKey:(NSString *)key withValue:(id)value + _objc.selector( + None, + selector='replaceValueAtIndex:inPropertyWithKey:withValue:', + signature='v@:I@@', + isRequired=0, + ), +# (id)valueAtIndex:(unsigned)index inPropertyWithKey:(NSString *)key + _objc.selector( + None, + selector='valueAtIndex:inPropertyWithKey:', + signature='@@:I@', + isRequired=0, + ), +# (id)valueWithName:(NSString *)name inPropertyWithKey:(NSString *)key + _objc.selector( + None, + selector='valueWithName:inPropertyWithKey:', + signature='@@:@@', + isRequired=0, + ), +# (id)valueWithUniqueID:(id)uniqueID inPropertyWithKey:(NSString *)key + _objc.selector( + None, + selector='valueWithUniqueID:inPropertyWithKey:', + signature='@@:@@', + isRequired=0, + ), + ] +) + +NSScriptObjectSpecifiers = _objc.informal_protocol( + "NSScriptObjectSpecifiers", + [ +# (NSArray *)indicesOfObjectsByEvaluatingObjectSpecifier:(NSScriptObjectSpecifier *)specifier + _objc.selector( + None, + selector='indicesOfObjectsByEvaluatingObjectSpecifier:', + signature='@@:@', + isRequired=0, + ), +# (NSScriptObjectSpecifier *)objectSpecifier + _objc.selector( + None, + selector='objectSpecifier', + signature='@@:', + isRequired=0, + ), + ] +) + +NSScripting = _objc.informal_protocol( + "NSScripting", + [ +# (NSDictionary *)scriptingProperties + _objc.selector( + None, + selector='scriptingProperties', + signature='@@:', + isRequired=0, + ), +# (void)setScriptingProperties:(NSDictionary *)properties + _objc.selector( + None, + selector='setScriptingProperties:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSScriptingComparisonMethods = _objc.informal_protocol( + "NSScriptingComparisonMethods", + [ +# (BOOL)scriptingBeginsWith:(id)object + _objc.selector( + None, + selector='scriptingBeginsWith:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)scriptingContains:(id)object + _objc.selector( + None, + selector='scriptingContains:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)scriptingEndsWith:(id)object + _objc.selector( + None, + selector='scriptingEndsWith:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)scriptingIsEqualTo:(id)object + _objc.selector( + None, + selector='scriptingIsEqualTo:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)scriptingIsGreaterThan:(id)object + _objc.selector( + None, + selector='scriptingIsGreaterThan:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)scriptingIsGreaterThanOrEqualTo:(id)object + _objc.selector( + None, + selector='scriptingIsGreaterThanOrEqualTo:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)scriptingIsLessThan:(id)object + _objc.selector( + None, + selector='scriptingIsLessThan:', + signature='c@:@', + isRequired=0, + ), +# (BOOL)scriptingIsLessThanOrEqualTo:(id)object + _objc.selector( + None, + selector='scriptingIsLessThanOrEqualTo:', + signature='c@:@', + isRequired=0, + ), + ] +) + +NSSpellServerDelegate = _objc.informal_protocol( + "NSSpellServerDelegate", + [ +# (void)spellServer:(NSSpellServer *)sender didForgetWord:(NSString *)word inLanguage:(NSString *)language + _objc.selector( + None, + selector='spellServer:didForgetWord:inLanguage:', + signature='v@:@@@', + isRequired=0, + ), +# (void)spellServer:(NSSpellServer *)sender didLearnWord:(NSString *)word inLanguage:(NSString *)language + _objc.selector( + None, + selector='spellServer:didLearnWord:inLanguage:', + signature='v@:@@@', + isRequired=0, + ), +# (NSRange)spellServer:(NSSpellServer *)sender findMisspelledWordInString:(NSString *)stringToCheck language:(NSString *)language wordCount:(int *)wordCount countOnly:(BOOL)countOnly + _objc.selector( + None, + selector='spellServer:findMisspelledWordInString:language:wordCount:countOnly:', + signature='{_NSRange=II}@:@@@^ic', + isRequired=0, + ), +# (NSArray *)spellServer:(NSSpellServer *)sender suggestCompletionsForPartialWordRange:(NSRange)range inString:(NSString *)string language:(NSString *)language + _objc.selector( + None, + selector='spellServer:suggestCompletionsForPartialWordRange:inString:language:', + signature='@@:@{_NSRange=II}@@', + isRequired=0, + ), +# (NSArray *)spellServer:(NSSpellServer *)sender suggestGuessesForWord:(NSString *)word inLanguage:(NSString *)language + _objc.selector( + None, + selector='spellServer:suggestGuessesForWord:inLanguage:', + signature='@@:@@@', + isRequired=0, + ), + ] +) + +NSStreamDelegateEventExtensions = _objc.informal_protocol( + "NSStreamDelegateEventExtensions", + [ +# (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode + _objc.selector( + None, + selector='stream:handleEvent:', + signature='v@:@i', + isRequired=0, + ), + ] +) + +NSURLAuthenticationChallengeSender = _objc.informal_protocol( + "NSURLAuthenticationChallengeSender", + [ +# (void)cancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='cancelAuthenticationChallenge:', + signature='v@:@', + isRequired=0, + ), +# (void)continueWithoutCredentialForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='continueWithoutCredentialForAuthenticationChallenge:', + signature='v@:@', + isRequired=0, + ), +# (void)useCredential:(NSURLCredential *)credential forAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='useCredential:forAuthenticationChallenge:', + signature='v@:@@', + isRequired=0, + ), + ] +) + +NSURLClient = _objc.informal_protocol( + "NSURLClient", + [ +# (void)URL:(NSURL *)sender resourceDataDidBecomeAvailable:(NSData *)newBytes + _objc.selector( + None, + selector='URL:resourceDataDidBecomeAvailable:', + signature='v@:@@', + isRequired=0, + ), +# (void)URL:(NSURL *)sender resourceDidFailLoadingWithReason:(NSString *)reason + _objc.selector( + None, + selector='URL:resourceDidFailLoadingWithReason:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLResourceDidCancelLoading:(NSURL *)sender + _objc.selector( + None, + selector='URLResourceDidCancelLoading:', + signature='v@:@', + isRequired=0, + ), +# (void)URLResourceDidFinishLoading:(NSURL *)sender + _objc.selector( + None, + selector='URLResourceDidFinishLoading:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSURLConnectionDelegate = _objc.informal_protocol( + "NSURLConnectionDelegate", + [ +# (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='connection:didCancelAuthenticationChallenge:', + signature='v@:@@', + isRequired=0, + ), +# (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error + _objc.selector( + None, + selector='connection:didFailWithError:', + signature='v@:@@', + isRequired=0, + ), +# (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='connection:didReceiveAuthenticationChallenge:', + signature='v@:@@', + isRequired=0, + ), +# (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data + _objc.selector( + None, + selector='connection:didReceiveData:', + signature='v@:@@', + isRequired=0, + ), +# (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response + _objc.selector( + None, + selector='connection:didReceiveResponse:', + signature='v@:@@', + isRequired=0, + ), +# (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse + _objc.selector( + None, + selector='connection:willCacheResponse:', + signature='@@:@@', + isRequired=0, + ), +# (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response + _objc.selector( + None, + selector='connection:willSendRequest:redirectResponse:', + signature='@@:@@@', + isRequired=0, + ), +# (void)connectionDidFinishLoading:(NSURLConnection *)connection + _objc.selector( + None, + selector='connectionDidFinishLoading:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSURLDownloadDelegate = _objc.informal_protocol( + "NSURLDownloadDelegate", + [ +# (void)download:(NSURLDownload *)download decideDestinationWithSuggestedFilename:(NSString *)filename + _objc.selector( + None, + selector='download:decideDestinationWithSuggestedFilename:', + signature='v@:@@', + isRequired=0, + ), +# (void)download:(NSURLDownload *)download didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='download:didCancelAuthenticationChallenge:', + signature='v@:@@', + isRequired=0, + ), +# (void)download:(NSURLDownload *)download didCreateDestination:(NSString *)path + _objc.selector( + None, + selector='download:didCreateDestination:', + signature='v@:@@', + isRequired=0, + ), +# (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error + _objc.selector( + None, + selector='download:didFailWithError:', + signature='v@:@@', + isRequired=0, + ), +# (void)download:(NSURLDownload *)download didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='download:didReceiveAuthenticationChallenge:', + signature='v@:@@', + isRequired=0, + ), +# (void)download:(NSURLDownload *)download didReceiveDataOfLength:(unsigned)length + _objc.selector( + None, + selector='download:didReceiveDataOfLength:', + signature='v@:@I', + isRequired=0, + ), +# (void)download:(NSURLDownload *)download didReceiveResponse:(NSURLResponse *)response + _objc.selector( + None, + selector='download:didReceiveResponse:', + signature='v@:@@', + isRequired=0, + ), +# (BOOL)download:(NSURLDownload *)download shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType + _objc.selector( + None, + selector='download:shouldDecodeSourceDataOfMIMEType:', + signature='c@:@@', + isRequired=0, + ), +# (void)download:(NSURLDownload *)download willResumeWithResponse:(NSURLResponse *)response fromByte:(long long)startingByte + _objc.selector( + None, + selector='download:willResumeWithResponse:fromByte:', + signature='v@:@@q', + isRequired=0, + ), +# (NSURLRequest *)download:(NSURLDownload *)download willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse + _objc.selector( + None, + selector='download:willSendRequest:redirectResponse:', + signature='@@:@@@', + isRequired=0, + ), +# (void)downloadDidBegin:(NSURLDownload *)download + _objc.selector( + None, + selector='downloadDidBegin:', + signature='v@:@', + isRequired=0, + ), +# (void)downloadDidFinish:(NSURLDownload *)download + _objc.selector( + None, + selector='downloadDidFinish:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSURLHandleClient = _objc.informal_protocol( + "NSURLHandleClient", + [ +# (void)URLHandle:(NSURLHandle *)sender resourceDataDidBecomeAvailable:(NSData *)newBytes + _objc.selector( + None, + selector='URLHandle:resourceDataDidBecomeAvailable:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLHandle:(NSURLHandle *)sender resourceDidFailLoadingWithReason:(NSString *)reason + _objc.selector( + None, + selector='URLHandle:resourceDidFailLoadingWithReason:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLHandleResourceDidBeginLoading:(NSURLHandle *)sender + _objc.selector( + None, + selector='URLHandleResourceDidBeginLoading:', + signature='v@:@', + isRequired=0, + ), +# (void)URLHandleResourceDidCancelLoading:(NSURLHandle *)sender + _objc.selector( + None, + selector='URLHandleResourceDidCancelLoading:', + signature='v@:@', + isRequired=0, + ), +# (void)URLHandleResourceDidFinishLoading:(NSURLHandle *)sender + _objc.selector( + None, + selector='URLHandleResourceDidFinishLoading:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSURLProtocolClient = _objc.informal_protocol( + "NSURLProtocolClient", + [ +# (void)URLProtocol:(NSURLProtocol *)protocol cachedResponseIsValid:(NSCachedURLResponse *)cachedResponse + _objc.selector( + None, + selector='URLProtocol:cachedResponseIsValid:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLProtocol:(NSURLProtocol *)protocol didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='URLProtocol:didCancelAuthenticationChallenge:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLProtocol:(NSURLProtocol *)protocol didFailWithError:(NSError *)error + _objc.selector( + None, + selector='URLProtocol:didFailWithError:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLProtocol:(NSURLProtocol *)protocol didLoadData:(NSData *)data + _objc.selector( + None, + selector='URLProtocol:didLoadData:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLProtocol:(NSURLProtocol *)protocol didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge + _objc.selector( + None, + selector='URLProtocol:didReceiveAuthenticationChallenge:', + signature='v@:@@', + isRequired=0, + ), +# (void)URLProtocol:(NSURLProtocol *)protocol didReceiveResponse:(NSURLResponse *)response cacheStoragePolicy:(NSURLCacheStoragePolicy)policy + _objc.selector( + None, + selector='URLProtocol:didReceiveResponse:cacheStoragePolicy:', + signature='v@:@@i', + isRequired=0, + ), +# (void)URLProtocol:(NSURLProtocol *)protocol wasRedirectedToRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse + _objc.selector( + None, + selector='URLProtocol:wasRedirectedToRequest:redirectResponse:', + signature='v@:@@@', + isRequired=0, + ), +# (void)URLProtocolDidFinishLoading:(NSURLProtocol *)protocol + _objc.selector( + None, + selector='URLProtocolDidFinishLoading:', + signature='v@:@', + isRequired=0, + ), + ] +) + +NSXMLParserDelegateEventAdditions = _objc.informal_protocol( + "NSXMLParserDelegateEventAdditions", + [ +# (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName + _objc.selector( + None, + selector='parser:didEndElement:namespaceURI:qualifiedName:', + signature='v@:@@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser didEndMappingPrefix:(NSString *)prefix + _objc.selector( + None, + selector='parser:didEndMappingPrefix:', + signature='v@:@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict + _objc.selector( + None, + selector='parser:didStartElement:namespaceURI:qualifiedName:attributes:', + signature='v@:@@@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser didStartMappingPrefix:(NSString *)prefix toURI:(NSString *)namespaceURI + _objc.selector( + None, + selector='parser:didStartMappingPrefix:toURI:', + signature='v@:@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundAttributeDeclarationWithName:(NSString *)attributeName forElement:(NSString *)elementName type:(NSString *)type defaultValue:(NSString *)defaultValue + _objc.selector( + None, + selector='parser:foundAttributeDeclarationWithName:forElement:type:defaultValue:', + signature='v@:@@@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock + _objc.selector( + None, + selector='parser:foundCDATA:', + signature='v@:@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string + _objc.selector( + None, + selector='parser:foundCharacters:', + signature='v@:@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundComment:(NSString *)comment + _objc.selector( + None, + selector='parser:foundComment:', + signature='v@:@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundElementDeclarationWithName:(NSString *)elementName model:(NSString *)model + _objc.selector( + None, + selector='parser:foundElementDeclarationWithName:model:', + signature='v@:@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundExternalEntityDeclarationWithName:(NSString *)name publicID:(NSString *)publicID systemID:(NSString *)systemID + _objc.selector( + None, + selector='parser:foundExternalEntityDeclarationWithName:publicID:systemID:', + signature='v@:@@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundIgnorableWhitespace:(NSString *)whitespaceString + _objc.selector( + None, + selector='parser:foundIgnorableWhitespace:', + signature='v@:@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundInternalEntityDeclarationWithName:(NSString *)name value:(NSString *)value + _objc.selector( + None, + selector='parser:foundInternalEntityDeclarationWithName:value:', + signature='v@:@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundNotationDeclarationWithName:(NSString *)name publicID:(NSString *)publicID systemID:(NSString *)systemID + _objc.selector( + None, + selector='parser:foundNotationDeclarationWithName:publicID:systemID:', + signature='v@:@@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundProcessingInstructionWithTarget:(NSString *)target data:(NSString *)data + _objc.selector( + None, + selector='parser:foundProcessingInstructionWithTarget:data:', + signature='v@:@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser foundUnparsedEntityDeclarationWithName:(NSString *)name publicID:(NSString *)publicID systemID:(NSString *)systemID notationName:(NSString *)notationName + _objc.selector( + None, + selector='parser:foundUnparsedEntityDeclarationWithName:publicID:systemID:notationName:', + signature='v@:@@@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError + _objc.selector( + None, + selector='parser:parseErrorOccurred:', + signature='v@:@@', + isRequired=0, + ), +# (NSData *)parser:(NSXMLParser *)parser resolveExternalEntityName:(NSString *)name systemID:(NSString *)systemID + _objc.selector( + None, + selector='parser:resolveExternalEntityName:systemID:', + signature='@@:@@@', + isRequired=0, + ), +# (void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validationError + _objc.selector( + None, + selector='parser:validationErrorOccurred:', + signature='v@:@@', + isRequired=0, + ), +# (void)parserDidEndDocument:(NSXMLParser *)parser + _objc.selector( + None, + selector='parserDidEndDocument:', + signature='v@:@', + isRequired=0, + ), +# (void)parserDidStartDocument:(NSXMLParser *)parser + _objc.selector( + None, + selector='parserDidStartDocument:', + signature='v@:@', + isRequired=0, + ), + ] +) + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4ccb71c --- /dev/null +++ b/LICENSE @@ -0,0 +1 @@ +Creative Commons Attribution-Noncommercial 3.0 United States License \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..4504cf9 --- /dev/null +++ b/README @@ -0,0 +1,4 @@ +This is the sourcecode behind python engine of the now dead podcatching application iPodderX. + +I open-sourced this code on my blog awhile ago but now that github exists I thought it better to post it here for everyone +to enjoy and learn from \ No newline at end of file diff --git a/btlocale/fr/LC_MESSAGES/bittorrent.mo b/btlocale/fr/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..2c5c685a464ce9b248e222fd9f648f2fe88e4f5e GIT binary patch literal 18488 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\n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:188 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:194 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:206 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:212 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:217 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/Encoder.py:173 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/GUI.py:149 +#, python-format +msgid "%d days" +msgstr "%d jours" + +#: BitTorrent/GUI.py:151 +#, python-format +msgid "1 day %d hours" +msgstr "1 jour %d heures" + +#: BitTorrent/GUI.py:153 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d heures" + +#: BitTorrent/GUI.py:155 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutes" + +#: BitTorrent/GUI.py:157 +#, python-format +msgid "%d seconds" +msgstr "%d secondes" + +#: BitTorrent/GUI.py:159 +msgid "0 seconds" +msgstr "0 secondes" + +#: BitTorrent/GUI.py:201 +#, python-format +msgid "%s Help" +msgstr "%s Aide" + +#: BitTorrent/GUI.py:208 +msgid "Frequently Asked Questions:" +msgstr "Foire Aux Questions" + +#: BitTorrent/GUI.py:213 +msgid "Go" +msgstr "Go" + +#: BitTorrent/GUI.py:434 BitTorrent/GUI.py:486 +msgid "Choose an existing folder..." +msgstr "" + +#: BitTorrent/GUI.py:444 +msgid "All Files" +msgstr "Tous les Fichiers" + +#: BitTorrent/GUI.py:449 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:483 +msgid "Create a new folder..." +msgstr "" + +#: BitTorrent/GUI.py:545 +msgid "Select file" +msgstr "Sélectionner fichier" + +#: BitTorrent/GUI.py:546 +msgid "Select folder" +msgstr "Sélectionner dossier" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Mon" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Tue" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Wed" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Thu" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Fri" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sat" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jan" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Feb" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Mar" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Apr" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "May" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jul" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Aug" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Sep" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Oct" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Nov" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Dec" +msgstr "" + +#: BitTorrent/HTTPHandler.py:83 +msgid "Got Accept-Encoding: " +msgstr "" + +#: BitTorrent/HTTPHandler.py:125 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "" + +#: BitTorrent/RawServer.py:273 +msgid "lost server socket" +msgstr "" + +#: BitTorrent/RawServer.py:289 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:371 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:172 +msgid "Problem connecting to tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:199 +msgid "bad data from tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:210 +msgid "rejected by tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:216 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:218 +msgid " Message from the tracker: " +msgstr "" + +#: BitTorrent/Rerequester.py:224 +msgid "warning from tracker - " +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Fastresume info doesn't match file modification time" +msgstr "" + +#: BitTorrent/Storage.py:243 +msgid "Fastresume data doesn't match actual filesize" +msgstr "" + +#: BitTorrent/Storage.py:257 BitTorrent/StorageWrapper.py:284 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/TorrentQueue.py:120 +msgid "Could not load saved state: " +msgstr "N'a pas pu charger l'état sauvegardé :" + +#: BitTorrent/TorrentQueue.py:160 +msgid "Version check failed: no DNS library" +msgstr "Echec vérification de la Version : pas de librairie DNS" + +#: BitTorrent/TorrentQueue.py:177 +msgid "DNS query failed" +msgstr "Echec Requète DNS" + +#: BitTorrent/TorrentQueue.py:179 +msgid "number of received TXT fields is not 1" +msgstr "Nombre de champ texte reçu n'est pas 1" + +#: BitTorrent/TorrentQueue.py:182 +msgid "number of strings in reply is not 1?" +msgstr "Nombre de chaînes reçu n'est pas 1 ?" + +#: BitTorrent/TorrentQueue.py:192 +msgid "Could not parse new version string" +msgstr "Analyse de la nouvelle chaine de version impossible" + +#: BitTorrent/TorrentQueue.py:202 +#, python-format +msgid "" +"A newer version of BitTorrent is available.\n" +"You can always get the latest version from\n" +"%s." +msgstr "" +"Une nouvelle version de Bit Torrent est disponible. \n" +"Vous pouvez toujours obtenir le dernière version depuis \n" +"%s" + +#: BitTorrent/TorrentQueue.py:207 +msgid "Version check failed: " +msgstr "Echec vérification de la version :" + +#: BitTorrent/TorrentQueue.py:244 +msgid "Could not save UI state: " +msgstr "N''a pas pu enregistrer l'état de l'IU :" + +#: BitTorrent/TorrentQueue.py:254 BitTorrent/TorrentQueue.py:256 +#: BitTorrent/TorrentQueue.py:329 BitTorrent/TorrentQueue.py:332 +#: BitTorrent/TorrentQueue.py:342 BitTorrent/TorrentQueue.py:354 +#: BitTorrent/TorrentQueue.py:371 +msgid "Invalid state file contents" +msgstr "Contenu du fichier d'état incorrect" + +#: BitTorrent/TorrentQueue.py:269 +msgid "Error reading file " +msgstr "Erreur à la lecture du fichier" + +#: BitTorrent/TorrentQueue.py:271 +msgid "cannot restore state completely" +msgstr "N'a pas pu complètement restaurer l'état" + +#: BitTorrent/TorrentQueue.py:274 +msgid "Invalid state file (duplicate entry)" +msgstr "Fichier d'état invalide (entrée double)" + +#: BitTorrent/TorrentQueue.py:280 BitTorrent/TorrentQueue.py:285 +msgid "Corrupt data in " +msgstr "Données endommagées dans" + +#: BitTorrent/TorrentQueue.py:281 BitTorrent/TorrentQueue.py:286 +msgid " , cannot restore torrent (" +msgstr ", restauration torrent impossible (" + +#: BitTorrent/TorrentQueue.py:300 +msgid "Invalid state file (bad entry)" +msgstr "Fichier d'état invalide (mauvaise entrée)" + +#: BitTorrent/TorrentQueue.py:319 +msgid "Bad UI state file" +msgstr "Mauvais fichier d'état d'IU" + +#: BitTorrent/TorrentQueue.py:323 +msgid "Bad UI state file version" +msgstr "Mauvaise version de fichier d'état d'IU" + +#: BitTorrent/TorrentQueue.py:325 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Version de fichier d'état d'IU non supportée (depuis une nouvelle version du " +"client ?)" + +#: BitTorrent/TorrentQueue.py:496 +msgid "Could not delete cached metainfo file:" +msgstr "Ne peut effacer les fichiers de méta-infos en cache :" + +#: BitTorrent/TorrentQueue.py:519 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Ce n'est pas un fichier torrent valable. (%s)" + +#: BitTorrent/TorrentQueue.py:527 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Ce torrent (ou un autre au contenu semblable) est déjà en cours." + +#: BitTorrent/TorrentQueue.py:531 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Ce torrent (ou un autre au contenu semblable) est déjà en attente." + +#: BitTorrent/TorrentQueue.py:538 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent à l'état inconnu %d" + +#: BitTorrent/TorrentQueue.py:555 +msgid "Could not write file " +msgstr "Écriture du fichier impossible" + +#: BitTorrent/TorrentQueue.py:557 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"Ce torrent ne sera pas redémarré correctement au prochain lancement du " +"client." + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Impossible de gérer plus de %d torrents simultanément. Pour plus d'infos, " +"voir la FAQ à %s." + +#: BitTorrent/TorrentQueue.py:758 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Aucun démarrage de torrent tant qu'il y a d'autres torrents en attente, et " +"celui-là correspond déjà aux critères d'arrêt d'essaimage." + +#: BitTorrent/TorrentQueue.py:764 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Aucun démarrage de torrent vu qu'il correspond déjà aux critères d'arrêt " +"d'essaimage du dernier torrent complété." + +#: BitTorrent/__init__.py:20 +msgid "Python 2.2.1 or newer required" +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:88 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:92 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:97 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:99 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:102 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:106 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:108 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:111 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:116 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:119 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:122 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:125 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/configfile.py:125 +msgid "Could not permanently save options: " +msgstr "" + +#: BitTorrent/controlsocket.py:108 BitTorrent/controlsocket.py:157 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:116 BitTorrent/controlsocket.py:134 +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:187 +msgid "Could not send command: " +msgstr "" + +#: BitTorrent/controlsocket.py:144 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:149 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/defaultargs.py:32 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" + +#: BitTorrent/defaultargs.py:36 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" + +#: BitTorrent/defaultargs.py:40 +msgid "ISO Language code to use" +msgstr "" + +#: BitTorrent/defaultargs.py:45 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" + +#: BitTorrent/defaultargs.py:48 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" + +#: BitTorrent/defaultargs.py:51 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" + +#: BitTorrent/defaultargs.py:53 +msgid "maximum port to listen on" +msgstr "" + +#: BitTorrent/defaultargs.py:55 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "" + +#: BitTorrent/defaultargs.py:57 +msgid "seconds between updates of displayed information" +msgstr "" + +#: BitTorrent/defaultargs.py:59 +msgid "minutes to wait between requesting more peers" +msgstr "" + +#: BitTorrent/defaultargs.py:61 +msgid "minimum number of peers to not do rerequesting" +msgstr "" + +#: BitTorrent/defaultargs.py:63 +msgid "number of peers at which to stop initiating new connections" +msgstr "" + +#: BitTorrent/defaultargs.py:65 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" + +#: BitTorrent/defaultargs.py:68 +msgid "whether to check hashes on disk" +msgstr "" + +#: BitTorrent/defaultargs.py:70 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "" + +#: BitTorrent/defaultargs.py:72 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" + +#: BitTorrent/defaultargs.py:74 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" + +#: BitTorrent/defaultargs.py:81 +msgid "number of seconds to pause between sending keepalives" +msgstr "" + +#: BitTorrent/defaultargs.py:83 +msgid "how many bytes to query for per request." +msgstr "" + +#: BitTorrent/defaultargs.py:85 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" + +#: BitTorrent/defaultargs.py:88 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" + +#: BitTorrent/defaultargs.py:91 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/defaultargs.py:93 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" + +#: BitTorrent/defaultargs.py:96 BitTorrent/defaultargs.py:98 +msgid "maximum amount of time to guess the current rate estimate represents" +msgstr "" + +#: BitTorrent/defaultargs.py:100 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" + +#: BitTorrent/defaultargs.py:102 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" + +#: BitTorrent/defaultargs.py:105 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" + +#: BitTorrent/defaultargs.py:107 +msgid "how many bytes to write into network buffers at once." +msgstr "" + +#: BitTorrent/defaultargs.py:109 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" + +#: BitTorrent/defaultargs.py:112 +msgid "do not connect to several peers that have the same IP address" +msgstr "" + +#: BitTorrent/defaultargs.py:114 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" + +#: BitTorrent/defaultargs.py:116 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" + +#: BitTorrent/defaultargs.py:118 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "" + +#: BitTorrent/defaultargs.py:120 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "" + +#: BitTorrent/defaultargs.py:122 +msgid "force max_allow_in to stay below 30 on Win32" +msgstr "" + +#: BitTorrent/defaultargs.py:139 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" + +#: BitTorrent/defaultargs.py:144 +msgid "display advanced user interface" +msgstr "" + +#: BitTorrent/defaultargs.py:146 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" + +#: BitTorrent/defaultargs.py:149 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" + +#: BitTorrent/defaultargs.py:152 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" + +#: BitTorrent/defaultargs.py:155 +msgid "start downloader in paused state" +msgstr "" + +#: BitTorrent/defaultargs.py:157 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" + +#: BitTorrent/defaultargs.py:171 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" + +#: BitTorrent/defaultargs.py:178 BitTorrent/defaultargs.py:198 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at once." +msgstr "" + +#: BitTorrent/defaultargs.py:183 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" + +#: BitTorrent/defaultargs.py:188 +msgid "file the server response was stored in, alternative to url" +msgstr "" + +#: BitTorrent/defaultargs.py:190 +msgid "url to get file from, alternative to responsefile" +msgstr "" + +#: BitTorrent/defaultargs.py:192 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" + +#: BitTorrent/defaultargs.py:203 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" + +#: BitTorrent/defaultargs.py:208 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "" + +#: BitTorrent/defaultargs.py:210 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" + +#: BitTorrent/defaultargs.py:225 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" + +#: BitTorrent/defaultargs.py:232 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "" + +#: BitTorrent/defaultargs.py:237 +msgid "whether to display diagnostic info to stdout" +msgstr "" + +#: BitTorrent/defaultargs.py:242 +msgid "which power of two to set the piece size to" +msgstr "" + +#: BitTorrent/defaultargs.py:244 +msgid "default tracker name" +msgstr "" + +#: BitTorrent/defaultargs.py:247 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" + +#: BitTorrent/download.py:92 +msgid "maxport less than minport - no ports to check" +msgstr "" + +#: BitTorrent/download.py:104 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "" + +#: BitTorrent/download.py:106 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:108 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:212 +msgid "Initial startup" +msgstr "" + +#: BitTorrent/download.py:264 +#, python-format +msgid "Could not load fastresume data: %s. " +msgstr "" + +#: BitTorrent/download.py:265 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:272 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:383 BitTorrent/launchmanycore.py:139 +msgid "downloading" +msgstr "" + +#: BitTorrent/download.py:393 +msgid "download failed: " +msgstr "" + +#: BitTorrent/download.py:397 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" + +#: BitTorrent/download.py:400 +msgid "killed by IO error: " +msgstr "" + +#: BitTorrent/download.py:403 +msgid "killed by OS error: " +msgstr "" + +#: BitTorrent/download.py:408 +msgid "killed by internal exception: " +msgstr "" + +#: BitTorrent/download.py:413 +msgid "Additional error when closing down due to error: " +msgstr "" + +#: BitTorrent/download.py:426 +msgid "Could not remove fastresume file after failure:" +msgstr "" + +#: BitTorrent/download.py:443 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:466 +msgid "Could not write fastresume data: " +msgstr "" + +#: BitTorrent/download.py:476 +msgid "shut down" +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:69 btdownloadcurses.py:354 +#: btdownloadheadless.py:237 +msgid "shutting down" +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:142 btlaunchmanycurses.py:58 +msgid "connecting to peers" +msgstr "" + +#: BitTorrent/launchmanycore.py:232 btdownloadcurses.py:361 +#: btdownloadheadless.py:244 +msgid "Error reading config: " +msgstr "" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/parseargs.py:23 +#, python-format +msgid "Usage: %s " +msgstr "" + +#: BitTorrent/parseargs.py:25 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:26 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:31 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:33 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:35 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:66 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:115 BitTorrent/parseargs.py:152 +msgid "unknown key " +msgstr "" + +#: BitTorrent/parseargs.py:121 BitTorrent/parseargs.py:131 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:135 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:142 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:144 +#, python-format +msgid "Must supply at least %d args." +msgstr "" + +#: BitTorrent/parseargs.py:146 +#, python-format +msgid "Too many args - %d max." +msgstr "" + +#: BitTorrent/parseargs.py:176 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send in an info message if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:161 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:246 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:269 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:305 +msgid "# Log Started: " +msgstr "" + +#: BitTorrent/track.py:307 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:315 +msgid "# Log reopened: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:457 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:467 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:480 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:494 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:850 btlaunchmanycurses.py:287 +msgid "error: " +msgstr "" + +#: BitTorrent/track.py:851 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:859 +msgid "# Shutting down: " +msgstr "" + +#: btdownloadcurses.py:45 btlaunchmanycurses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" + +#: btdownloadcurses.py:47 btlaunchmanycurses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" + +#: btdownloadcurses.py:52 btlaunchmanycurses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" + +#: btdownloadcurses.py:57 btdownloadheadless.py:39 +msgid "download complete!" +msgstr "" + +#: btdownloadcurses.py:62 btdownloadheadless.py:44 +msgid "" +msgstr "" + +#: btdownloadcurses.py:65 btdownloadheadless.py:47 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "" + +#: btdownloadcurses.py:151 +msgid "file:" +msgstr "" + +#: btdownloadcurses.py:152 +msgid "size:" +msgstr "" + +#: btdownloadcurses.py:153 +msgid "dest:" +msgstr "" + +#: btdownloadcurses.py:154 +msgid "progress:" +msgstr "" + +#: btdownloadcurses.py:155 +msgid "status:" +msgstr "" + +#: btdownloadcurses.py:156 +msgid "dl speed:" +msgstr "" + +#: btdownloadcurses.py:157 +msgid "ul speed:" +msgstr "" + +#: btdownloadcurses.py:158 +msgid "sharing:" +msgstr "" + +#: btdownloadcurses.py:159 +msgid "seeds:" +msgstr "" + +#: btdownloadcurses.py:160 +msgid "peers:" +msgstr "" + +#: btdownloadcurses.py:169 btdownloadheadless.py:94 +msgid "download succeeded" +msgstr "" + +#: btdownloadcurses.py:213 btdownloadheadless.py:128 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "" + +#: btdownloadcurses.py:216 btdownloadheadless.py:131 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "" + +#: btdownloadcurses.py:222 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "" + +#: btdownloadcurses.py:227 btdownloadheadless.py:142 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "" + +#: btdownloadcurses.py:249 +msgid "error(s):" +msgstr "" + +#: btdownloadcurses.py:258 +msgid "error:" +msgstr "" + +#: btdownloadcurses.py:261 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" + +#: btdownloadcurses.py:306 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" + +#: btdownloadcurses.py:336 btdownloadheadless.py:219 +msgid "You cannot specify both --save_as and --save_in" +msgstr "" + +#: btdownloadcurses.py:404 btdownloadheadless.py:287 +msgid "must have responsefile as arg or parameter, not both" +msgstr "" + +#: btdownloadcurses.py:417 btdownloadheadless.py:300 +msgid "you must specify a .torrent file" +msgstr "" + +#: btdownloadcurses.py:419 btdownloadheadless.py:302 +msgid "Error reading .torrent file: " +msgstr "" + +#: btdownloadcurses.py:429 +msgid "These errors occurred during execution:" +msgstr "" + +#: btdownloadgui.py:24 btmaketorrentgui.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Install Python 2.3 ou plus récent" + +#: btdownloadgui.py:38 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 ou plus récent requis" + +#: btdownloadgui.py:104 +msgid "drag to reorder" +msgstr "cliquez-glissez pour ré-ordonner" + +#: btdownloadgui.py:105 +msgid "right-click for menu" +msgstr "clic droit pour le menu" + +#: btdownloadgui.py:108 +#, python-format +msgid "rate: %s" +msgstr "taux : %s" + +#: btdownloadgui.py:111 +msgid "dialup" +msgstr "RTC" + +#: btdownloadgui.py:112 +msgid "DSL/cable 128k up" +msgstr "DSL/cable 128k montant" + +#: btdownloadgui.py:113 +msgid "DSL/cable 256k up" +msgstr "DSL/cable 256k montant" + +#: btdownloadgui.py:114 +msgid "DSL 768k up" +msgstr "DSL 768k montant" + +#: btdownloadgui.py:115 +msgid "T1" +msgstr "T1" + +#: btdownloadgui.py:116 +msgid "T1/E1" +msgstr "T1/E1" + +#: btdownloadgui.py:117 +msgid "E1" +msgstr "E1" + +#: btdownloadgui.py:118 +msgid "T3" +msgstr "T3" + +#: btdownloadgui.py:119 +msgid "OC3" +msgstr "OC3" + +#: btdownloadgui.py:297 +msgid "Maximum upload " +msgstr "Débit montant maximum" + +#: btdownloadgui.py:310 +msgid "Temporarily stop all running torrents" +msgstr "Arrêt temporaire des torrents en marche" + +#: btdownloadgui.py:311 +msgid "Resume downloading" +msgstr "Reprise du téléchargement" + +#: btdownloadgui.py:350 +#, python-format +msgid "New %s version available" +msgstr "Nouvelle %s version disponible" + +#: btdownloadgui.py:365 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Une nouvelle version de %s est disponible. \n" + +#: btdownloadgui.py:366 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Vous utilisez %s, et une nouvelle version est %s. \n" + +#: btdownloadgui.py:367 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Vous pouvez toujours obtenir la dernière version depuis \n" +"%s" + +#: btdownloadgui.py:374 btdownloadgui.py:1789 btdownloadgui.py:1894 +msgid "Download _later" +msgstr "Télécharge p_lus tard" + +#: btdownloadgui.py:377 btdownloadgui.py:1753 +msgid "Download _now" +msgstr "Télécharge mai_ntenant" + +#: btdownloadgui.py:383 +msgid "_Remind me later" +msgstr "Me le _rappeler ultérieurement" + +#: btdownloadgui.py:415 +#, python-format +msgid "About %s" +msgstr "À propos de %s" + +#: btdownloadgui.py:430 +msgid "Beta" +msgstr "" + +#: btdownloadgui.py:432 +#, python-format +msgid "Version %s" +msgstr "Version %s" + +#: btdownloadgui.py:451 +msgid "Donate" +msgstr "Faites un don" + +#: btdownloadgui.py:471 +#, python-format +msgid "%s Activity Log" +msgstr "Journal d'activité de %s" + +#: btdownloadgui.py:528 +msgid "Save log in:" +msgstr "Enregistrer le journal dans :" + +#: btdownloadgui.py:539 +msgid "log saved" +msgstr "journal enregistré" + +#: btdownloadgui.py:598 +msgid "log cleared" +msgstr "journal effacé" + +#: btdownloadgui.py:610 +#, python-format +msgid "%s Settings" +msgstr "Réglages de %s" + +#: btdownloadgui.py:621 +msgid "Saving" +msgstr "Sauvegarde en cours" + +#: btdownloadgui.py:623 +msgid "Download folder:" +msgstr "Dossier de téléchargement :" + +#: btdownloadgui.py:630 +msgid "Default:" +msgstr "Par défaut :" + +#: btdownloadgui.py:637 +msgid "Change..." +msgstr "Changer ..." + +#: btdownloadgui.py:641 +msgid "Ask where to save each download" +msgstr "Demander où enregistrer à chaque fois" + +#: btdownloadgui.py:655 +msgid "Downloading" +msgstr "Téléchargement en cours" + +#: btdownloadgui.py:657 +msgid "Starting additional torrents manually:" +msgstr "Ajout manuel de torrents supplémentaires" + +#: btdownloadgui.py:666 +msgid "Always stops the _last running torrent" +msgstr "Toujours stopper _le dernier torrent en marche" + +#: btdownloadgui.py:672 +msgid "Always starts the torrent in _parallel" +msgstr "Toujours lancer le dernier torrents en _parallèle" + +#: btdownloadgui.py:678 +msgid "_Asks each time" +msgstr "Dem_ander à chaque fois" + +#: btdownloadgui.py:692 +msgid "Seed completed torrents:" +msgstr "Essaimer les torrents completés :" + +#: btdownloadgui.py:700 btdownloadgui.py:729 +msgid "until share ratio reaches " +msgstr "juqu'au ratio de partage " + +#: btdownloadgui.py:706 +msgid " percent, or" +msgstr "pourcent, ou" + +#: btdownloadgui.py:712 +msgid "for " +msgstr "pour" + +#: btdownloadgui.py:718 +msgid " minutes, whichever comes first." +msgstr "minutes, au premier terme échu." + +#: btdownloadgui.py:725 +msgid "Seed last completed torrent:" +msgstr "Essaimer le dernier torrent complété :" + +#: btdownloadgui.py:735 +msgid " percent." +msgstr "pourcent." + +#: btdownloadgui.py:741 +msgid "\"0 percent\" means seed forever." +msgstr "\"0 pourcent\" pour un essaimage sans fin." + +#: btdownloadgui.py:750 +msgid "Network" +msgstr "Réseau" + +#: btdownloadgui.py:752 +msgid "Look for available port:" +msgstr "Recherche pour un port disponible :" + +#: btdownloadgui.py:755 +msgid "starting at port: " +msgstr "Commencer au port :" + +#: btdownloadgui.py:768 +msgid "IP to report to the tracker:" +msgstr "l'IP se rapporte au tracker :" + +#: btdownloadgui.py:773 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Aucun effet tant que vous n'êtes pas sur le\n" +"même réseau local que le tracker)" + +#: btdownloadgui.py:778 +msgid "Potential Windows TCP stack fix" +msgstr "Répare la fenêtre potentiel de la pile TCP" + +#: btdownloadgui.py:792 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Texte de la barre de progression toujours en noir\n" +"(nécessite un redémarrage)" + +#: btdownloadgui.py:805 +msgid "Misc" +msgstr "Divers" + +#: btdownloadgui.py:812 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ATTENTION : modifier ces réglages peut\n" +" empêcher %s de fonctionner correctement." + +#: btdownloadgui.py:820 +msgid "Option" +msgstr "Option" + +#: btdownloadgui.py:825 +msgid "Value" +msgstr "Valeur" + +#: btdownloadgui.py:832 +msgid "Advanced" +msgstr "Avancé" + +#: btdownloadgui.py:841 +msgid "Choose default download directory" +msgstr "Sélectionner le répertoire de téléchargement par défaut" + +#: btdownloadgui.py:902 +#, python-format +msgid "Files in \"%s\"" +msgstr "Fichier dans \"%s\"" + +#: btdownloadgui.py:911 +msgid "Apply" +msgstr "Appliquer" + +#: btdownloadgui.py:912 +msgid "Allocate" +msgstr "Allouer" + +#: btdownloadgui.py:913 +msgid "Never download" +msgstr "Ne jamais télécharger" + +#: btdownloadgui.py:914 +msgid "Decrease" +msgstr "Diminuer" + +#: btdownloadgui.py:915 +msgid "Increase" +msgstr "Augmenter" + +#: btdownloadgui.py:925 btlaunchmanycurses.py:142 +msgid "Filename" +msgstr "" + +#: btdownloadgui.py:925 +msgid "Length" +msgstr "" + +#: btdownloadgui.py:925 +msgid "%" +msgstr "" + +#: btdownloadgui.py:1089 +#, python-format +msgid "Peers for \"%s\"" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "IP address" +msgstr "Adresse IP" + +#: btdownloadgui.py:1095 +msgid "Client" +msgstr "Client" + +#: btdownloadgui.py:1095 +msgid "Connection" +msgstr "Connection" + +#: btdownloadgui.py:1095 +msgid "KB/s down" +msgstr "Ko/s descendants" + +#: btdownloadgui.py:1095 +msgid "KB/s up" +msgstr "Ko/s montants" + +#: btdownloadgui.py:1095 +msgid "MB downloaded" +msgstr "Mo téléchargés" + +#: btdownloadgui.py:1095 +msgid "MB uploaded" +msgstr "Mo émis" + +#: btdownloadgui.py:1095 +#, python-format +msgid "% complete" +msgstr "% complété" + +#: btdownloadgui.py:1095 +msgid "KB/s est. peer download" +msgstr "Ko/s estimation téléchargement du pair" + +#: btdownloadgui.py:1101 +msgid "Peer ID" +msgstr "ID du pair" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Interested" +msgstr "Intéressé" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Choked" +msgstr "Étranglé" + +#: btdownloadgui.py:1104 +msgid "Snubbed" +msgstr "Rejeté" + +#: btdownloadgui.py:1107 +msgid "Optimistic upload" +msgstr "Émission optimiste" + +#: btdownloadgui.py:1188 +msgid "remote" +msgstr "à distance" + +#: btdownloadgui.py:1188 +msgid "local" +msgstr "local" + +#: btdownloadgui.py:1224 +msgid "bad peer" +msgstr "Mauvais pair" + +#: btdownloadgui.py:1234 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: btdownloadgui.py:1235 +#, python-format +msgid "%d bad" +msgstr "%d mauvais" + +#: btdownloadgui.py:1237 +msgid "banned" +msgstr "banni" + +#: btdownloadgui.py:1239 +msgid "ok" +msgstr "ok" + +#: btdownloadgui.py:1275 +#, python-format +msgid "Info for \"%s\"" +msgstr "Infos sur \"%s\"" + +#: btdownloadgui.py:1293 +msgid "Torrent name:" +msgstr "Nom du torrent :" + +#: btdownloadgui.py:1298 +msgid "(trackerless torrent)" +msgstr "(torrent sans tracker)" + +#: btdownloadgui.py:1301 +msgid "Announce url:" +msgstr "URL du Tracker :" + +#: btdownloadgui.py:1305 +msgid ", in one file" +msgstr ", en 1 fichier" + +#: btdownloadgui.py:1307 +#, python-format +msgid ", in %d files" +msgstr ", en %d fichiers" + +#: btdownloadgui.py:1308 +msgid "Total size:" +msgstr "Taille totale :" + +#: btdownloadgui.py:1315 +msgid "Pieces:" +msgstr "Pièces :" + +#: btdownloadgui.py:1317 +msgid "Info hash:" +msgstr "Info hachage :" + +#: btdownloadgui.py:1327 +msgid "Save in:" +msgstr "Enregistrer sous :" + +#: btdownloadgui.py:1331 +msgid "File name:" +msgstr "Nom de fichier :" + +#: btdownloadgui.py:1357 +msgid "Open directory" +msgstr "Ouvrir répertoire" + +#: btdownloadgui.py:1363 +msgid "Show file list" +msgstr "Afficher liste fichier" + +#: btdownloadgui.py:1458 +msgid "Torrent info" +msgstr "Info du torrent" + +#: btdownloadgui.py:1467 btdownloadgui.py:1890 +msgid "Remove torrent" +msgstr "Enlever torrent" + +#: btdownloadgui.py:1471 +msgid "Abort torrent" +msgstr "Avorter torrent" + +#: btdownloadgui.py:1528 +#, python-format +msgid ", will seed for %s" +msgstr ", essaimera jusqu'à %s" + +#: btdownloadgui.py:1530 +msgid ", will seed indefinitely." +msgstr ", essaimera indéfiniment." + +#: btdownloadgui.py:1533 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Effectué, ratio de partage : %d%%" + +#: btdownloadgui.py:1536 +#, python-format +msgid "Done, %s uploaded" +msgstr "Effectué, %s envoyé." + +#: btdownloadgui.py:1568 +msgid "Torrent _info" +msgstr "_Infos du Torrent" + +#: btdownloadgui.py:1569 +msgid "_Open directory" +msgstr "_Ouvrir répertoire" + +#: btdownloadgui.py:1570 +msgid "_Change location" +msgstr "_Changer l'emplacement" + +#: btdownloadgui.py:1572 +msgid "_File list" +msgstr "Liste de _Fichiers" + +#: btdownloadgui.py:1646 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Êtes-vous sûr de vouloir enlever \"%s\" ?" + +#: btdownloadgui.py:1649 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Votre ratio de partage pour ce torrent est de %d%%. " + +#: btdownloadgui.py:1651 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Vous avez envoyé %s de ce torrent." + +#: btdownloadgui.py:1654 +msgid "Remove this torrent?" +msgstr "Enlever ce torrent ?" + +#: btdownloadgui.py:1673 +msgid "Finished" +msgstr "Terminé" + +#: btdownloadgui.py:1674 +msgid "drag into list to seed" +msgstr "Glissez-le dans la liste pour l'essaimer" + +#: btdownloadgui.py:1677 +msgid "Failed" +msgstr "Échoué" + +#: btdownloadgui.py:1678 +msgid "drag into list to resume" +msgstr "Glissez-le dans la liste pour le reprendre" + +#: btdownloadgui.py:1687 +msgid "Re_start" +msgstr "Redémarrage" + +#: btdownloadgui.py:1688 btdownloadgui.py:1759 btdownloadgui.py:1795 +#: btdownloadgui.py:1900 +msgid "_Remove" +msgstr "Enleve_r" + +#: btdownloadgui.py:1738 +msgid "Waiting" +msgstr "En attente" + +#: btdownloadgui.py:1758 btdownloadgui.py:1794 btdownloadgui.py:1899 +msgid "_Finish" +msgstr "_Fini" + +#: btdownloadgui.py:1761 btdownloadgui.py:1790 btdownloadgui.py:1895 +msgid "_Abort" +msgstr "_Avorter" + +#: btdownloadgui.py:1776 +msgid "Paused" +msgstr "En pause" + +#: btdownloadgui.py:1817 +msgid "Running" +msgstr "En cours" + +#: btdownloadgui.py:1841 +#, python-format +msgid "Current up: %s" +msgstr "Émission actuelle : %s" + +#: btdownloadgui.py:1842 +#, python-format +msgid "Current down: %s" +msgstr "Réception actuelle : %s" + +#: btdownloadgui.py:1848 +#, python-format +msgid "Previous up: %s" +msgstr "Émission précédente : %s" + +#: btdownloadgui.py:1849 +#, python-format +msgid "Previous down: %s" +msgstr "Réception précédente : %s" + +#: btdownloadgui.py:1855 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Ratio de partage : %0.02f%%" + +#: btdownloadgui.py:1858 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s pairs, %s essaimeurs. Total depuis le tracker : %s" + +#: btdownloadgui.py:1862 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Copies distribuées : %d; Suivant : %s" + +#: btdownloadgui.py:1865 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Pièces : %d total, %d complétée, %d partielles, %d active (%d vide)" + +#: btdownloadgui.py:1869 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d mauvaises pièces +%s de requêtes écartées" + +#: btdownloadgui.py:1903 +msgid "_Peer list" +msgstr "Liste des _pairs" + +#: btdownloadgui.py:1962 +msgid "Done" +msgstr "Effectué" + +#: btdownloadgui.py:1977 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% effectué, %s restant" + +#: btdownloadgui.py:1985 +msgid "Download " +msgstr "Téléchargement" + +#: btdownloadgui.py:1987 +msgid "Upload " +msgstr "Émission" + +#: btdownloadgui.py:2002 +msgid "NA" +msgstr "" + +#: btdownloadgui.py:2343 +#, python-format +msgid "%s started" +msgstr "%s démarré" + +#: btdownloadgui.py:2356 +msgid "_Open torrent file" +msgstr "_Ouvrir fichier torrent" + +#: btdownloadgui.py:2357 +msgid "Make _new torrent" +msgstr "Créer _nouveau torrent" + +#: btdownloadgui.py:2360 +msgid "_Pause/Play" +msgstr "_pause/Lecture" + +#: btdownloadgui.py:2362 +msgid "_Quit" +msgstr "_Quitter" + +#: btdownloadgui.py:2364 +msgid "Show/Hide _finished torrents" +msgstr "Afficher/Cacher les torrents _fini" + +#: btdownloadgui.py:2366 +msgid "_Resize window to fit" +msgstr "_Redimensionner pour adapter" + +#: btdownloadgui.py:2368 +msgid "_Log" +msgstr "Journa_l" + +#: btdownloadgui.py:2371 +msgid "_Settings" +msgstr "Réglage_s" + +#: btdownloadgui.py:2374 btdownloadgui.py:2390 +msgid "_Help" +msgstr "Aide" + +#: btdownloadgui.py:2376 +msgid "_About" +msgstr "À propos" + +#: btdownloadgui.py:2377 +msgid "_Donate" +msgstr "Faites un _don" + +#: btdownloadgui.py:2381 +msgid "_File" +msgstr "_Fichier" + +#: btdownloadgui.py:2386 +msgid "_View" +msgstr "_Vues" + +#: btdownloadgui.py:2533 +msgid "(stopped)" +msgstr "" + +#: btdownloadgui.py:2545 +msgid "(multiple)" +msgstr "(multiple)" + +#: btdownloadgui.py:2659 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s L'aide est à \n" +"%s\n" +"Voulez-vous y aller maintenant ?" + +#: btdownloadgui.py:2662 +msgid "Visit help web page?" +msgstr "Visiter la page de l'aide ?" + +#: btdownloadgui.py:2698 +msgid "There is one finished torrent in the list. " +msgstr "Il y a un torrent fini dans la liste." + +#: btdownloadgui.py:2699 +msgid "Do you want to remove it?" +msgstr "Voulez-vous l'enlever ?" + +#: btdownloadgui.py:2701 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Il y a %d torrents finis dans la liste." + +#: btdownloadgui.py:2702 +msgid "Do you want to remove all of them?" +msgstr "Souhaitez-vous tous les enlever ?" + +#: btdownloadgui.py:2704 +msgid "Remove all finished torrents?" +msgstr "Enlever tous les torrents achevés ?" + +#: btdownloadgui.py:2711 +msgid "No finished torrents" +msgstr "Aucun torrent temriné." + +#: btdownloadgui.py:2712 +msgid "There are no finished torrents to remove." +msgstr "Il n'y a aucun torrent terminé à enlever." + +#: btdownloadgui.py:2756 +msgid "Open torrent:" +msgstr "Ouvrir torrent :" + +#: btdownloadgui.py:2789 +msgid "Change save location for " +msgstr "Changer l'emplacement de l'enregistrement pour" + +#: btdownloadgui.py:2815 +msgid "File exists!" +msgstr "Le fichier existe !" + +#: btdownloadgui.py:2816 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" existe déjà. Voulez-vous choisir un nom de fichier différent ?" + +#: btdownloadgui.py:2834 +msgid "Save location for " +msgstr "Enregistrer l'emplacement pour" + +#: btdownloadgui.py:2944 +#, python-format +msgid "(global message) : %s" +msgstr "(message global) : %s" + +#: btdownloadgui.py:2951 +#, python-format +msgid "%s Error" +msgstr "%s Erreur" + +#: btdownloadgui.py:2957 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"De multiples erreurs sont survenues. Cliquez OK pour voir le journal des " +"erreurs." + +#: btdownloadgui.py:3087 +msgid "Stop running torrent?" +msgstr "Arrêt du torrent en cours ?" + +#: btdownloadgui.py:3088 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Vous allez lancer \"%s\". Voulez-vous arrêter le dernier torrent en cours ?" + +#: btdownloadgui.py:3098 +msgid "Have you donated?" +msgstr "Avez-vous fait un don ?" + +#: btdownloadgui.py:3099 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bienvenue dans cette nouvelle version de %s. Avez-vous fait un don ?" + +#: btdownloadgui.py:3113 +msgid "Thanks!" +msgstr "Merci !" + +#: btdownloadgui.py:3114 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Merci pour votre don ! Pour donner encore, sélectionner \"faire un don\" " +"depuis le menu \"Aide\"." + +#: btdownloadgui.py:3143 +msgid "Can't have both --responsefile and non-option arguments" +msgstr "" +"Ne peut pas avoir à la fois --un fichier réponse et des arguments sans " +"options" + +#: btdownloadgui.py:3173 +msgid "Temporary Internet Files" +msgstr "Temporary Internet Files" + +#: btdownloadgui.py:3174 +#, python-format +msgid "" +"Could not read %s: %s. You are probably using a broken Internet Explorer " +"version that passed BitTorrent a filename that doesn't exist. To work around " +"the problem, try clearing your Temporary Internet Files or right-click the " +"link and save the .torrent file to disk first." +msgstr "" +"Impossible de lire %s : %s. Vous utilisez sans doute une version d'internet " +"explorer qui a fourni à Bit Torrent un nom de fichier qui n'existe pas. Afin " +"de contourner le problème, essayer de vider le dossier Temporary Internet " +"Files ou faites un clic-droit sur le lien et enregistrez d'abord le fichier ." +"torrent sur le disque." + +#: btdownloadgui.py:3197 +#, python-format +msgid "%s already running" +msgstr "%s déjà en cours" + +#: btdownloadheadless.py:137 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "" + +#: btdownloadheadless.py:144 +#, python-format +msgid "%d seen now" +msgstr "" + +#: btdownloadheadless.py:147 +msgid "ERROR:\n" +msgstr "" + +#: btdownloadheadless.py:148 +msgid "saving: " +msgstr "" + +#: btdownloadheadless.py:149 +msgid "percent done: " +msgstr "" + +#: btdownloadheadless.py:150 +msgid "time left: " +msgstr "" + +#: btdownloadheadless.py:151 +msgid "download to: " +msgstr "" + +#: btdownloadheadless.py:152 +msgid "download rate: " +msgstr "" + +#: btdownloadheadless.py:153 +msgid "upload rate: " +msgstr "" + +#: btdownloadheadless.py:154 +msgid "share rating: " +msgstr "" + +#: btdownloadheadless.py:155 +msgid "seed status: " +msgstr "" + +#: btdownloadheadless.py:156 +msgid "peer status: " +msgstr "" + +#: btlaunchmanycurses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "" + +#: btlaunchmanycurses.py:143 +msgid "Size" +msgstr "" + +#: btlaunchmanycurses.py:144 +msgid "Download" +msgstr "" + +#: btlaunchmanycurses.py:145 +msgid "Upload" +msgstr "" + +#: btlaunchmanycurses.py:146 btlaunchmanycurses.py:239 +msgid "Totals:" +msgstr "" + +#: btlaunchmanycurses.py:205 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s up %s dn" +msgstr "" + +#: btlaunchmanycurses.py:227 btlaunchmany.py:35 +msgid "no torrents" +msgstr "" + +#: btlaunchmanycurses.py:265 btlaunchmany.py:49 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid "Warning: " +msgstr "" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid " is not a directory" +msgstr "" + +#: btlaunchmanycurses.py:287 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" + +#: btlaunchmanycurses.py:292 btlaunchmany.py:71 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" + +#: btlaunchmany.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" + +#: btmaketorrentgui.py:55 +#, python-format +msgid "%s metafile creator %s" +msgstr "%s créateur de métafichiers %s" + +#: btmaketorrentgui.py:73 +msgid "" +"Make .torrent metafiles for these files/directories:\n" +"(Directories will become batch torrents)" +msgstr "" +"Créer des métafichiers .torrents pour ces fichiers/répertoires : \n" +"(Les répertoires accueilleront les lots de torrents)." + +#: btmaketorrentgui.py:88 +msgid "_Files/directories" +msgstr "_Fichiers/répertoires" + +#: btmaketorrentgui.py:118 +msgid "Piece size:" +msgstr "Taille de la pièce :" + +#: btmaketorrentgui.py:135 +msgid "Use _tracker:" +msgstr "Utiliser _tracker :" + +#: btmaketorrentgui.py:165 +msgid "Use _DHT" +msgstr "Utiliser _DHT" + +#: btmaketorrentgui.py:171 +msgid "Nodes (optional):" +msgstr "Nœuds (optionnel) :" + +#: btmaketorrentgui.py:203 +msgid "Comments:" +msgstr "Commentaires :" + +#: btmaketorrentgui.py:232 +msgid "Make" +msgstr "Créer" + +#: btmaketorrentgui.py:405 +msgid "_Host" +msgstr "_Hôte" + +#: btmaketorrentgui.py:412 +msgid "_Port" +msgstr "_Port" + +#: btmaketorrentgui.py:505 +msgid "Building torrents..." +msgstr "Création torrents en cours..." + +#: btmaketorrentgui.py:513 +msgid "Checking file sizes..." +msgstr "Vérification taille des fichiers ..." + +#: btmaketorrentgui.py:531 +msgid "Start seeding" +msgstr "Début de l'essaimage" + +#: btmaketorrentgui.py:551 +msgid "building " +msgstr "en construction" + +#: btmaketorrentgui.py:571 +msgid "Done." +msgstr "Effectué." + +#: btmaketorrentgui.py:572 +msgid "Done building torrents." +msgstr "Construction des torrents terminée." + +#: btmaketorrentgui.py:580 +msgid "Error!" +msgstr "Erreur !" + +#: btmaketorrentgui.py:581 +msgid "Error building torrents: " +msgstr "Erreur de construction des torrents :" + +#: btmaketorrent.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" + +#: btmaketorrent.py:31 +msgid "optional target file for the torrent" +msgstr "" + +#: btreannounce.py:22 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: btreannounce.py:31 +#, python-format +msgid "old announce for %s: %s" +msgstr "" + +#: btrename.py:26 +#, python-format +msgid "%s %s - change the suggested filename in a .torrent file" +msgstr "" + +#: btrename.py:31 +#, python-format +msgid "Usage: %s TORRENTFILE NEW_FILE_NAME" +msgstr "" + +#: btrename.py:38 +#, python-format +msgid "old filename: %s" +msgstr "" + +#: btrename.py:40 +#, python-format +msgid "new filename: %s" +msgstr "" + +#: btrename.py:45 +msgid "done." +msgstr "" + +#: btshowmetainfo.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: btshowmetainfo.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: btshowmetainfo.py:42 +#, python-format +msgid "metainfo file.: %s" +msgstr "" + +#: btshowmetainfo.py:43 +#, python-format +msgid "info hash.....: %s" +msgstr "" + +#: btshowmetainfo.py:47 +#, python-format +msgid "file name.....: %s" +msgstr "" + +#: btshowmetainfo.py:49 +msgid "file size.....:" +msgstr "" + +#: btshowmetainfo.py:52 +#, python-format +msgid "directory name: %s" +msgstr "" + +#: btshowmetainfo.py:53 +msgid "files.........: " +msgstr "" + +#: btshowmetainfo.py:63 +msgid "archive size..:" +msgstr "" + +#: btshowmetainfo.py:67 +#, python-format +msgid "announce url..: %s" +msgstr "" + +#: btshowmetainfo.py:68 +msgid "comment.......: \n" +msgstr "" + +#~ msgid "Choose existing folder" +#~ msgstr "Choisir dossier existant" + +#~ msgid "Create new folder" +#~ msgstr "Créer nouveau dossier" diff --git a/btlocale/he_IL/LC_MESSAGES/bittorrent.mo b/btlocale/he_IL/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..e91ff0912ab258c521d35190ef36d82819c04005 GIT binary patch literal 2602 zcmb7^OKclO7{>=FP)wl@palwOqNoZ`?czpF8Z8Co{DVP~BX zxWE|>N#nfKG)cCuk?r5kH{W|c z?@z}LEHJDW@O=*7L-#TE68INLYyE!4o&-0*c$V*zX6i}JP1`b z4aUGvz^A~^K(gBasSj0<^8Ffo0{jl7d;Jl78vHZjQ8=M1CLOY;7|-L2^4YWak`G$s zlNR|v>vT@EhZ|ilJ=1+WP7hcVgBHd>=SR=FUm*3H7WJ3rjq0FvD1`o{UYx`iW1;J1 zy=AAEciagcc)l;(K$@n>`U)a4K9h@VqA^cRg5_Cnr64 z3ByyEpdjv@MURx_QbQsp8WA`?UF8%<#G2W)0086NELobL~{}@+_vM6 zd%R%Ff|lsmB@x(KOv+(8u9()Ht_Ps&qT{+C<$LcV3nQ5~-U{!};=N9g2`84HHQQrp zLHB12$q6TK^p+>2k@1j!Y9wRy`N9rx=SIIBpn~>zyu*lh;=|8$S{+?R{9HT^MI$Yy z9GZF9JdBL6OIo{4@~EDBTMQ+K5_@HyG2^j5&kgXmGcq%i$UhJt2CqyO(ZyGJu3-C8 z1h0)|E*M>VdX(O{@QpB!RJ;l*I?cm@lSd3>T#4)Ph=96|T1N zcuTFQ>vi!wWHqj?LStU7HfmU^qBhkI4r=PLv86imLa-9dCXGqTXq89y&)EJ&>Y6&*0lGUxc&*0j&QkxmlP)Z5^IgQ4q{mu~|~p zdUQByaKrxX1;s7hh^xqCRxAFWx76LnO>d{B4d#qqYfT39$}&*&ZmUt#9Lr+6gPF=k z({+=QvZzaF&RjSg*PyY8=39+}NvAhyH1sgzES%3uEOb!CkkEMQ?xNLIVA\n" +"Language-Team: Ben's Project \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Hebrew\n" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +".ASCII נראה כי זו גרסת פייטון שאינה תומכת בזיהוי קידוד קבצי מערכת. אני נאלצת " +"לנחש כי זהו קידוד" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr ".במקום ASCII-פייטון לא הצליח למצוא קידוד קבצי מערכת. משתמשת ב" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:188 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:194 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:206 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:212 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:217 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/Encoder.py:173 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/GUI.py:149 +#, python-format +msgid "%d days" +msgstr "" + +#: BitTorrent/GUI.py:151 +#, python-format +msgid "1 day %d hours" +msgstr "" + +#: BitTorrent/GUI.py:153 +#, python-format +msgid "%d:%02d hours" +msgstr "" + +#: BitTorrent/GUI.py:155 +#, python-format +msgid "%d:%02d minutes" +msgstr "" + +#: BitTorrent/GUI.py:157 +#, python-format +msgid "%d seconds" +msgstr "" + +#: BitTorrent/GUI.py:159 +msgid "0 seconds" +msgstr "" + +#: BitTorrent/GUI.py:201 +#, python-format +msgid "%s Help" +msgstr "" + +#: BitTorrent/GUI.py:208 +msgid "Frequently Asked Questions:" +msgstr "" + +#: BitTorrent/GUI.py:213 +msgid "Go" +msgstr "" + +#: BitTorrent/GUI.py:434 BitTorrent/GUI.py:486 +msgid "Choose an existing folder..." +msgstr "" + +#: BitTorrent/GUI.py:444 +msgid "All Files" +msgstr "" + +#: BitTorrent/GUI.py:449 +msgid "Torrents" +msgstr "" + +#: BitTorrent/GUI.py:483 +msgid "Create a new folder..." +msgstr "" + +#: BitTorrent/GUI.py:545 +msgid "Select file" +msgstr "" + +#: BitTorrent/GUI.py:546 +msgid "Select folder" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Mon" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Tue" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Wed" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Thu" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Fri" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sat" +msgstr "" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jan" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Feb" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Mar" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Apr" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "May" +msgstr "" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jul" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Aug" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Sep" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Oct" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Nov" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Dec" +msgstr "" + +#: BitTorrent/HTTPHandler.py:83 +msgid "Got Accept-Encoding: " +msgstr "" + +#: BitTorrent/HTTPHandler.py:125 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "" + +#: BitTorrent/RawServer.py:273 +msgid "lost server socket" +msgstr "" + +#: BitTorrent/RawServer.py:289 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:371 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:172 +msgid "Problem connecting to tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:199 +msgid "bad data from tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:210 +msgid "rejected by tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:216 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:218 +msgid " Message from the tracker: " +msgstr "" + +#: BitTorrent/Rerequester.py:224 +msgid "warning from tracker - " +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Fastresume info doesn't match file modification time" +msgstr "" + +#: BitTorrent/Storage.py:243 +msgid "Fastresume data doesn't match actual filesize" +msgstr "" + +#: BitTorrent/Storage.py:257 BitTorrent/StorageWrapper.py:284 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/TorrentQueue.py:120 +msgid "Could not load saved state: " +msgstr "" + +#: BitTorrent/TorrentQueue.py:160 +msgid "Version check failed: no DNS library" +msgstr "" + +#: BitTorrent/TorrentQueue.py:177 +msgid "DNS query failed" +msgstr "" + +#: BitTorrent/TorrentQueue.py:179 +msgid "number of received TXT fields is not 1" +msgstr "" + +#: BitTorrent/TorrentQueue.py:182 +msgid "number of strings in reply is not 1?" +msgstr "" + +#: BitTorrent/TorrentQueue.py:192 +msgid "Could not parse new version string" +msgstr "" + +#: BitTorrent/TorrentQueue.py:202 +#, python-format +msgid "" +"A newer version of BitTorrent is available.\n" +"You can always get the latest version from\n" +"%s." +msgstr "" + +#: BitTorrent/TorrentQueue.py:207 +msgid "Version check failed: " +msgstr "" + +#: BitTorrent/TorrentQueue.py:244 +msgid "Could not save UI state: " +msgstr "" + +#: BitTorrent/TorrentQueue.py:254 BitTorrent/TorrentQueue.py:256 +#: BitTorrent/TorrentQueue.py:329 BitTorrent/TorrentQueue.py:332 +#: BitTorrent/TorrentQueue.py:342 BitTorrent/TorrentQueue.py:354 +#: BitTorrent/TorrentQueue.py:371 +msgid "Invalid state file contents" +msgstr "" + +#: BitTorrent/TorrentQueue.py:269 +msgid "Error reading file " +msgstr "" + +#: BitTorrent/TorrentQueue.py:271 +msgid "cannot restore state completely" +msgstr "" + +#: BitTorrent/TorrentQueue.py:274 +msgid "Invalid state file (duplicate entry)" +msgstr "" + +#: BitTorrent/TorrentQueue.py:280 BitTorrent/TorrentQueue.py:285 +msgid "Corrupt data in " +msgstr "" + +#: BitTorrent/TorrentQueue.py:281 BitTorrent/TorrentQueue.py:286 +msgid " , cannot restore torrent (" +msgstr "" + +#: BitTorrent/TorrentQueue.py:300 +msgid "Invalid state file (bad entry)" +msgstr "" + +#: BitTorrent/TorrentQueue.py:319 +msgid "Bad UI state file" +msgstr "" + +#: BitTorrent/TorrentQueue.py:323 +msgid "Bad UI state file version" +msgstr "" + +#: BitTorrent/TorrentQueue.py:325 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" + +#: BitTorrent/TorrentQueue.py:496 +msgid "Could not delete cached metainfo file:" +msgstr "" + +#: BitTorrent/TorrentQueue.py:519 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "" + +#: BitTorrent/TorrentQueue.py:527 +msgid "This torrent (or one with the same contents) is already running." +msgstr "" + +#: BitTorrent/TorrentQueue.py:531 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" + +#: BitTorrent/TorrentQueue.py:538 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "" + +#: BitTorrent/TorrentQueue.py:555 +msgid "Could not write file " +msgstr "" + +#: BitTorrent/TorrentQueue.py:557 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" + +#: BitTorrent/TorrentQueue.py:758 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" + +#: BitTorrent/TorrentQueue.py:764 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" + +#: BitTorrent/__init__.py:20 +msgid "Python 2.2.1 or newer required" +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:88 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:92 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:97 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:99 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:102 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:106 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:108 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:111 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:116 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:119 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:122 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:125 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/configfile.py:125 +msgid "Could not permanently save options: " +msgstr "" + +#: BitTorrent/controlsocket.py:108 BitTorrent/controlsocket.py:157 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:116 BitTorrent/controlsocket.py:134 +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:187 +msgid "Could not send command: " +msgstr "" + +#: BitTorrent/controlsocket.py:144 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:149 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/defaultargs.py:32 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" + +#: BitTorrent/defaultargs.py:36 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" + +#: BitTorrent/defaultargs.py:40 +msgid "ISO Language code to use" +msgstr "" + +#: BitTorrent/defaultargs.py:45 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" + +#: BitTorrent/defaultargs.py:48 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" + +#: BitTorrent/defaultargs.py:51 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" + +#: BitTorrent/defaultargs.py:53 +msgid "maximum port to listen on" +msgstr "" + +#: BitTorrent/defaultargs.py:55 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "" + +#: BitTorrent/defaultargs.py:57 +msgid "seconds between updates of displayed information" +msgstr "" + +#: BitTorrent/defaultargs.py:59 +msgid "minutes to wait between requesting more peers" +msgstr "" + +#: BitTorrent/defaultargs.py:61 +msgid "minimum number of peers to not do rerequesting" +msgstr "" + +#: BitTorrent/defaultargs.py:63 +msgid "number of peers at which to stop initiating new connections" +msgstr "" + +#: BitTorrent/defaultargs.py:65 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" + +#: BitTorrent/defaultargs.py:68 +msgid "whether to check hashes on disk" +msgstr "" + +#: BitTorrent/defaultargs.py:70 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "" + +#: BitTorrent/defaultargs.py:72 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" + +#: BitTorrent/defaultargs.py:74 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" + +#: BitTorrent/defaultargs.py:81 +msgid "number of seconds to pause between sending keepalives" +msgstr "" + +#: BitTorrent/defaultargs.py:83 +msgid "how many bytes to query for per request." +msgstr "" + +#: BitTorrent/defaultargs.py:85 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" + +#: BitTorrent/defaultargs.py:88 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" + +#: BitTorrent/defaultargs.py:91 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/defaultargs.py:93 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" + +#: BitTorrent/defaultargs.py:96 BitTorrent/defaultargs.py:98 +msgid "maximum amount of time to guess the current rate estimate represents" +msgstr "" + +#: BitTorrent/defaultargs.py:100 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" + +#: BitTorrent/defaultargs.py:102 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" + +#: BitTorrent/defaultargs.py:105 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" + +#: BitTorrent/defaultargs.py:107 +msgid "how many bytes to write into network buffers at once." +msgstr "" + +#: BitTorrent/defaultargs.py:109 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" + +#: BitTorrent/defaultargs.py:112 +msgid "do not connect to several peers that have the same IP address" +msgstr "" + +#: BitTorrent/defaultargs.py:114 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" + +#: BitTorrent/defaultargs.py:116 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" + +#: BitTorrent/defaultargs.py:118 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "" + +#: BitTorrent/defaultargs.py:120 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "" + +#: BitTorrent/defaultargs.py:122 +msgid "force max_allow_in to stay below 30 on Win32" +msgstr "" + +#: BitTorrent/defaultargs.py:139 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" + +#: BitTorrent/defaultargs.py:144 +msgid "display advanced user interface" +msgstr "" + +#: BitTorrent/defaultargs.py:146 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" + +#: BitTorrent/defaultargs.py:149 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" + +#: BitTorrent/defaultargs.py:152 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" + +#: BitTorrent/defaultargs.py:155 +msgid "start downloader in paused state" +msgstr "" + +#: BitTorrent/defaultargs.py:157 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" + +#: BitTorrent/defaultargs.py:171 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" + +#: BitTorrent/defaultargs.py:178 BitTorrent/defaultargs.py:198 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at once." +msgstr "" + +#: BitTorrent/defaultargs.py:183 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" + +#: BitTorrent/defaultargs.py:188 +msgid "file the server response was stored in, alternative to url" +msgstr "" + +#: BitTorrent/defaultargs.py:190 +msgid "url to get file from, alternative to responsefile" +msgstr "" + +#: BitTorrent/defaultargs.py:192 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" + +#: BitTorrent/defaultargs.py:203 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" + +#: BitTorrent/defaultargs.py:208 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "" + +#: BitTorrent/defaultargs.py:210 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" + +#: BitTorrent/defaultargs.py:225 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" + +#: BitTorrent/defaultargs.py:232 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "" + +#: BitTorrent/defaultargs.py:237 +msgid "whether to display diagnostic info to stdout" +msgstr "" + +#: BitTorrent/defaultargs.py:242 +msgid "which power of two to set the piece size to" +msgstr "" + +#: BitTorrent/defaultargs.py:244 +msgid "default tracker name" +msgstr "" + +#: BitTorrent/defaultargs.py:247 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" + +#: BitTorrent/download.py:92 +msgid "maxport less than minport - no ports to check" +msgstr "" + +#: BitTorrent/download.py:104 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "" + +#: BitTorrent/download.py:106 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:108 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:212 +msgid "Initial startup" +msgstr "" + +#: BitTorrent/download.py:264 +#, python-format +msgid "Could not load fastresume data: %s. " +msgstr "" + +#: BitTorrent/download.py:265 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:272 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:383 BitTorrent/launchmanycore.py:139 +msgid "downloading" +msgstr "" + +#: BitTorrent/download.py:393 +msgid "download failed: " +msgstr "" + +#: BitTorrent/download.py:397 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" + +#: BitTorrent/download.py:400 +msgid "killed by IO error: " +msgstr "" + +#: BitTorrent/download.py:403 +msgid "killed by OS error: " +msgstr "" + +#: BitTorrent/download.py:408 +msgid "killed by internal exception: " +msgstr "" + +#: BitTorrent/download.py:413 +msgid "Additional error when closing down due to error: " +msgstr "" + +#: BitTorrent/download.py:426 +msgid "Could not remove fastresume file after failure:" +msgstr "" + +#: BitTorrent/download.py:443 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:466 +msgid "Could not write fastresume data: " +msgstr "" + +#: BitTorrent/download.py:476 +msgid "shut down" +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:69 btdownloadcurses.py:354 +#: btdownloadheadless.py:237 +msgid "shutting down" +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:142 btlaunchmanycurses.py:58 +msgid "connecting to peers" +msgstr "" + +#: BitTorrent/launchmanycore.py:232 btdownloadcurses.py:361 +#: btdownloadheadless.py:244 +msgid "Error reading config: " +msgstr "" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/parseargs.py:23 +#, python-format +msgid "Usage: %s " +msgstr "" + +#: BitTorrent/parseargs.py:25 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:26 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:31 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:33 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:35 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:66 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:115 BitTorrent/parseargs.py:152 +msgid "unknown key " +msgstr "" + +#: BitTorrent/parseargs.py:121 BitTorrent/parseargs.py:131 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:135 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:142 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:144 +#, python-format +msgid "Must supply at least %d args." +msgstr "" + +#: BitTorrent/parseargs.py:146 +#, python-format +msgid "Too many args - %d max." +msgstr "" + +#: BitTorrent/parseargs.py:176 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send in an info message if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:161 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:246 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:269 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:305 +msgid "# Log Started: " +msgstr "" + +#: BitTorrent/track.py:307 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:315 +msgid "# Log reopened: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:457 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:467 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:480 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:494 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:850 btlaunchmanycurses.py:287 +msgid "error: " +msgstr "" + +#: BitTorrent/track.py:851 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:859 +msgid "# Shutting down: " +msgstr "" + +#: btdownloadcurses.py:45 btlaunchmanycurses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" + +#: btdownloadcurses.py:47 btlaunchmanycurses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" + +#: btdownloadcurses.py:52 btlaunchmanycurses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" + +#: btdownloadcurses.py:57 btdownloadheadless.py:39 +msgid "download complete!" +msgstr "" + +#: btdownloadcurses.py:62 btdownloadheadless.py:44 +msgid "" +msgstr "" + +#: btdownloadcurses.py:65 btdownloadheadless.py:47 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "" + +#: btdownloadcurses.py:151 +msgid "file:" +msgstr "" + +#: btdownloadcurses.py:152 +msgid "size:" +msgstr "" + +#: btdownloadcurses.py:153 +msgid "dest:" +msgstr "" + +#: btdownloadcurses.py:154 +msgid "progress:" +msgstr "" + +#: btdownloadcurses.py:155 +msgid "status:" +msgstr "" + +#: btdownloadcurses.py:156 +msgid "dl speed:" +msgstr "" + +#: btdownloadcurses.py:157 +msgid "ul speed:" +msgstr "" + +#: btdownloadcurses.py:158 +msgid "sharing:" +msgstr "" + +#: btdownloadcurses.py:159 +msgid "seeds:" +msgstr "" + +#: btdownloadcurses.py:160 +msgid "peers:" +msgstr "" + +#: btdownloadcurses.py:169 btdownloadheadless.py:94 +msgid "download succeeded" +msgstr "" + +#: btdownloadcurses.py:213 btdownloadheadless.py:128 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "" + +#: btdownloadcurses.py:216 btdownloadheadless.py:131 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "" + +#: btdownloadcurses.py:222 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "" + +#: btdownloadcurses.py:227 btdownloadheadless.py:142 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "" + +#: btdownloadcurses.py:249 +msgid "error(s):" +msgstr "" + +#: btdownloadcurses.py:258 +msgid "error:" +msgstr "" + +#: btdownloadcurses.py:261 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" + +#: btdownloadcurses.py:306 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" + +#: btdownloadcurses.py:336 btdownloadheadless.py:219 +msgid "You cannot specify both --save_as and --save_in" +msgstr "" + +#: btdownloadcurses.py:404 btdownloadheadless.py:287 +msgid "must have responsefile as arg or parameter, not both" +msgstr "" + +#: btdownloadcurses.py:417 btdownloadheadless.py:300 +msgid "you must specify a .torrent file" +msgstr "" + +#: btdownloadcurses.py:419 btdownloadheadless.py:302 +msgid "Error reading .torrent file: " +msgstr "" + +#: btdownloadcurses.py:429 +msgid "These errors occurred during execution:" +msgstr "" + +#: btdownloadgui.py:24 btmaketorrentgui.py:23 +msgid "Install Python 2.3 or greater" +msgstr "" + +#: btdownloadgui.py:38 +msgid "PyGTK 2.4 or newer required" +msgstr "" + +#: btdownloadgui.py:104 +msgid "drag to reorder" +msgstr "" + +#: btdownloadgui.py:105 +msgid "right-click for menu" +msgstr "" + +#: btdownloadgui.py:108 +#, python-format +msgid "rate: %s" +msgstr "" + +#: btdownloadgui.py:111 +msgid "dialup" +msgstr "" + +#: btdownloadgui.py:112 +msgid "DSL/cable 128k up" +msgstr "" + +#: btdownloadgui.py:113 +msgid "DSL/cable 256k up" +msgstr "" + +#: btdownloadgui.py:114 +msgid "DSL 768k up" +msgstr "" + +#: btdownloadgui.py:115 +msgid "T1" +msgstr "" + +#: btdownloadgui.py:116 +msgid "T1/E1" +msgstr "" + +#: btdownloadgui.py:117 +msgid "E1" +msgstr "" + +#: btdownloadgui.py:118 +msgid "T3" +msgstr "" + +#: btdownloadgui.py:119 +msgid "OC3" +msgstr "" + +#: btdownloadgui.py:297 +msgid "Maximum upload " +msgstr "" + +#: btdownloadgui.py:310 +msgid "Temporarily stop all running torrents" +msgstr "" + +#: btdownloadgui.py:311 +msgid "Resume downloading" +msgstr "" + +#: btdownloadgui.py:350 +#, python-format +msgid "New %s version available" +msgstr "" + +#: btdownloadgui.py:365 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "" + +#: btdownloadgui.py:366 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "" + +#: btdownloadgui.py:367 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" + +#: btdownloadgui.py:374 btdownloadgui.py:1789 btdownloadgui.py:1894 +msgid "Download _later" +msgstr "" + +#: btdownloadgui.py:377 btdownloadgui.py:1753 +msgid "Download _now" +msgstr "" + +#: btdownloadgui.py:383 +msgid "_Remind me later" +msgstr "" + +#: btdownloadgui.py:415 +#, python-format +msgid "About %s" +msgstr "" + +#: btdownloadgui.py:430 +msgid "Beta" +msgstr "" + +#: btdownloadgui.py:432 +#, python-format +msgid "Version %s" +msgstr "" + +#: btdownloadgui.py:451 +msgid "Donate" +msgstr "" + +#: btdownloadgui.py:471 +#, python-format +msgid "%s Activity Log" +msgstr "" + +#: btdownloadgui.py:528 +msgid "Save log in:" +msgstr "" + +#: btdownloadgui.py:539 +msgid "log saved" +msgstr "" + +#: btdownloadgui.py:598 +msgid "log cleared" +msgstr "" + +#: btdownloadgui.py:610 +#, python-format +msgid "%s Settings" +msgstr "" + +#: btdownloadgui.py:621 +msgid "Saving" +msgstr "" + +#: btdownloadgui.py:623 +msgid "Download folder:" +msgstr "" + +#: btdownloadgui.py:630 +msgid "Default:" +msgstr "" + +#: btdownloadgui.py:637 +msgid "Change..." +msgstr "" + +#: btdownloadgui.py:641 +msgid "Ask where to save each download" +msgstr "" + +#: btdownloadgui.py:655 +msgid "Downloading" +msgstr "" + +#: btdownloadgui.py:657 +msgid "Starting additional torrents manually:" +msgstr "" + +#: btdownloadgui.py:666 +msgid "Always stops the _last running torrent" +msgstr "" + +#: btdownloadgui.py:672 +msgid "Always starts the torrent in _parallel" +msgstr "" + +#: btdownloadgui.py:678 +msgid "_Asks each time" +msgstr "" + +#: btdownloadgui.py:692 +msgid "Seed completed torrents:" +msgstr "" + +#: btdownloadgui.py:700 btdownloadgui.py:729 +msgid "until share ratio reaches " +msgstr "" + +#: btdownloadgui.py:706 +msgid " percent, or" +msgstr "" + +#: btdownloadgui.py:712 +msgid "for " +msgstr "" + +#: btdownloadgui.py:718 +msgid " minutes, whichever comes first." +msgstr "" + +#: btdownloadgui.py:725 +msgid "Seed last completed torrent:" +msgstr "" + +#: btdownloadgui.py:735 +msgid " percent." +msgstr "" + +#: btdownloadgui.py:741 +msgid "\"0 percent\" means seed forever." +msgstr "" + +#: btdownloadgui.py:750 +msgid "Network" +msgstr "" + +#: btdownloadgui.py:752 +msgid "Look for available port:" +msgstr "" + +#: btdownloadgui.py:755 +msgid "starting at port: " +msgstr "" + +#: btdownloadgui.py:768 +msgid "IP to report to the tracker:" +msgstr "" + +#: btdownloadgui.py:773 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" + +#: btdownloadgui.py:778 +msgid "Potential Windows TCP stack fix" +msgstr "" + +#: btdownloadgui.py:792 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" + +#: btdownloadgui.py:805 +msgid "Misc" +msgstr "" + +#: btdownloadgui.py:812 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" + +#: btdownloadgui.py:820 +msgid "Option" +msgstr "" + +#: btdownloadgui.py:825 +msgid "Value" +msgstr "" + +#: btdownloadgui.py:832 +msgid "Advanced" +msgstr "" + +#: btdownloadgui.py:841 +msgid "Choose default download directory" +msgstr "" + +#: btdownloadgui.py:902 +#, python-format +msgid "Files in \"%s\"" +msgstr "" + +#: btdownloadgui.py:911 +msgid "Apply" +msgstr "" + +#: btdownloadgui.py:912 +msgid "Allocate" +msgstr "" + +#: btdownloadgui.py:913 +msgid "Never download" +msgstr "" + +#: btdownloadgui.py:914 +msgid "Decrease" +msgstr "" + +#: btdownloadgui.py:915 +msgid "Increase" +msgstr "" + +#: btdownloadgui.py:925 btlaunchmanycurses.py:142 +msgid "Filename" +msgstr "" + +#: btdownloadgui.py:925 +msgid "Length" +msgstr "" + +#: btdownloadgui.py:925 +msgid "%" +msgstr "" + +#: btdownloadgui.py:1089 +#, python-format +msgid "Peers for \"%s\"" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "IP address" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "Client" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "Connection" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "KB/s down" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "KB/s up" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "MB downloaded" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "MB uploaded" +msgstr "" + +#: btdownloadgui.py:1095 +#, python-format +msgid "% complete" +msgstr "" + +#: btdownloadgui.py:1095 +msgid "KB/s est. peer download" +msgstr "" + +#: btdownloadgui.py:1101 +msgid "Peer ID" +msgstr "" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Interested" +msgstr "" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Choked" +msgstr "" + +#: btdownloadgui.py:1104 +msgid "Snubbed" +msgstr "" + +#: btdownloadgui.py:1107 +msgid "Optimistic upload" +msgstr "" + +#: btdownloadgui.py:1188 +msgid "remote" +msgstr "" + +#: btdownloadgui.py:1188 +msgid "local" +msgstr "" + +#: btdownloadgui.py:1224 +msgid "bad peer" +msgstr "" + +#: btdownloadgui.py:1234 +#, python-format +msgid "%d ok" +msgstr "" + +#: btdownloadgui.py:1235 +#, python-format +msgid "%d bad" +msgstr "" + +#: btdownloadgui.py:1237 +msgid "banned" +msgstr "" + +#: btdownloadgui.py:1239 +msgid "ok" +msgstr "" + +#: btdownloadgui.py:1275 +#, python-format +msgid "Info for \"%s\"" +msgstr "" + +#: btdownloadgui.py:1293 +msgid "Torrent name:" +msgstr "" + +#: btdownloadgui.py:1298 +msgid "(trackerless torrent)" +msgstr "" + +#: btdownloadgui.py:1301 +msgid "Announce url:" +msgstr "" + +#: btdownloadgui.py:1305 +msgid ", in one file" +msgstr "" + +#: btdownloadgui.py:1307 +#, python-format +msgid ", in %d files" +msgstr "" + +#: btdownloadgui.py:1308 +msgid "Total size:" +msgstr "" + +#: btdownloadgui.py:1315 +msgid "Pieces:" +msgstr "" + +#: btdownloadgui.py:1317 +msgid "Info hash:" +msgstr "" + +#: btdownloadgui.py:1327 +msgid "Save in:" +msgstr "" + +#: btdownloadgui.py:1331 +msgid "File name:" +msgstr "" + +#: btdownloadgui.py:1357 +msgid "Open directory" +msgstr "" + +#: btdownloadgui.py:1363 +msgid "Show file list" +msgstr "" + +#: btdownloadgui.py:1458 +msgid "Torrent info" +msgstr "" + +#: btdownloadgui.py:1467 btdownloadgui.py:1890 +msgid "Remove torrent" +msgstr "" + +#: btdownloadgui.py:1471 +msgid "Abort torrent" +msgstr "" + +#: btdownloadgui.py:1528 +#, python-format +msgid ", will seed for %s" +msgstr "" + +#: btdownloadgui.py:1530 +msgid ", will seed indefinitely." +msgstr "" + +#: btdownloadgui.py:1533 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "" + +#: btdownloadgui.py:1536 +#, python-format +msgid "Done, %s uploaded" +msgstr "" + +#: btdownloadgui.py:1568 +msgid "Torrent _info" +msgstr "" + +#: btdownloadgui.py:1569 +msgid "_Open directory" +msgstr "" + +#: btdownloadgui.py:1570 +msgid "_Change location" +msgstr "" + +#: btdownloadgui.py:1572 +msgid "_File list" +msgstr "" + +#: btdownloadgui.py:1646 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "" + +#: btdownloadgui.py:1649 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "" + +#: btdownloadgui.py:1651 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "" + +#: btdownloadgui.py:1654 +msgid "Remove this torrent?" +msgstr "" + +#: btdownloadgui.py:1673 +msgid "Finished" +msgstr "" + +#: btdownloadgui.py:1674 +msgid "drag into list to seed" +msgstr "" + +#: btdownloadgui.py:1677 +msgid "Failed" +msgstr "" + +#: btdownloadgui.py:1678 +msgid "drag into list to resume" +msgstr "" + +#: btdownloadgui.py:1687 +msgid "Re_start" +msgstr "" + +#: btdownloadgui.py:1688 btdownloadgui.py:1759 btdownloadgui.py:1795 +#: btdownloadgui.py:1900 +msgid "_Remove" +msgstr "" + +#: btdownloadgui.py:1738 +msgid "Waiting" +msgstr "" + +#: btdownloadgui.py:1758 btdownloadgui.py:1794 btdownloadgui.py:1899 +msgid "_Finish" +msgstr "" + +#: btdownloadgui.py:1761 btdownloadgui.py:1790 btdownloadgui.py:1895 +msgid "_Abort" +msgstr "" + +#: btdownloadgui.py:1776 +msgid "Paused" +msgstr "" + +#: btdownloadgui.py:1817 +msgid "Running" +msgstr "" + +#: btdownloadgui.py:1841 +#, python-format +msgid "Current up: %s" +msgstr "" + +#: btdownloadgui.py:1842 +#, python-format +msgid "Current down: %s" +msgstr "" + +#: btdownloadgui.py:1848 +#, python-format +msgid "Previous up: %s" +msgstr "" + +#: btdownloadgui.py:1849 +#, python-format +msgid "Previous down: %s" +msgstr "" + +#: btdownloadgui.py:1855 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "" + +#: btdownloadgui.py:1858 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "" + +#: btdownloadgui.py:1862 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "" + +#: btdownloadgui.py:1865 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "" + +#: btdownloadgui.py:1869 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "" + +#: btdownloadgui.py:1903 +msgid "_Peer list" +msgstr "" + +#: btdownloadgui.py:1962 +msgid "Done" +msgstr "" + +#: btdownloadgui.py:1977 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "" + +#: btdownloadgui.py:1985 +msgid "Download " +msgstr "" + +#: btdownloadgui.py:1987 +msgid "Upload " +msgstr "" + +#: btdownloadgui.py:2002 +msgid "NA" +msgstr "" + +#: btdownloadgui.py:2343 +#, python-format +msgid "%s started" +msgstr "" + +#: btdownloadgui.py:2356 +msgid "_Open torrent file" +msgstr "" + +#: btdownloadgui.py:2357 +msgid "Make _new torrent" +msgstr "" + +#: btdownloadgui.py:2360 +msgid "_Pause/Play" +msgstr "" + +#: btdownloadgui.py:2362 +msgid "_Quit" +msgstr "" + +#: btdownloadgui.py:2364 +msgid "Show/Hide _finished torrents" +msgstr "" + +#: btdownloadgui.py:2366 +msgid "_Resize window to fit" +msgstr "" + +#: btdownloadgui.py:2368 +msgid "_Log" +msgstr "" + +#: btdownloadgui.py:2371 +msgid "_Settings" +msgstr "" + +#: btdownloadgui.py:2374 btdownloadgui.py:2390 +msgid "_Help" +msgstr "" + +#: btdownloadgui.py:2376 +msgid "_About" +msgstr "" + +#: btdownloadgui.py:2377 +msgid "_Donate" +msgstr "" + +#: btdownloadgui.py:2381 +msgid "_File" +msgstr "" + +#: btdownloadgui.py:2386 +msgid "_View" +msgstr "" + +#: btdownloadgui.py:2533 +msgid "(stopped)" +msgstr "" + +#: btdownloadgui.py:2545 +msgid "(multiple)" +msgstr "" + +#: btdownloadgui.py:2659 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" + +#: btdownloadgui.py:2662 +msgid "Visit help web page?" +msgstr "" + +#: btdownloadgui.py:2698 +msgid "There is one finished torrent in the list. " +msgstr "" + +#: btdownloadgui.py:2699 +msgid "Do you want to remove it?" +msgstr "" + +#: btdownloadgui.py:2701 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "" + +#: btdownloadgui.py:2702 +msgid "Do you want to remove all of them?" +msgstr "" + +#: btdownloadgui.py:2704 +msgid "Remove all finished torrents?" +msgstr "" + +#: btdownloadgui.py:2711 +msgid "No finished torrents" +msgstr "" + +#: btdownloadgui.py:2712 +msgid "There are no finished torrents to remove." +msgstr "" + +#: btdownloadgui.py:2756 +msgid "Open torrent:" +msgstr "" + +#: btdownloadgui.py:2789 +msgid "Change save location for " +msgstr "" + +#: btdownloadgui.py:2815 +msgid "File exists!" +msgstr "" + +#: btdownloadgui.py:2816 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "" + +#: btdownloadgui.py:2834 +msgid "Save location for " +msgstr "" + +#: btdownloadgui.py:2944 +#, python-format +msgid "(global message) : %s" +msgstr "" + +#: btdownloadgui.py:2951 +#, python-format +msgid "%s Error" +msgstr "" + +#: btdownloadgui.py:2957 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" + +#: btdownloadgui.py:3087 +msgid "Stop running torrent?" +msgstr "" + +#: btdownloadgui.py:3088 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" + +#: btdownloadgui.py:3098 +msgid "Have you donated?" +msgstr "" + +#: btdownloadgui.py:3099 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "" + +#: btdownloadgui.py:3113 +msgid "Thanks!" +msgstr "" + +#: btdownloadgui.py:3114 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" + +#: btdownloadgui.py:3143 +msgid "Can't have both --responsefile and non-option arguments" +msgstr "" + +#: btdownloadgui.py:3173 +msgid "Temporary Internet Files" +msgstr "" + +#: btdownloadgui.py:3174 +#, python-format +msgid "" +"Could not read %s: %s. You are probably using a broken Internet Explorer " +"version that passed BitTorrent a filename that doesn't exist. To work around " +"the problem, try clearing your Temporary Internet Files or right-click the " +"link and save the .torrent file to disk first." +msgstr "" + +#: btdownloadgui.py:3197 +#, python-format +msgid "%s already running" +msgstr "" + +#: btdownloadheadless.py:137 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "" + +#: btdownloadheadless.py:144 +#, python-format +msgid "%d seen now" +msgstr "" + +#: btdownloadheadless.py:147 +msgid "ERROR:\n" +msgstr "" + +#: btdownloadheadless.py:148 +msgid "saving: " +msgstr "" + +#: btdownloadheadless.py:149 +msgid "percent done: " +msgstr "" + +#: btdownloadheadless.py:150 +msgid "time left: " +msgstr "" + +#: btdownloadheadless.py:151 +msgid "download to: " +msgstr "" + +#: btdownloadheadless.py:152 +msgid "download rate: " +msgstr "" + +#: btdownloadheadless.py:153 +msgid "upload rate: " +msgstr "" + +#: btdownloadheadless.py:154 +msgid "share rating: " +msgstr "" + +#: btdownloadheadless.py:155 +msgid "seed status: " +msgstr "" + +#: btdownloadheadless.py:156 +msgid "peer status: " +msgstr "" + +#: btlaunchmanycurses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "" + +#: btlaunchmanycurses.py:143 +msgid "Size" +msgstr "" + +#: btlaunchmanycurses.py:144 +msgid "Download" +msgstr "" + +#: btlaunchmanycurses.py:145 +msgid "Upload" +msgstr "" + +#: btlaunchmanycurses.py:146 btlaunchmanycurses.py:239 +msgid "Totals:" +msgstr "" + +#: btlaunchmanycurses.py:205 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s up %s dn" +msgstr "" + +#: btlaunchmanycurses.py:227 btlaunchmany.py:35 +msgid "no torrents" +msgstr "" + +#: btlaunchmanycurses.py:265 btlaunchmany.py:49 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid "Warning: " +msgstr "" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid " is not a directory" +msgstr "" + +#: btlaunchmanycurses.py:287 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" + +#: btlaunchmanycurses.py:292 btlaunchmany.py:71 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" + +#: btlaunchmany.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" + +#: btmaketorrentgui.py:55 +#, python-format +msgid "%s metafile creator %s" +msgstr "" + +#: btmaketorrentgui.py:73 +msgid "" +"Make .torrent metafiles for these files/directories:\n" +"(Directories will become batch torrents)" +msgstr "" + +#: btmaketorrentgui.py:88 +msgid "_Files/directories" +msgstr "" + +#: btmaketorrentgui.py:118 +msgid "Piece size:" +msgstr "" + +#: btmaketorrentgui.py:135 +msgid "Use _tracker:" +msgstr "" + +#: btmaketorrentgui.py:165 +msgid "Use _DHT" +msgstr "_DHT-השתמשי ב" + +#: btmaketorrentgui.py:171 +msgid "Nodes (optional):" +msgstr "" + +#: btmaketorrentgui.py:203 +msgid "Comments:" +msgstr ":הערות" + +#: btmaketorrentgui.py:232 +msgid "Make" +msgstr "בני" + +#: btmaketorrentgui.py:405 +msgid "_Host" +msgstr "_שרת" + +#: btmaketorrentgui.py:412 +msgid "_Port" +msgstr "_ערוץ" + +#: btmaketorrentgui.py:505 +msgid "Building torrents..." +msgstr "...בונה קבצים" + +#: btmaketorrentgui.py:513 +msgid "Checking file sizes..." +msgstr "...בודקת גודל קבצים" + +#: btmaketorrentgui.py:531 +msgid "Start seeding" +msgstr "מתחילה לזרועה" + +#: btmaketorrentgui.py:551 +msgid "building " +msgstr "בונה" + +#: btmaketorrentgui.py:571 +msgid "Done." +msgstr ".סיימתי" + +#: btmaketorrentgui.py:572 +msgid "Done building torrents." +msgstr ".סיימתי לבנות את הקבצים" + +#: btmaketorrentgui.py:580 +msgid "Error!" +msgstr "!טעות אנוש" + +#: btmaketorrentgui.py:581 +msgid "Error building torrents: " +msgstr ":בעיה בבניית הקבצים" + +#: btmaketorrent.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" + +#: btmaketorrent.py:31 +msgid "optional target file for the torrent" +msgstr "" + +#: btreannounce.py:22 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "%s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ] :דוגמא" + +#: btreannounce.py:31 +#, python-format +msgid "old announce for %s: %s" +msgstr "" + +#: btrename.py:26 +#, python-format +msgid "%s %s - change the suggested filename in a .torrent file" +msgstr "" + +#: btrename.py:31 +#, python-format +msgid "Usage: %s TORRENTFILE NEW_FILE_NAME" +msgstr "%s TORRENTFILE NEW_FILE_NAME :דוגמא" + +#: btrename.py:38 +#, python-format +msgid "old filename: %s" +msgstr "%s :שם קובץ ישן" + +#: btrename.py:40 +#, python-format +msgid "new filename: %s" +msgstr "%s :שם קובץ חדש" + +#: btrename.py:45 +msgid "done." +msgstr "זהו!" + +#: btshowmetainfo.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: btshowmetainfo.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "%s [TORRENTFILE [TORRENTFILE ... ] ] :דוגמא" + +#: btshowmetainfo.py:42 +#, python-format +msgid "metainfo file.: %s" +msgstr "%s :קובץ מטא-מידע" + +#: btshowmetainfo.py:43 +#, python-format +msgid "info hash.....: %s" +msgstr "%s :האש מידע" + +#: btshowmetainfo.py:47 +#, python-format +msgid "file name.....: %s" +msgstr "%s :שם קובץ" + +#: btshowmetainfo.py:49 +#, fuzzy +msgid "file size.....:" +msgstr ":גודל קובץ" + +#: btshowmetainfo.py:52 +#, python-format +msgid "directory name: %s" +msgstr "%s :שם תיקייה" + +#: btshowmetainfo.py:53 +msgid "files.........: " +msgstr ":קבצים" + +#: btshowmetainfo.py:63 +msgid "archive size..:" +msgstr ":גודל קובץ" + +#: btshowmetainfo.py:67 +#, python-format +msgid "announce url..: %s" +msgstr "%s :כתובת הכרזה" + +#: btshowmetainfo.py:68 +msgid "comment.......: \n" +msgstr ":הערה\n" diff --git a/btlocale/it/LC_MESSAGES/bittorrent.mo b/btlocale/it/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..fa656262d2caa39426d3b95d51498b30fb18a9b8 GIT binary patch literal 59106 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 literal 0 HcmV?d00001 diff --git a/btlocale/it/LC_MESSAGES/bittorrent.po b/btlocale/it/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..07cceec --- /dev/null +++ b/btlocale/it/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2802 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-06-06 16:58-0700\n" +"PO-Revision-Date: 2005-06-01 13:20+0100\n" +"Last-Translator: Gianluca Palladini \n" +"Language-Team: Gianluca Palladini \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Italian\n" +"X-Poedit-Country: ITALY\n" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Questa sembra essere una versione di Python vecchia che non supporta il " +"rilevamento della codifica del filesystem. Si assume per default 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Phyton ha fallito l'autorilevamento della codifica del filesystem. Al suo " +"posto viene usato 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"La codifica del filesystem '%s' non è supportata. Al suo posto viene usato " +"'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componente del percorso del file errato:" + +#: BitTorrent/ConvertedMetainfo.py:188 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha i nomi " +"dei files codificati incorrettamente. Alcuni o tutti i nomi dei files " +"possono apparire diversi da quanto il creatore del file .torrent intendeva." + +#: BitTorrent/ConvertedMetainfo.py:194 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha valori " +"dei caratteri errati che non corrispondono a nessun carattere reale. Alcuni " +"o tutti i nomi dei files possono apparire diversi da quanto il creatore del " +"file .torrent intendeva." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha i nomi " +"dei files codificati incorrettamente. I nomi usati possono tuttavia essere " +"esatti." + +#: BitTorrent/ConvertedMetainfo.py:206 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Il set di caratteri usato sul filesystem locale (\"%s\") non può " +"rappresentare tutti i caratteri usati nel/nei nomi dei file di questo " +"torrent. I nomi dei files sono stati cambiati rispetto all'originale." + +#: BitTorrent/ConvertedMetainfo.py:212 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Il filesystem di Windows non può gestire alcuni caratteri usati nel/nei nomi " +"dei file di questo torrent. I nomi dei files sono stati cambiati rispetto " +"all'originale." + +#: BitTorrent/ConvertedMetainfo.py:217 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha almeno 1 " +"file con un nome di directory o di file errato. Comunque siccome tutti quei " +"files erano contrassegnati come aventi lunghezza 0, tali files sono stati " +"semplicemente ignorati." + +#: BitTorrent/Encoder.py:173 +msgid "Can't start two separate instances of the same torrent" +msgstr "Non si possono avviare due istanze separate dello stesso torrent" + +#: BitTorrent/GUI.py:149 +#, python-format +msgid "%d days" +msgstr "%d giorni" + +#: BitTorrent/GUI.py:151 +#, python-format +msgid "1 day %d hours" +msgstr "1 giorno %d ore" + +#: BitTorrent/GUI.py:153 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d ore" + +#: BitTorrent/GUI.py:155 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minuti" + +#: BitTorrent/GUI.py:157 +#, python-format +msgid "%d seconds" +msgstr "%d secondi" + +#: BitTorrent/GUI.py:159 +msgid "0 seconds" +msgstr "0 secondi" + +#: BitTorrent/GUI.py:201 +#, python-format +msgid "%s Help" +msgstr "%s Aiuto" + +#: BitTorrent/GUI.py:208 +msgid "Frequently Asked Questions:" +msgstr "Domande Richieste Frequentemente (FAQ):" + +#: BitTorrent/GUI.py:213 +msgid "Go" +msgstr "Vai" + +#: BitTorrent/GUI.py:434 BitTorrent/GUI.py:486 +msgid "Choose an existing folder..." +msgstr "" + +#: BitTorrent/GUI.py:444 +msgid "All Files" +msgstr "Tutti i files" + +#: BitTorrent/GUI.py:449 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:483 +msgid "Create a new folder..." +msgstr "" + +#: BitTorrent/GUI.py:545 +msgid "Select file" +msgstr "Seleziona un file" + +#: BitTorrent/GUI.py:546 +msgid "Select folder" +msgstr "Seleziona una cartella" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Mon" +msgstr "Lun" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Tue" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Wed" +msgstr "Mer" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Thu" +msgstr "Gio" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Fri" +msgstr "Ven" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sat" +msgstr "Sab" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sun" +msgstr "Dom" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jan" +msgstr "Gen" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:22 +msgid "May" +msgstr "Mag" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jun" +msgstr "Giu" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jul" +msgstr "Lug" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Aug" +msgstr "Ago" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Sep" +msgstr "Set" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Oct" +msgstr "Ott" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Dec" +msgstr "Dic" + +#: BitTorrent/HTTPHandler.py:83 +msgid "Got Accept-Encoding: " +msgstr "Ottenuta Accept-Encoding: " + +#: BitTorrent/HTTPHandler.py:125 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Compresso: %i Non compresso: %i\n" + +#: BitTorrent/RawServer.py:273 +msgid "lost server socket" +msgstr "socket del server persa" + +#: BitTorrent/RawServer.py:289 +msgid "Error handling accepted connection: " +msgstr "Errore durante la gestione della connessione accettata:" + +#: BitTorrent/RawServer.py:371 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Devo chiudere a causa dell'errore TCP stack flaking out. Per favore " +"consultare le FAQ su %s" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Annuncio tracker non ancora completo %d secondi dopo averlo avviato" + +#: BitTorrent/Rerequester.py:172 +msgid "Problem connecting to tracker - " +msgstr "Problemi connettendosi al tracker - " + +#: BitTorrent/Rerequester.py:199 +msgid "bad data from tracker - " +msgstr "dati errati dal tracker - " + +#: BitTorrent/Rerequester.py:210 +msgid "rejected by tracker - " +msgstr "rifiutati dal tracker - " + +#: BitTorrent/Rerequester.py:216 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Sto abortendo il torrent siccome è stato rifiutato dal tracker mentre non " +"era connesso a nessuna fonte." + +#: BitTorrent/Rerequester.py:218 +msgid " Message from the tracker: " +msgstr " Messaggio dal tracker: " + +#: BitTorrent/Rerequester.py:224 +msgid "warning from tracker - " +msgstr "avvisi dal tracker - " + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "File %s appartiene ad un altro torrent in esecuzione" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "File %s già esistente, ma non è un file valido" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lettura corta - qualcosa ha troncato i files?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formato del file di fastresume non supportato, forse da un'altra versione " +"del client?" + +#: BitTorrent/Storage.py:240 +msgid "Fastresume info doesn't match file modification time" +msgstr "Le info di fastresume non coincidono con l'ora di modifica del file" + +#: BitTorrent/Storage.py:243 +msgid "Fastresume data doesn't match actual filesize" +msgstr "I dati di fastresume non coincidono con la dimensione reale del file" + +#: BitTorrent/Storage.py:257 BitTorrent/StorageWrapper.py:284 +msgid "Couldn't read fastresume data: " +msgstr "Impossibile leggere i dati di fastresume:" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "dati errati nel responsefile - totale troppo piccolo" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "dati errati nel responsefile - totale troppo grande" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "sto controllando il file esistente" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 o le informazioni fastresume non coincidono con lo stato " +"del file (dati mancanti)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Errate info di fastresume (i files contengono più dati)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Errate info di fastresume (valore illegale)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "dati corrotti sul disco - forse hai due copie in esecuzione?" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"comunicato file come completo all'avvio, ma una parte ha fallito il " +"controllo hash" + +#: BitTorrent/TorrentQueue.py:120 +msgid "Could not load saved state: " +msgstr "Impossibile caricare stato salvato:" + +#: BitTorrent/TorrentQueue.py:160 +msgid "Version check failed: no DNS library" +msgstr "Controllo versione fallito: nessuna libreria DNS" + +#: BitTorrent/TorrentQueue.py:177 +msgid "DNS query failed" +msgstr "Ricerca DNS fallita" + +#: BitTorrent/TorrentQueue.py:179 +msgid "number of received TXT fields is not 1" +msgstr "numero dei campi TXT ricevuti diverso da 1" + +#: BitTorrent/TorrentQueue.py:182 +msgid "number of strings in reply is not 1?" +msgstr "numero di stringhe nella risposta diverso da 1?" + +#: BitTorrent/TorrentQueue.py:192 +msgid "Could not parse new version string" +msgstr "Impossibile analizzare la nuova stringa versione" + +#: BitTorrent/TorrentQueue.py:202 +#, python-format +msgid "" +"A newer version of BitTorrent is available.\n" +"You can always get the latest version from\n" +"%s." +msgstr "" +"Una nuova versione di Bittorrent è disponibile.\n" +"Puoi sempre ottenere l'ultima versione su\n" +"%s." + +#: BitTorrent/TorrentQueue.py:207 +msgid "Version check failed: " +msgstr "Controllo versione fallito:" + +#: BitTorrent/TorrentQueue.py:244 +msgid "Could not save UI state: " +msgstr "Impossibile salvare stato UI:" + +#: BitTorrent/TorrentQueue.py:254 BitTorrent/TorrentQueue.py:256 +#: BitTorrent/TorrentQueue.py:329 BitTorrent/TorrentQueue.py:332 +#: BitTorrent/TorrentQueue.py:342 BitTorrent/TorrentQueue.py:354 +#: BitTorrent/TorrentQueue.py:371 +msgid "Invalid state file contents" +msgstr "Contenuti del file di stato non validi" + +#: BitTorrent/TorrentQueue.py:269 +msgid "Error reading file " +msgstr "Errore durante la lettura del file" + +#: BitTorrent/TorrentQueue.py:271 +msgid "cannot restore state completely" +msgstr "Impossibile recuperare completamente lo stato" + +#: BitTorrent/TorrentQueue.py:274 +msgid "Invalid state file (duplicate entry)" +msgstr "Stato del file non valido (entrata duplicata)" + +#: BitTorrent/TorrentQueue.py:280 BitTorrent/TorrentQueue.py:285 +msgid "Corrupt data in " +msgstr "Dati corrotti in " + +#: BitTorrent/TorrentQueue.py:281 BitTorrent/TorrentQueue.py:286 +msgid " , cannot restore torrent (" +msgstr " , impossibile recuperare torrent (" + +#: BitTorrent/TorrentQueue.py:300 +msgid "Invalid state file (bad entry)" +msgstr "Stato del file non valido (entrata errata)" + +#: BitTorrent/TorrentQueue.py:319 +msgid "Bad UI state file" +msgstr "File di stato UI errato" + +#: BitTorrent/TorrentQueue.py:323 +msgid "Bad UI state file version" +msgstr "Versione del file di stato UI errata" + +#: BitTorrent/TorrentQueue.py:325 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versione del file si stato UI non supportata (da una versione del client più " +"nuova?)" + +#: BitTorrent/TorrentQueue.py:496 +msgid "Could not delete cached metainfo file:" +msgstr "Impossibile calcellare il file di metainfo nella cache:" + +#: BitTorrent/TorrentQueue.py:519 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Questo non è un file torrent valido. (%s)" + +#: BitTorrent/TorrentQueue.py:527 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Questo torrent (o uno con gli stessi contenuti) è già in esecuzione." + +#: BitTorrent/TorrentQueue.py:531 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Questo torrent (o uno con gli stessi contenuti) è già in attesa di essere " +"eseguito." + +#: BitTorrent/TorrentQueue.py:538 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent in stato sconosciuto %d" + +#: BitTorrent/TorrentQueue.py:555 +msgid "Could not write file " +msgstr "Impossibile scrivere il file" + +#: BitTorrent/TorrentQueue.py:557 +msgid "torrent will not be restarted correctly on client restart" +msgstr "il torrent non sarà riavviato correttamente al riavvio del client" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Impossibile eseguire più di %d torrents simultaneamente. Per maggiori " +"informazioni leggere le FAQ su %s." + +#: BitTorrent/TorrentQueue.py:758 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Non avvio il torrent siccome ci sono altri torrents in attesa di esecuzione, " +"e questo corrisponde già alle impostazioni di quando smettere di distribuire " +"la fonte completa." + +#: BitTorrent/TorrentQueue.py:764 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Non avvio il torrent siccome questo corrisponde già alle impostazioni di " +"quando smettere di distribuire la fonte completa dell'ultimo torrent " +"completato." + +#: BitTorrent/__init__.py:20 +msgid "Python 2.2.1 or newer required" +msgstr "è necessario Python 2.2.1 o successivo" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "non è una stringa bencoded valida" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "valore bencoded non valido (dai dopo un prefisso valido)" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo errata - non è un dizionario" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo errata - chiave parti errata" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo errata - lunghezza parte illegale" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo errata - nome errato" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "nome %s non permesso per ragioni di sicurezza" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "mix file singolo/multiplo" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo errata - lunghezza errata" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo errata - \"files\" non è una lista di files" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo errata - valore del file errato" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo errata - percorso errato" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo errata - percorso cartella errato" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "percorso %s non permesso per ragioni di sicurezza" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo errata - percorso duplicato" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo errata - nome usato per entrambi i nomi del file e della " +"sottocartella" + +#: BitTorrent/btformats.py:78 +msgid "bad metainfo - wrong object type" +msgstr "metainfo errata - tipo oggetto errato" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo errata - nessuna stringa URL di annuncio" + +#: BitTorrent/btformats.py:88 +msgid "non-text failure reason" +msgstr "messaggio di errore non di testo" + +#: BitTorrent/btformats.py:92 +msgid "non-text warning message" +msgstr "messaggio di avviso non di testo" + +#: BitTorrent/btformats.py:97 +msgid "invalid entry in peer list1" +msgstr "entrata non valida nella lista1 delle fonti" + +#: BitTorrent/btformats.py:99 +msgid "invalid entry in peer list2" +msgstr "entrata non valida nella lista2 delle fonti" + +#: BitTorrent/btformats.py:102 +msgid "invalid entry in peer list3" +msgstr "entrata non valida nella lista3 delle fonti" + +#: BitTorrent/btformats.py:106 +msgid "invalid entry in peer list4" +msgstr "entrata non valida nella lista4 delle fonti" + +#: BitTorrent/btformats.py:108 +msgid "invalid peer list" +msgstr "lista fonti non valida" + +#: BitTorrent/btformats.py:111 +msgid "invalid announce interval" +msgstr "intervallo annuncio non valido" + +#: BitTorrent/btformats.py:114 +msgid "invalid min announce interval" +msgstr "intervallo annuncio minimo non valido" + +#: BitTorrent/btformats.py:116 +msgid "invalid tracker id" +msgstr "tracker id non valido" + +#: BitTorrent/btformats.py:119 +msgid "invalid peer count" +msgstr "conteggio fonti non valido" + +#: BitTorrent/btformats.py:122 +msgid "invalid seed count" +msgstr "conteggio fonti complete non valido" + +#: BitTorrent/btformats.py:125 +msgid "invalid \"last\" entry" +msgstr "entrata \"last\" non valida" + +#: BitTorrent/configfile.py:125 +msgid "Could not permanently save options: " +msgstr "Impossibile salvare permanentemente le opzioni:" + +#: BitTorrent/controlsocket.py:108 BitTorrent/controlsocket.py:157 +msgid "Could not create control socket: " +msgstr "Impossibile create il socket di controllo:" + +#: BitTorrent/controlsocket.py:116 BitTorrent/controlsocket.py:134 +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:187 +msgid "Could not send command: " +msgstr "Impossibile inviare il comando:" + +#: BitTorrent/controlsocket.py:144 +msgid "Could not create control socket: already in use" +msgstr "Impossibile create il socket di controllo: già in uso" + +#: BitTorrent/controlsocket.py:149 +msgid "Could not remove old control socket filename:" +msgstr "" +"Impossibile rimuovere il vecchio nome del file del socket di controllo:" + +#: BitTorrent/defaultargs.py:32 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"la cartella nella quale i dati variabili come le informazioni fastresume e " +"lo stato GUI sono salvate. Default nella sottocartella 'data' della cartella " +"config di bittorrent." + +#: BitTorrent/defaultargs.py:36 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codifica dei caratteri usata sul filesystem locale. Se lasciato vuoto, " +"rilevato automaticamente. la rilevazione automatica non funziona con " +"versioni di Python più vecchie della 2.3" + +#: BitTorrent/defaultargs.py:40 +msgid "ISO Language code to use" +msgstr "" + +#: BitTorrent/defaultargs.py:45 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ip da riferire al tracker (non ha effetto a meno chè tu non sia sulla stessa " +"rete locale del tracker)" + +#: BitTorrent/defaultargs.py:48 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"numero di porta visibile globalmente se esso è differente da quello sul " +"quale il client ascolta localmente" + +#: BitTorrent/defaultargs.py:51 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "porta minima da ascoltare, aumenta se non disponibile" + +#: BitTorrent/defaultargs.py:53 +msgid "maximum port to listen on" +msgstr "porta massima da ascoltare" + +#: BitTorrent/defaultargs.py:55 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ip su cui effettuare il bind localmente" + +#: BitTorrent/defaultargs.py:57 +msgid "seconds between updates of displayed information" +msgstr "secondi tra gli aggiornamenti delle informazioni visualizzate" + +#: BitTorrent/defaultargs.py:59 +msgid "minutes to wait between requesting more peers" +msgstr "minuti da attendere tra le richieste di più fonti" + +#: BitTorrent/defaultargs.py:61 +msgid "minimum number of peers to not do rerequesting" +msgstr "numero minimo delle fonti per non effettuare una nuova richiesta" + +#: BitTorrent/defaultargs.py:63 +msgid "number of peers at which to stop initiating new connections" +msgstr "numero delle fonti al quale interrompere l'inizio di nuove connessioni" + +#: BitTorrent/defaultargs.py:65 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"numero massimo di connessioni da permettere, dopo le quali le nunove " +"connessioni saranno chiuse immediatamente" + +#: BitTorrent/defaultargs.py:68 +msgid "whether to check hashes on disk" +msgstr "se controllare gli hashes su disco" + +#: BitTorrent/defaultargs.py:70 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "kB/s massimi da inviare, 0 significa nessun limite" + +#: BitTorrent/defaultargs.py:72 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "il numero di invii da riempire con extra antisoffocamenti ottimistici" + +#: BitTorrent/defaultargs.py:74 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"il numero massimo dei files in un torrent multifile da tenere aperto in una " +"volta, 0 significa nessun limite. Usato per evitare di esaurire i " +"descrittori dei files." + +#: BitTorrent/defaultargs.py:81 +msgid "number of seconds to pause between sending keepalives" +msgstr "numero di secondi di pausa tra gli invii di keepalives" + +#: BitTorrent/defaultargs.py:83 +msgid "how many bytes to query for per request." +msgstr "quanti bytes richiedere per ogni richiesta" + +#: BitTorrent/defaultargs.py:85 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"lunghezza massima del prefisso di codifica che sarà accettato sul " +"collegamento - valori maggiori causeranno la caduta della connessione." + +#: BitTorrent/defaultargs.py:88 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"secondi da attendere tra i socket in chiusura dai quali non si è ricevuto " +"niente" + +#: BitTorrent/defaultargs.py:91 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"secondi da attendere tra il controllo delle connessioni che sono andate in " +"time out" + +#: BitTorrent/defaultargs.py:93 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"lunghezza massima dello slice da inviare alle fonti, chiudi la connessione " +"se una richiesta maggiore è ricevuta" + +#: BitTorrent/defaultargs.py:96 BitTorrent/defaultargs.py:98 +msgid "maximum amount of time to guess the current rate estimate represents" +msgstr "" +"tempo massimo per indovinare cosa rappresenta la stima del tasso corrente" + +#: BitTorrent/defaultargs.py:100 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"tempo massimo da attendere tra la riprova degli annunci se continuano a " +"fallire" + +#: BitTorrent/defaultargs.py:102 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"secondi da attendere per i dati in arrivo su una connessione prima di " +"supporre che sia semi-permanentemente soffocata" + +#: BitTorrent/defaultargs.py:105 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"numero di scaricamenti al quale passare da casuale al prima il più raro" + +#: BitTorrent/defaultargs.py:107 +msgid "how many bytes to write into network buffers at once." +msgstr "quanti bytes scrivere in una volta sola nei buffer di rete." + +#: BitTorrent/defaultargs.py:109 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"rifiuta ulteriori connessioni dagli indirizzi con fonti errate o " +"intenzionalmente ostili che mandano dati incorretti" + +#: BitTorrent/defaultargs.py:112 +msgid "do not connect to several peers that have the same IP address" +msgstr "non connettere a più fonti che hanno lo stesso indirizzo IP" + +#: BitTorrent/defaultargs.py:114 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"se non zero, imposta l'opzione TOS per le connessionialle fonti a questo " +"valore" + +#: BitTorrent/defaultargs.py:116 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"abilità rimedio per un difetto nella BSD libc che causa la lettura dei files " +"molto lenta." + +#: BitTorrent/defaultargs.py:118 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "indirizzo del proxy HTTP da usare per le connessioni ai tracker" + +#: BitTorrent/defaultargs.py:120 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "chiudi le connessioni con RST ed evita lo stato TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:122 +msgid "force max_allow_in to stay below 30 on Win32" +msgstr "forza max_allow a stare sotto i 30 su Win32" + +#: BitTorrent/defaultargs.py:139 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nome file (per torrents a file-singolo) o nome cartella (per torrents batch) " +"da usare per salvare il torrent, che prevarrà sul nome di default nel " +"torrent. Vedi anche --save_in, se nessuno è specificato all'utente sarà " +"richiesta la posizione del salvataggio" + +#: BitTorrent/defaultargs.py:144 +msgid "display advanced user interface" +msgstr "mostra interfaccia utente avanzata" + +#: BitTorrent/defaultargs.py:146 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"il numero massimo di minuti in cui distribuire una fonte completa di un " +"torrent completato prima di smettere di distribuirlo" + +#: BitTorrent/defaultargs.py:149 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"il rapporto minimo invii/scaricamenti, in percentuale, da raggiungere prima " +"di smettere di distribuire la fonte completa. 0 significa nessun limite." + +#: BitTorrent/defaultargs.py:152 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"il rapporto minimo invii/scaricamenti, in percentuale, da raggiungere prima " +"di smettere di distribuire la fonte completa dell'ultimo torrent. 0 " +"significa nessun limite." + +#: BitTorrent/defaultargs.py:155 +msgid "start downloader in paused state" +msgstr "avvia lo scaricatore in pausa" + +#: BitTorrent/defaultargs.py:157 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"specificacome l'applicazione dovrebbe comportarsi quando l'utente prova ad " +"avviare manualmente un altro torrent: \"replace\" significa rimpiazza sempre " +"il torrent in esecuzione con quello nuovo, \"add\" significa aggiungi sempre " +"il torrent in esecuzione in parallelo, e \"ask\" significa chiedi all'utente " +"ogni volta." + +#: BitTorrent/defaultargs.py:171 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nome file (per torrents a file-singolo) o nome cartella (per torrents batch) " +"da usare per salvare il torrent, che prevarrà sul nome di default nel " +"torrent. Vedi anche --save_in" + +#: BitTorrent/defaultargs.py:178 BitTorrent/defaultargs.py:198 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at once." +msgstr "" +"Il numero massimo di invii da permettere in una sola volta. -1 significa un " +"(si spera) ragionevole numero basato sul --max_upload_rate. I valori " +"automatici sono sensibili solo quando è in esecuzione solo un torrent alla " +"volta." + +#: BitTorrent/defaultargs.py:183 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"cartella locale dove i contenuti del torrent saranno salvati. Il file " +"(torrents a file-singolo) o la cartella (torrents batch) saranno creati " +"sotto questa cartella usando il nome di default specificato nel file ." +"torrent. Vedi anche --save_as." + +#: BitTorrent/defaultargs.py:188 +msgid "file the server response was stored in, alternative to url" +msgstr "" +"file nel quale è immagazzinata la risposta del server, in alternativa all'url" + +#: BitTorrent/defaultargs.py:190 +msgid "url to get file from, alternative to responsefile" +msgstr "url dal quale ottenere il file, in alternativa al responsefile" + +#: BitTorrent/defaultargs.py:192 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "se chiedere o no una posizione nella quale salvare i files scaricati" + +#: BitTorrent/defaultargs.py:203 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"cartella locale dove i torrents saranno salvati, usando un nome determinato " +"da --saveas_style. Se questo è lasciato vuoto ogni torrent sarà salvato " +"sotto la cartella del file .torrent corrispondente" + +#: BitTorrent/defaultargs.py:208 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "quanto spesso riesaminare la cartella torrent, in secondi" + +#: BitTorrent/defaultargs.py:210 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Come dare un nome agli scaricamenti torrent: 1: usare il nome DEL file " +"torrent (senza .torrent); 2: usare il nome codificato NEL file torrent; 3: " +"creare una cartella col nome DEL file torrent (senza .torrent) e salvare in " +"quella cartella usando il nome codificato NEL file torrent; 4: se il nome " +"DEL file torrent (senza .torrent) e il nome codificato NEL file torretn sono " +"identici, usare quel nome (punti 1 e 2), altrimenti creare una cartella " +"intermedia come nel punto 3; AVVERTENZA: le opzioni 1 e 2 hanno la capacità " +"di sovrascrivere i files senza preavviso e possono presentare problemi di " +"sicurezza." + +#: BitTorrent/defaultargs.py:225 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"se visualizzare il percorso completo o i contenuti torrent per ogni torrent" + +#: BitTorrent/defaultargs.py:232 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "cartella da esaminare per i files .torrent (semi-ricorsiva)" + +#: BitTorrent/defaultargs.py:237 +msgid "whether to display diagnostic info to stdout" +msgstr "se visualizzare le informazioni diagnostiche sullo standard output" + +#: BitTorrent/defaultargs.py:242 +msgid "which power of two to set the piece size to" +msgstr "a quale potenza di due impostare la dimensione delle parti" + +#: BitTorrent/defaultargs.py:244 +msgid "default tracker name" +msgstr "nome di default del tracker" + +#: BitTorrent/defaultargs.py:247 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"se falso crea un torrent senza tracker, invece di un URL di annuncio, usa un " +"nodo affidabile nella forma : o una stringa vuota per prendere " +"alcuni nodi dalla tua tabella di instradamento" + +#: BitTorrent/download.py:92 +msgid "maxport less than minport - no ports to check" +msgstr "maxport minore di minport - nessuna porta da controllare" + +#: BitTorrent/download.py:104 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Impossibile aprire una porta di ascolto: %s." + +#: BitTorrent/download.py:106 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Impossibile aprire una porta di ascolto: %s. " + +#: BitTorrent/download.py:108 +msgid "Check your port range settings." +msgstr "Controlla l'impostazione dell'intervallo delle porte." + +#: BitTorrent/download.py:212 +msgid "Initial startup" +msgstr "Avvio iniziale" + +#: BitTorrent/download.py:264 +#, python-format +msgid "Could not load fastresume data: %s. " +msgstr "Impossibile caricare i dati di fastresume: %s. " + +#: BitTorrent/download.py:265 +msgid "Will perform full hash check." +msgstr "Verrà eseguito un controllo completo sull'hash" + +#: BitTorrent/download.py:272 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "la parte %d ha fallito il controllo hash, verrà scaricata nuovamente" + +#: BitTorrent/download.py:383 BitTorrent/launchmanycore.py:139 +msgid "downloading" +msgstr "sto scaricando" + +#: BitTorrent/download.py:393 +msgid "download failed: " +msgstr "scaricamento fallito" + +#: BitTorrent/download.py:397 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Errore IO: non c'è più spazio su disco, o impossibile creare un file così " +"grande:" + +#: BitTorrent/download.py:400 +msgid "killed by IO error: " +msgstr "terminato a causa di un errore IO:" + +#: BitTorrent/download.py:403 +msgid "killed by OS error: " +msgstr "terminato a causa di un errore OS:" + +#: BitTorrent/download.py:408 +msgid "killed by internal exception: " +msgstr "terminato a causa di un eccezione interna:" + +#: BitTorrent/download.py:413 +msgid "Additional error when closing down due to error: " +msgstr "Errore addizionale durante la chiusura dovuto all'errore:" + +#: BitTorrent/download.py:426 +msgid "Could not remove fastresume file after failure:" +msgstr "Impossibile rimuovere file fastresume dopo l'errore:" + +#: BitTorrent/download.py:443 +msgid "seeding" +msgstr "sto effettuando la distribuzione della fonte completa" + +#: BitTorrent/download.py:466 +msgid "Could not write fastresume data: " +msgstr "Impossibile scrivere dati fastresume:" + +#: BitTorrent/download.py:476 +msgid "shut down" +msgstr "chiusura" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Impossibile impostare il gestore del segnale:" + +#: BitTorrent/launchmanycore.py:69 btdownloadcurses.py:354 +#: btdownloadheadless.py:237 +msgid "shutting down" +msgstr "chiusura in corso" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "abbandonato \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "aggiunto \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "in attesa del controllo hash" + +#: BitTorrent/launchmanycore.py:142 btlaunchmanycurses.py:58 +msgid "connecting to peers" +msgstr "collegamento alle fonti" + +#: BitTorrent/launchmanycore.py:232 btdownloadcurses.py:361 +#: btdownloadheadless.py:244 +msgid "Error reading config: " +msgstr "Errore durante la lettura della configurazione:" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Rilettura del file di configurazione" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Non puoi specificare il nome del file .torrent quando stai generando più " +"torrents multipli in una sola volta" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "La codifica del filesystem \"%s\" non è supportata in questa versione" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Impossibile convertire il nome file/cartella \"%s\" in utf-8 (%s). O la " +"codifica del filesystem assunta \"%s\" è errata o il nome del file contiene " +"bytes illegali." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Il nome file/cartella \"%s\" contiene valori unicode riservati che non " +"corrispondono a caratteri." + +#: BitTorrent/parseargs.py:23 +#, python-format +msgid "Usage: %s " +msgstr "Utilizzo: %s " + +#: BitTorrent/parseargs.py:25 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPZIONI] [CARTELLATORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:26 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Se un argomento non-opzione è presente è preso come\n" +"il valore dell'opzione torrent_dir .\n" + +#: BitTorrent/parseargs.py:29 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPZIONI] [FILESTORRENT]\n" + +#: BitTorrent/parseargs.py:31 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPZIONI] [FILETORRENT]\n" + +#: BitTorrent/parseargs.py:33 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPZIONE] URL_TRACKER FILE [FILE]\n" + +#: BitTorrent/parseargs.py:35 +msgid "arguments are -\n" +msgstr "gli argomenti sono -\n" + +#: BitTorrent/parseargs.py:66 +msgid " (defaults to " +msgstr "(default a " + +#: BitTorrent/parseargs.py:115 BitTorrent/parseargs.py:152 +msgid "unknown key " +msgstr "chiave sconosciuta" + +#: BitTorrent/parseargs.py:121 BitTorrent/parseargs.py:131 +msgid "parameter passed in at end with no value" +msgstr "parametro passato alla fine senza valore" + +#: BitTorrent/parseargs.py:135 +msgid "command line parsing failed at " +msgstr "scansione del comando di linea fallito su " + +#: BitTorrent/parseargs.py:142 +#, python-format +msgid "Option %s is required." +msgstr "E' necessaria l'opzione %s ." + +#: BitTorrent/parseargs.py:144 +#, python-format +msgid "Must supply at least %d args." +msgstr "Bisogna fornire almeno %d argomenti." + +#: BitTorrent/parseargs.py:146 +#, python-format +msgid "Too many args - %d max." +msgstr "Troppi argomenti - %d massimo." + +#: BitTorrent/parseargs.py:176 +#, python-format +msgid "wrong format of %s - %s" +msgstr "formato errato di %s - %s" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Impossibile leggere la cartella" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Impossibile gererare statistiche" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "rimozione %s (verrà riaggiunto)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**avviso** %s è un torrent duplicato per %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**avviso** %s contiene errori" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... riuscito" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "rimozione %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "controllo completato" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Porta da ascoltare." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "file nel quale immagazzinare le informazioni degli scaricatori" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tempo di scadenza per le connessioni in chiusura" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "secondi tra i salvataggi del dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "secondi tra le scadenze degli scaricatori" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "secondi che gli scaricatori dovrebbero attendere tra i riannunci" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send in an info message if the client does not " +"specify a number" +msgstr "" +"numero di default di fonti da mandare in un messaggio di informazioni se il " +"client non specifica un numero" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "tempo da attendere tra i controlli se le connessioni sono scadute" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"quante volte controllare se uno scaricatore è dietro un NAT (0 = non " +"controllare)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "se aggiungere entrate al registro per i risultati di controllo-nat" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" +"tempo minimo che deve passare dall'ultima pulizia prima di poterne " +"effettuare un'altra" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"tempo minimo in secondi prima che la cache sia considerata vecchia e sia " +"ripulita" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"permetti solamente lo scaricamento dei .torrents in questa cartella (e " +"ricorsivamente nelle sottocartelle delle cartelle che non contengono files ." +"torrents). Se impostato, i torrents in questa cartella appariranno nella " +"pagina info/scrape a seconda che abbiano fonti oppure no" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permetti chiavi speciali nei torrents nella allowed_dir per influire " +"sull'accesso al tracker" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "se riaprire il file di registro alla ricezione di un segnale HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"se mostrare una pagina di informazioni quando la cartella principale del " +"tracker è caricata" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "un URL verso il quale redirigere la pagina di informazioni" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "se mostrare i nomi dalla cartella permessa" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"file contenente i dati x-icon da ritornare quando il browser richiede " +"favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignora il parametro ip GET dalle macchine che non sono su IP della rete " +"locale (0 = mai, 1 = sempre, 2 = ignora se il controllo NAT non è " +"abilitato). Le intestazioni proxy HTTP che forniscono gli indirizzi dei " +"client originali sono trattati allo stesso modo di --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"file usato per scrivere i registri dei tracker, usare - per standard output " +"(default)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"usato con allowed_dir; aggiunge un url /file?hash={hash} che permette agli " +"utenti di scaricare il file torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"mantieni i torrent estinti dopo che scadono (così che appaiano ancora sul " +"tuor /scrape e pagina web). Significante solo se allowed_dir non è impostata" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "accesso scrape permesso (può essere nessuno, specifico o pieno)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "numero massimo delle fonti da fornire con una richiesta" + +#: BitTorrent/track.py:161 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"il tuo file potrebbe esistere altrovenell'universo\n" +"ma putrtroppo, non qui\n" + +#: BitTorrent/track.py:246 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**avviso** file favicon specificato -- %s -- non esistente." + +#: BitTorrent/track.py:269 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**avviso** file di stato %s corrotto; sto resettando" + +#: BitTorrent/track.py:305 +msgid "# Log Started: " +msgstr "# Registro Avviato: " + +#: BitTorrent/track.py:307 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**avviso** impossibile redirezionare lo standard output al file di registro: " + +#: BitTorrent/track.py:315 +msgid "# Log reopened: " +msgstr "# Registro riaperto: " + +#: BitTorrent/track.py:317 +msgid "**warning** could not reopen logfile" +msgstr "**avviso** impossibile riaprire il file di registro" + +#: BitTorrent/track.py:457 +msgid "specific scrape function is not available with this tracker." +msgstr "la funzione scrape specifica non è disponibile con questo tracker." + +#: BitTorrent/track.py:467 +msgid "full scrape function is not available with this tracker." +msgstr "la funzione scrape completa non è disponibile con questo tracker." + +#: BitTorrent/track.py:480 +msgid "get function is not available with this tracker." +msgstr "la funzione get non è disponibile con questo tracker." + +#: BitTorrent/track.py:494 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"Lo scaricamento richiesto non è autorizzato per l'uso con questo tracker." + +#: BitTorrent/track.py:850 btlaunchmanycurses.py:287 +msgid "error: " +msgstr "errore: " + +#: BitTorrent/track.py:851 +msgid "run with no arguments for parameter explanations" +msgstr "eseguire senza argomenti per la spiegazione dei parametri" + +#: BitTorrent/track.py:859 +msgid "# Shutting down: " +msgstr "# Chiusura in corso: " + +#: btdownloadcurses.py:45 btlaunchmanycurses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Inizializzazione GUI in modo testuale fallita, impossibile procedere." + +#: btdownloadcurses.py:47 btlaunchmanycurses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Questa interfaccia di scaricamento richiede il modulo Python standard " +"\"curses\", il quale sfortunatamente non è disponibile per la traduzione " +"nativa in Windows di Python. E' comunque disponibile per la traduzione " +"Cygwin di Python, eseguibile su tutti i sistemil Win32 (www.cygwin.com)." + +#: btdownloadcurses.py:52 btlaunchmanycurses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Puoi usare \"btdownloadheadless.py\" per scaricare." + +#: btdownloadcurses.py:57 btdownloadheadless.py:39 +msgid "download complete!" +msgstr "Scaricamento completato!" + +#: btdownloadcurses.py:62 btdownloadheadless.py:44 +msgid "" +msgstr "" + +#: btdownloadcurses.py:65 btdownloadheadless.py:47 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "finirà in %d:%02d:%02d" + +#: btdownloadcurses.py:151 +msgid "file:" +msgstr "file:" + +#: btdownloadcurses.py:152 +msgid "size:" +msgstr "dimensione" + +#: btdownloadcurses.py:153 +msgid "dest:" +msgstr "dest:" + +#: btdownloadcurses.py:154 +msgid "progress:" +msgstr "progresso:" + +#: btdownloadcurses.py:155 +msgid "status:" +msgstr "stato:" + +#: btdownloadcurses.py:156 +msgid "dl speed:" +msgstr "velocità in entrata:" + +#: btdownloadcurses.py:157 +msgid "ul speed:" +msgstr "velocità in uscita:" + +#: btdownloadcurses.py:158 +msgid "sharing:" +msgstr "condivisione:" + +#: btdownloadcurses.py:159 +msgid "seeds:" +msgstr "fonti complete:" + +#: btdownloadcurses.py:160 +msgid "peers:" +msgstr "fonti:" + +#: btdownloadcurses.py:169 btdownloadheadless.py:94 +msgid "download succeeded" +msgstr "file scaricato con successo" + +#: btdownloadcurses.py:213 btdownloadheadless.py:128 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB in uscita / %.1f MB in entrata)" + +#: btdownloadcurses.py:216 btdownloadheadless.py:131 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB in uscita / %.1f MB in entrata)" + +#: btdownloadcurses.py:222 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d conosciuti, più %d copie distribuite(%s)" + +#: btdownloadcurses.py:227 btdownloadheadless.py:142 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d copie distribuite (prossima: %s)" + +#: btdownloadcurses.py:249 +msgid "error(s):" +msgstr "errore(i):" + +#: btdownloadcurses.py:258 +msgid "error:" +msgstr "errore:" + +#: btdownloadcurses.py:261 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Inviati Scaricati Completati " +"Velocità" + +#: btdownloadcurses.py:306 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "sto scaricando %d parti, hanno %d frammenti, %d di %d parti completate" + +#: btdownloadcurses.py:336 btdownloadheadless.py:219 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Non puoi specificare entrambi --save_as e --save_in" + +#: btdownloadcurses.py:404 btdownloadheadless.py:287 +msgid "must have responsefile as arg or parameter, not both" +msgstr "deve avere responsefile come argomento o parametro, non entrambi" + +#: btdownloadcurses.py:417 btdownloadheadless.py:300 +msgid "you must specify a .torrent file" +msgstr "devi specificare un file .torrent" + +#: btdownloadcurses.py:419 btdownloadheadless.py:302 +msgid "Error reading .torrent file: " +msgstr "Errore durante la lettura del file .torrent:" + +#: btdownloadcurses.py:429 +msgid "These errors occurred during execution:" +msgstr "Questi errori sono occorsi durante l'esecuzione:" + +#: btdownloadgui.py:24 btmaketorrentgui.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installa Python 2.3 o successivo" + +#: btdownloadgui.py:38 +msgid "PyGTK 2.4 or newer required" +msgstr "richiesto PyGTK 2.4 o superiore" + +#: btdownloadgui.py:104 +msgid "drag to reorder" +msgstr "trascina per riordinare" + +#: btdownloadgui.py:105 +msgid "right-click for menu" +msgstr "click-destro per il menù" + +#: btdownloadgui.py:108 +#, python-format +msgid "rate: %s" +msgstr "tasso: %s" + +#: btdownloadgui.py:111 +msgid "dialup" +msgstr "dialup" + +#: btdownloadgui.py:112 +msgid "DSL/cable 128k up" +msgstr "DSL/cable 128k up" + +#: btdownloadgui.py:113 +msgid "DSL/cable 256k up" +msgstr "DSL/cable 256k up" + +#: btdownloadgui.py:114 +msgid "DSL 768k up" +msgstr "DSL 768k up" + +#: btdownloadgui.py:115 +msgid "T1" +msgstr "T1" + +#: btdownloadgui.py:116 +msgid "T1/E1" +msgstr "T1/E1" + +#: btdownloadgui.py:117 +msgid "E1" +msgstr "E1" + +#: btdownloadgui.py:118 +msgid "T3" +msgstr "T3" + +#: btdownloadgui.py:119 +msgid "OC3" +msgstr "OC3" + +#: btdownloadgui.py:297 +msgid "Maximum upload " +msgstr "Invio massimo" + +#: btdownloadgui.py:310 +msgid "Temporarily stop all running torrents" +msgstr "Ferma temporaneamente tutti i torrents in esecuzione" + +#: btdownloadgui.py:311 +msgid "Resume downloading" +msgstr "Riprenso lo scaricamento" + +#: btdownloadgui.py:350 +#, python-format +msgid "New %s version available" +msgstr "Nuova versione %s disponibile" + +#: btdownloadgui.py:365 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Una nuova versione di %s è disponibile.\n" + +#: btdownloadgui.py:366 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Stai usando %s, e la nuova versione è %s.\n" + +#: btdownloadgui.py:367 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Puoi sempre ottenere l'ultima versione su \n" +"%s" + +#: btdownloadgui.py:374 btdownloadgui.py:1789 btdownloadgui.py:1894 +msgid "Download _later" +msgstr "Scarica _dopo" + +#: btdownloadgui.py:377 btdownloadgui.py:1753 +msgid "Download _now" +msgstr "Scarica _ora" + +#: btdownloadgui.py:383 +msgid "_Remind me later" +msgstr "_Ricordamelo dopo" + +#: btdownloadgui.py:415 +#, python-format +msgid "About %s" +msgstr "Informazioni su %s" + +#: btdownloadgui.py:430 +msgid "Beta" +msgstr "Beta" + +#: btdownloadgui.py:432 +#, python-format +msgid "Version %s" +msgstr "Versione %s" + +#: btdownloadgui.py:451 +msgid "Donate" +msgstr "Donazione" + +#: btdownloadgui.py:471 +#, python-format +msgid "%s Activity Log" +msgstr "%s Registro Attività" + +#: btdownloadgui.py:528 +msgid "Save log in:" +msgstr "Salva registro in:" + +#: btdownloadgui.py:539 +msgid "log saved" +msgstr "registro salvato" + +#: btdownloadgui.py:598 +msgid "log cleared" +msgstr "registro cancellato" + +#: btdownloadgui.py:610 +#, python-format +msgid "%s Settings" +msgstr "%s Impostazioni" + +#: btdownloadgui.py:621 +msgid "Saving" +msgstr "Sto salvando" + +#: btdownloadgui.py:623 +msgid "Download folder:" +msgstr "Cartella scaricamenti:" + +#: btdownloadgui.py:630 +msgid "Default:" +msgstr "Default:" + +#: btdownloadgui.py:637 +msgid "Change..." +msgstr "Cambia..." + +#: btdownloadgui.py:641 +msgid "Ask where to save each download" +msgstr "Chiedi dove salvare ogni scaricamento" + +#: btdownloadgui.py:655 +msgid "Downloading" +msgstr "Sto scaricando" + +#: btdownloadgui.py:657 +msgid "Starting additional torrents manually:" +msgstr "Avvia manualmente i torrents addizionali:" + +#: btdownloadgui.py:666 +msgid "Always stops the _last running torrent" +msgstr "Ferma sempre _l'ultimo torrent in esecuzione" + +#: btdownloadgui.py:672 +msgid "Always starts the torrent in _parallel" +msgstr "Avvia sempre il torrent in _parallelo" + +#: btdownloadgui.py:678 +msgid "_Asks each time" +msgstr "Chiedi ogni volt_a" + +#: btdownloadgui.py:692 +msgid "Seed completed torrents:" +msgstr "Fonti complete torrents completati:" + +#: btdownloadgui.py:700 btdownloadgui.py:729 +msgid "until share ratio reaches " +msgstr "finchè il rapporto di condivisione raggiunge" + +#: btdownloadgui.py:706 +msgid " percent, or" +msgstr " percento, o" + +#: btdownloadgui.py:712 +msgid "for " +msgstr "per" + +#: btdownloadgui.py:718 +msgid " minutes, whichever comes first." +msgstr " minuti, quale succede prima." + +#: btdownloadgui.py:725 +msgid "Seed last completed torrent:" +msgstr "Fonti complete ultimo torrent completato:" + +#: btdownloadgui.py:735 +msgid " percent." +msgstr " percento." + +#: btdownloadgui.py:741 +msgid "\"0 percent\" means seed forever." +msgstr "" +"\"0 percento\" significa che effettuerà la distribuzione della fonte " +"completa all'infinito." + +#: btdownloadgui.py:750 +msgid "Network" +msgstr "Rete" + +#: btdownloadgui.py:752 +msgid "Look for available port:" +msgstr "Guarda per porta disponibile:" + +#: btdownloadgui.py:755 +msgid "starting at port: " +msgstr "inizia alla porta:" + +#: btdownloadgui.py:768 +msgid "IP to report to the tracker:" +msgstr "IP da riferire al tracker." + +#: btdownloadgui.py:773 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(non ha effetto a meno che tu non sia\n" +"sulla stessa rete locale del tracker)" + +#: btdownloadgui.py:778 +msgid "Potential Windows TCP stack fix" +msgstr " Correzione potenziale dello stack TCP di Windows" + +#: btdownloadgui.py:792 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Il testo nella barra di progresso è sempre nero\n" +"(richiede riavvio)" + +#: btdownloadgui.py:805 +msgid "Misc" +msgstr "Varie" + +#: btdownloadgui.py:812 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"AVVISO: Cambiando queste impostazioni\n" +"%s può non funzionare correttamente." + +#: btdownloadgui.py:820 +msgid "Option" +msgstr "Opzione" + +#: btdownloadgui.py:825 +msgid "Value" +msgstr "Valore" + +#: btdownloadgui.py:832 +msgid "Advanced" +msgstr "Avanzate" + +#: btdownloadgui.py:841 +msgid "Choose default download directory" +msgstr "Scegli cartella di default per gli scaricamenti" + +#: btdownloadgui.py:902 +#, python-format +msgid "Files in \"%s\"" +msgstr "Files in \"%s\"" + +#: btdownloadgui.py:911 +msgid "Apply" +msgstr "Applica" + +#: btdownloadgui.py:912 +msgid "Allocate" +msgstr "Alloca" + +#: btdownloadgui.py:913 +msgid "Never download" +msgstr "Non scaricare mai" + +#: btdownloadgui.py:914 +msgid "Decrease" +msgstr "Decrementa" + +#: btdownloadgui.py:915 +msgid "Increase" +msgstr "Incrementa" + +#: btdownloadgui.py:925 btlaunchmanycurses.py:142 +msgid "Filename" +msgstr "Nome file" + +#: btdownloadgui.py:925 +msgid "Length" +msgstr "Lunghezza" + +#: btdownloadgui.py:925 +msgid "%" +msgstr "%" + +#: btdownloadgui.py:1089 +#, python-format +msgid "Peers for \"%s\"" +msgstr "fonti per \"%s\"" + +#: btdownloadgui.py:1095 +msgid "IP address" +msgstr "indirizzo IP" + +#: btdownloadgui.py:1095 +msgid "Client" +msgstr "Client" + +#: btdownloadgui.py:1095 +msgid "Connection" +msgstr "Connessione" + +#: btdownloadgui.py:1095 +msgid "KB/s down" +msgstr "KB/s in entrata" + +#: btdownloadgui.py:1095 +msgid "KB/s up" +msgstr "KB/s in uscita" + +#: btdownloadgui.py:1095 +msgid "MB downloaded" +msgstr "MB scaricati" + +#: btdownloadgui.py:1095 +msgid "MB uploaded" +msgstr "MB inviati" + +#: btdownloadgui.py:1095 +#, python-format +msgid "% complete" +msgstr "% completato" + +#: btdownloadgui.py:1095 +msgid "KB/s est. peer download" +msgstr "KB/s stimati scaricamento dalla fonte" + +#: btdownloadgui.py:1101 +msgid "Peer ID" +msgstr "IP Fonte" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Interested" +msgstr "Interessato" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Choked" +msgstr "Soffocato" + +#: btdownloadgui.py:1104 +msgid "Snubbed" +msgstr "Affrontato" + +#: btdownloadgui.py:1107 +msgid "Optimistic upload" +msgstr "Invio ottimistico" + +#: btdownloadgui.py:1188 +msgid "remote" +msgstr "remoto" + +#: btdownloadgui.py:1188 +msgid "local" +msgstr "locale" + +#: btdownloadgui.py:1224 +msgid "bad peer" +msgstr "fonte errata" + +#: btdownloadgui.py:1234 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: btdownloadgui.py:1235 +#, python-format +msgid "%d bad" +msgstr "%d errato" + +#: btdownloadgui.py:1237 +msgid "banned" +msgstr "vietato" + +#: btdownloadgui.py:1239 +msgid "ok" +msgstr "ok" + +#: btdownloadgui.py:1275 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informazioni per \"%s\"" + +#: btdownloadgui.py:1293 +msgid "Torrent name:" +msgstr "Nome torrent:" + +#: btdownloadgui.py:1298 +msgid "(trackerless torrent)" +msgstr "(torrent senza tracker)" + +#: btdownloadgui.py:1301 +msgid "Announce url:" +msgstr "Url di annuncio:" + +#: btdownloadgui.py:1305 +msgid ", in one file" +msgstr ", in un file" + +#: btdownloadgui.py:1307 +#, python-format +msgid ", in %d files" +msgstr ", in %d files" + +#: btdownloadgui.py:1308 +msgid "Total size:" +msgstr "Dimensione totale:" + +#: btdownloadgui.py:1315 +msgid "Pieces:" +msgstr "Parti:" + +#: btdownloadgui.py:1317 +msgid "Info hash:" +msgstr "Informazioni hash:" + +#: btdownloadgui.py:1327 +msgid "Save in:" +msgstr "Salva in:" + +#: btdownloadgui.py:1331 +msgid "File name:" +msgstr "Nome file:" + +#: btdownloadgui.py:1357 +msgid "Open directory" +msgstr "Apri cartella" + +#: btdownloadgui.py:1363 +msgid "Show file list" +msgstr "Visualizza lista file" + +#: btdownloadgui.py:1458 +msgid "Torrent info" +msgstr "Informazioni sul torrent" + +#: btdownloadgui.py:1467 btdownloadgui.py:1890 +msgid "Remove torrent" +msgstr "Rimuovi torrent" + +#: btdownloadgui.py:1471 +msgid "Abort torrent" +msgstr "Abortisci torrent" + +#: btdownloadgui.py:1528 +#, python-format +msgid ", will seed for %s" +msgstr ", effettuerà la distribuzione della fonte completa per %s" + +#: btdownloadgui.py:1530 +msgid ", will seed indefinitely." +msgstr ", effettuerà la distribuzione della fonte completa indefinitamente." + +#: btdownloadgui.py:1533 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Completato, rapporto di condivisione: %d%%" + +#: btdownloadgui.py:1536 +#, python-format +msgid "Done, %s uploaded" +msgstr "Completato, %s inviato" + +#: btdownloadgui.py:1568 +msgid "Torrent _info" +msgstr "_Info sul torrent" + +#: btdownloadgui.py:1569 +msgid "_Open directory" +msgstr "_Apri cartella" + +#: btdownloadgui.py:1570 +msgid "_Change location" +msgstr "_Cambia posizione" + +#: btdownloadgui.py:1572 +msgid "_File list" +msgstr "Lista _file" + +#: btdownloadgui.py:1646 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Sei sicuro che vuoi rimuovere \"%s\"?" + +#: btdownloadgui.py:1649 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "il tuo rapporto di condivisione per questo torrent è %d%%. " + +#: btdownloadgui.py:1651 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Hai inviato %s a questo torrent. " + +#: btdownloadgui.py:1654 +msgid "Remove this torrent?" +msgstr "Rimuovi questo torrent?" + +#: btdownloadgui.py:1673 +msgid "Finished" +msgstr "finito" + +#: btdownloadgui.py:1674 +msgid "drag into list to seed" +msgstr "trascina nella lista per distribuire la fonte completa" + +#: btdownloadgui.py:1677 +msgid "Failed" +msgstr "Fallito" + +#: btdownloadgui.py:1678 +msgid "drag into list to resume" +msgstr "trascina nella lista per riprendere" + +#: btdownloadgui.py:1687 +msgid "Re_start" +msgstr "Ria_vvia" + +#: btdownloadgui.py:1688 btdownloadgui.py:1759 btdownloadgui.py:1795 +#: btdownloadgui.py:1900 +msgid "_Remove" +msgstr "_Rimuovi" + +#: btdownloadgui.py:1738 +msgid "Waiting" +msgstr "In attesa" + +#: btdownloadgui.py:1758 btdownloadgui.py:1794 btdownloadgui.py:1899 +msgid "_Finish" +msgstr "_Finisci" + +#: btdownloadgui.py:1761 btdownloadgui.py:1790 btdownloadgui.py:1895 +msgid "_Abort" +msgstr "_Abortisci" + +#: btdownloadgui.py:1776 +msgid "Paused" +msgstr "In pausa" + +#: btdownloadgui.py:1817 +msgid "Running" +msgstr "In esecuzione" + +#: btdownloadgui.py:1841 +#, python-format +msgid "Current up: %s" +msgstr "Corrente in uscita: %s" + +#: btdownloadgui.py:1842 +#, python-format +msgid "Current down: %s" +msgstr "Corrente in entrata: %s" + +#: btdownloadgui.py:1848 +#, python-format +msgid "Previous up: %s" +msgstr "Precedente in uscita: %s" + +#: btdownloadgui.py:1849 +#, python-format +msgid "Previous down: %s" +msgstr "Precedente in entrata: %s" + +#: btdownloadgui.py:1855 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Rapporto di condivisione: %0.02f%%" + +#: btdownloadgui.py:1858 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s fonti, %s fonti complete. Totali dal tracker: %s" + +#: btdownloadgui.py:1862 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Copie distribuite: %d; Prossima: %s" + +#: btdownloadgui.py:1865 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Parti: %d totali, %d complete, %d parziali, %d attive (%d vuote)" + +#: btdownloadgui.py:1869 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d parti errate + %s nelle richieste scartate" + +#: btdownloadgui.py:1903 +msgid "_Peer list" +msgstr "Lista _fonti" + +#: btdownloadgui.py:1962 +msgid "Done" +msgstr "Completato" + +#: btdownloadgui.py:1977 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% completato, %s rimanente" + +#: btdownloadgui.py:1985 +msgid "Download " +msgstr "Scaricati" + +#: btdownloadgui.py:1987 +msgid "Upload " +msgstr "Inviati" + +#: btdownloadgui.py:2002 +msgid "NA" +msgstr "ND" + +#: btdownloadgui.py:2343 +#, python-format +msgid "%s started" +msgstr "%s avviati" + +#: btdownloadgui.py:2356 +msgid "_Open torrent file" +msgstr "Apri _file torrent" + +#: btdownloadgui.py:2357 +msgid "Make _new torrent" +msgstr "Crea _nuovo torrent" + +#: btdownloadgui.py:2360 +msgid "_Pause/Play" +msgstr "_Pausa/Avvio" + +#: btdownloadgui.py:2362 +msgid "_Quit" +msgstr "_Esci" + +#: btdownloadgui.py:2364 +msgid "Show/Hide _finished torrents" +msgstr "Mostra/Nascondi torrents _completati" + +#: btdownloadgui.py:2366 +msgid "_Resize window to fit" +msgstr "_Ridimensiona finestra" + +#: btdownloadgui.py:2368 +msgid "_Log" +msgstr "R_egistro" + +#: btdownloadgui.py:2371 +msgid "_Settings" +msgstr "_Impostazioni" + +#: btdownloadgui.py:2374 btdownloadgui.py:2390 +msgid "_Help" +msgstr "_Aiuto" + +#: btdownloadgui.py:2376 +msgid "_About" +msgstr "_Informazioni su" + +#: btdownloadgui.py:2377 +msgid "_Donate" +msgstr "_Donazione" + +#: btdownloadgui.py:2381 +msgid "_File" +msgstr "_File" + +#: btdownloadgui.py:2386 +msgid "_View" +msgstr "_Visualizza" + +#: btdownloadgui.py:2533 +msgid "(stopped)" +msgstr "(fermato)" + +#: btdownloadgui.py:2545 +msgid "(multiple)" +msgstr "(multiplo)" + +#: btdownloadgui.py:2659 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s l'aiuto è qui \n" +"%s\n" +"Vuoi andarci ora?" + +#: btdownloadgui.py:2662 +msgid "Visit help web page?" +msgstr "Vuoi visitare la pagina di aiuto sul web?" + +#: btdownloadgui.py:2698 +msgid "There is one finished torrent in the list. " +msgstr "C'è un torrent completato nella lista." + +#: btdownloadgui.py:2699 +msgid "Do you want to remove it?" +msgstr "Vuoi rimuoverlo?" + +#: btdownloadgui.py:2701 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Ci sono %d torrents completati nella lista." + +#: btdownloadgui.py:2702 +msgid "Do you want to remove all of them?" +msgstr "Vuoi rimuoverli tutti?" + +#: btdownloadgui.py:2704 +msgid "Remove all finished torrents?" +msgstr "Rimuovere tutti i torrent completati?" + +#: btdownloadgui.py:2711 +msgid "No finished torrents" +msgstr "Nessun torrent completato." + +#: btdownloadgui.py:2712 +msgid "There are no finished torrents to remove." +msgstr "non ci sono torrents completati da rimuovere." + +#: btdownloadgui.py:2756 +msgid "Open torrent:" +msgstr "Apri torrent:" + +#: btdownloadgui.py:2789 +msgid "Change save location for " +msgstr "Cambia posizione di salvataggio per" + +#: btdownloadgui.py:2815 +msgid "File exists!" +msgstr "File già esistente!" + +#: btdownloadgui.py:2816 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" già esistente. Vuoi scegliere un nome file differente?" + +#: btdownloadgui.py:2834 +msgid "Save location for " +msgstr "Posizione di salvataggio per" + +#: btdownloadgui.py:2944 +#, python-format +msgid "(global message) : %s" +msgstr "(messaggio globale) : %s" + +#: btdownloadgui.py:2951 +#, python-format +msgid "%s Error" +msgstr "%s Errore" + +#: btdownloadgui.py:2957 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Sono occorsi errori multipli. Clicca OK per vedere il registro errori." + +#: btdownloadgui.py:3087 +msgid "Stop running torrent?" +msgstr "Vuoi fermare il torrent in esecuzione?" + +#: btdownloadgui.py:3088 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "Stai per avviare \"%s\". Vuoi fermare l'ultimo torrent in esecuzione?" + +#: btdownloadgui.py:3098 +msgid "Have you donated?" +msgstr "Hai già donato?" + +#: btdownloadgui.py:3099 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Benvenuto alla nuova versione di %s. Hai già donato?" + +#: btdownloadgui.py:3113 +msgid "Thanks!" +msgstr "Grazie!" + +#: btdownloadgui.py:3114 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Grazie per aver donato! Per donare ancora, seleziona \"Donazione\" dal menù " +"\"Aiuto\"." + +#: btdownloadgui.py:3143 +msgid "Can't have both --responsefile and non-option arguments" +msgstr "" +"Non è possibile usare entrambi -responsefile ed argomenti senza opzioni." + +#: btdownloadgui.py:3173 +msgid "Temporary Internet Files" +msgstr "Files Temporanei Internet" + +#: btdownloadgui.py:3174 +#, python-format +msgid "" +"Could not read %s: %s. You are probably using a broken Internet Explorer " +"version that passed BitTorrent a filename that doesn't exist. To work around " +"the problem, try clearing your Temporary Internet Files or right-click the " +"link and save the .torrent file to disk first." +msgstr "" +"Impossibile leggere %s: %s. Stai probabilmente usando una versione errata di " +"Internet Explorer che ha passato a BitTorrent un nome di file che non " +"esiste. Per aggirare il problema, prova ad eliminare i tuoi Files Temporanei " +"Internet o clicca col tasto destro del mouse sul link e salva prima il file ." +"torrent sul disco." + +#: btdownloadgui.py:3197 +#, python-format +msgid "%s already running" +msgstr "%s già in esecuzione" + +#: btdownloadheadless.py:137 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d conosciuti, più %d copie distribuite (%s)" + +#: btdownloadheadless.py:144 +#, python-format +msgid "%d seen now" +msgstr "%d conosciuti" + +#: btdownloadheadless.py:147 +msgid "ERROR:\n" +msgstr "ERRORE:\n" + +#: btdownloadheadless.py:148 +msgid "saving: " +msgstr "sto salvando:" + +#: btdownloadheadless.py:149 +msgid "percent done: " +msgstr "percentuale completata:" + +#: btdownloadheadless.py:150 +msgid "time left: " +msgstr "tempo rimasto:" + +#: btdownloadheadless.py:151 +msgid "download to: " +msgstr "scarica su:" + +#: btdownloadheadless.py:152 +msgid "download rate: " +msgstr "tasso di scaricamento:" + +#: btdownloadheadless.py:153 +msgid "upload rate: " +msgstr "tasso di invio:" + +#: btdownloadheadless.py:154 +msgid "share rating: " +msgstr "punteggio di condivisione" + +#: btdownloadheadless.py:155 +msgid "seed status: " +msgstr "stato fonti complete:" + +#: btdownloadheadless.py:156 +msgid "peer status: " +msgstr "stato fonti:" + +#: btlaunchmanycurses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tempo rimasto %d:%02d:%02d" + +#: btlaunchmanycurses.py:143 +msgid "Size" +msgstr "Dimensione" + +#: btlaunchmanycurses.py:144 +msgid "Download" +msgstr "Scaricato" + +#: btlaunchmanycurses.py:145 +msgid "Upload" +msgstr "Inviato" + +#: btlaunchmanycurses.py:146 btlaunchmanycurses.py:239 +msgid "Totals:" +msgstr "Totali:" + +#: btlaunchmanycurses.py:205 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s up %s dn" +msgstr " (%s) %s - %s fonti %s fonti complete %s copie dist - %s inv %s sca" + +#: btlaunchmanycurses.py:227 btlaunchmany.py:35 +msgid "no torrents" +msgstr "nessun torrent" + +#: btlaunchmanycurses.py:265 btlaunchmany.py:49 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERRORE DI SISTEMA - GENERATA ECCEZIONE" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid "Warning: " +msgstr "Avviso:" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid " is not a directory" +msgstr " non è una cartella" + +#: btlaunchmanycurses.py:287 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"eseguire senza argomenti per la spiegazione dei parametri" + +#: btlaunchmanycurses.py:292 btlaunchmany.py:71 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"ECCEZIONE:" + +#: btlaunchmany.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"errore: %s\n" +"eseguire senza argomenti per la spiegazione dei parametri" + +#: btmaketorrentgui.py:55 +#, python-format +msgid "%s metafile creator %s" +msgstr "%s creatore metafile %s" + +#: btmaketorrentgui.py:73 +msgid "" +"Make .torrent metafiles for these files/directories:\n" +"(Directories will become batch torrents)" +msgstr "" +"Crea metafiles .torrent per quei files/cartelle:\n" +"(Le cartelle diverranno torrents batch)" + +#: btmaketorrentgui.py:88 +msgid "_Files/directories" +msgstr "_Files/cartelle" + +#: btmaketorrentgui.py:118 +msgid "Piece size:" +msgstr "Dimensione parte:" + +#: btmaketorrentgui.py:135 +msgid "Use _tracker:" +msgstr "Usa _tracker:" + +#: btmaketorrentgui.py:165 +msgid "Use _DHT" +msgstr "Usa _DHT" + +#: btmaketorrentgui.py:171 +msgid "Nodes (optional):" +msgstr "Nodi (opzionale):" + +#: btmaketorrentgui.py:203 +msgid "Comments:" +msgstr "Commenti:" + +#: btmaketorrentgui.py:232 +msgid "Make" +msgstr "Crea" + +#: btmaketorrentgui.py:405 +msgid "_Host" +msgstr "_Host" + +#: btmaketorrentgui.py:412 +msgid "_Port" +msgstr "_Porta" + +#: btmaketorrentgui.py:505 +msgid "Building torrents..." +msgstr "Creazione torrents..." + +#: btmaketorrentgui.py:513 +msgid "Checking file sizes..." +msgstr "Controllo dimensioni file..." + +#: btmaketorrentgui.py:531 +msgid "Start seeding" +msgstr "Inizio distribuzione fonte completa" + +#: btmaketorrentgui.py:551 +msgid "building " +msgstr "creazione" + +#: btmaketorrentgui.py:571 +msgid "Done." +msgstr "Completato." + +#: btmaketorrentgui.py:572 +msgid "Done building torrents." +msgstr "Creazione torrents completata." + +#: btmaketorrentgui.py:580 +msgid "Error!" +msgstr "Errore!" + +#: btmaketorrentgui.py:581 +msgid "Error building torrents: " +msgstr "Errore nella creazione dei torrents:" + +#: btmaketorrent.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "commento leggibile-dagli-umani opzionale da mettere nel .torrent" + +#: btmaketorrent.py:31 +msgid "optional target file for the torrent" +msgstr "file di destinazione opzionale per il torrent" + +#: btreannounce.py:22 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Utilizzo: %s URL_TRACKER [FILETORRENT [FILETORRENT ... ] ]" + +#: btreannounce.py:31 +#, python-format +msgid "old announce for %s: %s" +msgstr "annuncio vecchio per %s: %s" + +#: btrename.py:26 +#, python-format +msgid "%s %s - change the suggested filename in a .torrent file" +msgstr "%s %s - cambia il nome del file consigliato in un file .torrent" + +#: btrename.py:31 +#, python-format +msgid "Usage: %s TORRENTFILE NEW_FILE_NAME" +msgstr "Utilizzo: %s FILETORRENT NUOVO_NOME_FILE" + +#: btrename.py:38 +#, python-format +msgid "old filename: %s" +msgstr "vecchio nome file: %s" + +#: btrename.py:40 +#, python-format +msgid "new filename: %s" +msgstr "nuovo nome file: %s" + +#: btrename.py:45 +msgid "done." +msgstr "completato." + +#: btshowmetainfo.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodifica %s files metainfo" + +#: btshowmetainfo.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Utilizzo: %s [FILETORRENT [FILETORRENT ... ] ]" + +#: btshowmetainfo.py:42 +#, python-format +msgid "metainfo file.: %s" +msgstr "file metainfo.: %s" + +#: btshowmetainfo.py:43 +#, python-format +msgid "info hash.....: %s" +msgstr "informazioni hash.....: %s" + +#: btshowmetainfo.py:47 +#, python-format +msgid "file name.....: %s" +msgstr "nome file.....: %s" + +#: btshowmetainfo.py:49 +msgid "file size.....:" +msgstr "dimensione file.....:" + +#: btshowmetainfo.py:52 +#, python-format +msgid "directory name: %s" +msgstr "nome cartella: %s" + +#: btshowmetainfo.py:53 +msgid "files.........: " +msgstr "files.........: " + +#: btshowmetainfo.py:63 +msgid "archive size..:" +msgstr "dimensione archivio..:" + +#: btshowmetainfo.py:67 +#, python-format +msgid "announce url..: %s" +msgstr "url di annuncio..: %s" + +#: btshowmetainfo.py:68 +msgid "comment.......: \n" +msgstr "commento.......: \n" + +#~ msgid "Choose existing folder" +#~ msgstr "Scegli una cartella esistente" + +#~ msgid "Create new folder" +#~ msgstr "Crea una nuova cartella" diff --git a/btlocale/no/LC_MESSAGES/bittorrent.mo b/btlocale/no/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..bbad0e867548b2cfcca33241e37b8989791fc85a GIT binary patch literal 55054 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 eOJPDrcSS_0e{x%2*rtG0\n" +"Language-Team: Einangen \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Norwegian Bokmal\n" +"X-Poedit-Country: NORWAY\n" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Dette ser ut til å være en gammel Pythonversjon, som ikke støtter oppdagelse " +"av filsystemkoding. Antar 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python kunne ikke filsystemkodingen automatisk. Bruker 'ascii' i stedet." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Filsystemkoding '%s' støttes ikke. Bruker 'ascii' i stedet." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Feil i del av filstien:" + +#: BitTorrent/ConvertedMetainfo.py:188 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy og har uriktig " +"kodede filnavn. Noen eller alle filnavnene kan være forskjellige fra det " +"personen som laget .torrentfilen har ment." + +#: BitTorrent/ConvertedMetainfo.py:194 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy, og har " +"tegnverdier som ikke tilsvarer virkelige tegn. Noen eller alle filnavnene " +"kan være forskjellig fra det personen som laget den har ment." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy og har feilkodede " +"filnavn. Navnene kan fortsatt være riktige." + +#: BitTorrent/ConvertedMetainfo.py:206 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Tegnsettet i det lokale filsystemet (\"%s\") kan ikke vise alle tegn brukt i " +"filnavnet/ene i denne torrenten. Filnavnene har blitt endret fra originalen." + +#: BitTorrent/ConvertedMetainfo.py:212 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows sitt filsystem kan ikke håndtere noen av tegnene i filnavnet/ene i " +"denne torrenten. Filnavn har blitt endret fra originalen." + +#: BitTorrent/ConvertedMetainfo.py:217 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy, og har minst en " +"fil eller en mappe med ugyldig navn, men ettersom alle slike filer har " +"størrelse 0, er disse ignorert." + +#: BitTorrent/Encoder.py:173 +msgid "Can't start two separate instances of the same torrent" +msgstr "Kan ikke starte to instanser av samme torrent" + +#: BitTorrent/GUI.py:149 +#, python-format +msgid "%d days" +msgstr "%d dager" + +#: BitTorrent/GUI.py:151 +#, python-format +msgid "1 day %d hours" +msgstr "1 dag %d timer" + +#: BitTorrent/GUI.py:153 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d timer" + +#: BitTorrent/GUI.py:155 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutter" + +#: BitTorrent/GUI.py:157 +#, python-format +msgid "%d seconds" +msgstr "%d sekunder" + +#: BitTorrent/GUI.py:159 +msgid "0 seconds" +msgstr "0 sekunder" + +#: BitTorrent/GUI.py:201 +#, python-format +msgid "%s Help" +msgstr "%s Hjelp" + +#: BitTorrent/GUI.py:208 +msgid "Frequently Asked Questions:" +msgstr "Ofte Stilte Spørsmål (FAQ/OSS):" + +#: BitTorrent/GUI.py:213 +msgid "Go" +msgstr "Start" + +#: BitTorrent/GUI.py:434 BitTorrent/GUI.py:486 +msgid "Choose an existing folder..." +msgstr "" + +#: BitTorrent/GUI.py:444 +msgid "All Files" +msgstr "Alle filer" + +#: BitTorrent/GUI.py:449 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:483 +msgid "Create a new folder..." +msgstr "" + +#: BitTorrent/GUI.py:545 +msgid "Select file" +msgstr "Velg fil" + +#: BitTorrent/GUI.py:546 +msgid "Select folder" +msgstr "Velg mappe" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Mon" +msgstr "Man" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Tue" +msgstr "Tir" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Wed" +msgstr "Ons" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Thu" +msgstr "Tor" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Fri" +msgstr "Fre" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sat" +msgstr "Lør" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sun" +msgstr "Søn" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:22 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Aug" +msgstr "Aug" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Oct" +msgstr "Okt" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Dec" +msgstr "Des" + +#: BitTorrent/HTTPHandler.py:83 +msgid "Got Accept-Encoding: " +msgstr "Fikk aksept-koding:" + +#: BitTorrent/HTTPHandler.py:125 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Komprimert: %i Ukomprimert: %i\n" + +#: BitTorrent/RawServer.py:273 +msgid "lost server socket" +msgstr "mistet tjenertilkobling" + +#: BitTorrent/RawServer.py:289 +msgid "Error handling accepted connection: " +msgstr "Feil ved håndtering av akseptert forbindelse:" + +#: BitTorrent/RawServer.py:371 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Må avslutte fordi TCPforbindelsen svikter (TCP stack flaking out). " +"Vennligst se FAQ/OSS under %s" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Sporers annonsering er fortsatt ikke ferdig %d sekunder etter start" + +#: BitTorrent/Rerequester.py:172 +msgid "Problem connecting to tracker - " +msgstr "Problem med å koble til sporer - " + +#: BitTorrent/Rerequester.py:199 +msgid "bad data from tracker - " +msgstr "Feil i data fra sporer - " + +#: BitTorrent/Rerequester.py:210 +msgid "rejected by tracker - " +msgstr "Avvist av sporer - " + +#: BitTorrent/Rerequester.py:216 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Avslutter torrent, ettersom den ble avvist av sporeren uten å ha blitt " +"koblet til noen annen klient." + +#: BitTorrent/Rerequester.py:218 +msgid " Message from the tracker: " +msgstr " Beskjed fra sporer: " + +#: BitTorrent/Rerequester.py:224 +msgid "warning from tracker - " +msgstr "advarsel fra sporer: - " + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Filen %s hører til en annen kjørende torrent" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Filen %s eksisterer, men er ikke en vanlig fil" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lite data - Noe har forkortet filene?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "Ukjent hurtigfortsettelsesformat. Kanskje en annen klientversjon?" + +#: BitTorrent/Storage.py:240 +msgid "Fastresume info doesn't match file modification time" +msgstr "" +"Hurtigfortsettelsesinformasjon passer ikke med tidsstempelet for " +"filmodifisering" + +#: BitTorrent/Storage.py:243 +msgid "Fastresume data doesn't match actual filesize" +msgstr "Data for hurtigfortsettelse stemmer ikke med faktisk filstørrelse" + +#: BitTorrent/Storage.py:257 BitTorrent/StorageWrapper.py:284 +msgid "Couldn't read fastresume data: " +msgstr "Kunne ikke lese hurtigfortsettelsesdata:" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "Feil data i responsfil - totalen for liten" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "Feil data i responsfil - totalen for stor" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "sjekker eksisterende fil" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 eller hurtigfortsettelsesinfo stemmer ikke med filtilstand " +"(Data mangler)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Hurtigfortsettelsesinfo stemmer ikke (filen inneholder mer data)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Hurtigfortsettelsesinfo stemmer ikke (ugyldig verdi)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "Data ødelagt på disken - kjører du to kopier?" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"Ga beskjed om komplett fil ved oppstart, men delen feilet hash-kontrollen" + +#: BitTorrent/TorrentQueue.py:120 +msgid "Could not load saved state: " +msgstr "Kunne ikke lese lagret status:" + +#: BitTorrent/TorrentQueue.py:160 +msgid "Version check failed: no DNS library" +msgstr "Versjonssjekk feilet: mangler DNSbibliotek" + +#: BitTorrent/TorrentQueue.py:177 +msgid "DNS query failed" +msgstr "DNSforespørsel feilet" + +#: BitTorrent/TorrentQueue.py:179 +msgid "number of received TXT fields is not 1" +msgstr "Antall mottatte TXTfelt er ikke 1" + +#: BitTorrent/TorrentQueue.py:182 +msgid "number of strings in reply is not 1?" +msgstr "Antall strenger i svaret er ikke 1?" + +#: BitTorrent/TorrentQueue.py:192 +msgid "Could not parse new version string" +msgstr "Kunne ikke forstå den nye versjonsstrengen" + +#: BitTorrent/TorrentQueue.py:202 +#, python-format +msgid "" +"A newer version of BitTorrent is available.\n" +"You can always get the latest version from\n" +"%s." +msgstr "" +"En nyere versjon av BitTorrent er tilgjengelig.\n" +"Du kan alltid finne den siste versjonen på\n" +"%s." + +#: BitTorrent/TorrentQueue.py:207 +msgid "Version check failed: " +msgstr "Versjonskontroll feilet:" + +#: BitTorrent/TorrentQueue.py:244 +msgid "Could not save UI state: " +msgstr "Kunne ikke lagre grensesnittets tilstand:" + +#: BitTorrent/TorrentQueue.py:254 BitTorrent/TorrentQueue.py:256 +#: BitTorrent/TorrentQueue.py:329 BitTorrent/TorrentQueue.py:332 +#: BitTorrent/TorrentQueue.py:342 BitTorrent/TorrentQueue.py:354 +#: BitTorrent/TorrentQueue.py:371 +msgid "Invalid state file contents" +msgstr "Ugyldig innhold i tilstandsfilen" + +#: BitTorrent/TorrentQueue.py:269 +msgid "Error reading file " +msgstr "Kan ikke lese filen" + +#: BitTorrent/TorrentQueue.py:271 +msgid "cannot restore state completely" +msgstr "Kan ikke gjennopprette tilstanden fullstendig" + +#: BitTorrent/TorrentQueue.py:274 +msgid "Invalid state file (duplicate entry)" +msgstr "Ugyldig tilstandsfil (Dobbel instans)" + +#: BitTorrent/TorrentQueue.py:280 BitTorrent/TorrentQueue.py:285 +msgid "Corrupt data in " +msgstr "Ødelagt data i " + +#: BitTorrent/TorrentQueue.py:281 BitTorrent/TorrentQueue.py:286 +msgid " , cannot restore torrent (" +msgstr ", kan ikke gjenopprette torrent (" + +#: BitTorrent/TorrentQueue.py:300 +msgid "Invalid state file (bad entry)" +msgstr "Ugyldig tilstandsfil (Ugyldig instans)" + +#: BitTorrent/TorrentQueue.py:319 +msgid "Bad UI state file" +msgstr "Ugyldig tilstandsfil for grensesnitt" + +#: BitTorrent/TorrentQueue.py:323 +msgid "Bad UI state file version" +msgstr "Ugyldig versjon på tilstandsfilen for grensesnitt" + +#: BitTorrent/TorrentQueue.py:325 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Ikke støttet versjon av tilstandsfil for grensesnitt (fra nyere " +"klientversjon?)" + +#: BitTorrent/TorrentQueue.py:496 +msgid "Could not delete cached metainfo file:" +msgstr "Kunne ikke slette cachet metainfofil:" + +#: BitTorrent/TorrentQueue.py:519 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Dette er ikke en gyldig .torrentfil. (%s)" + +#: BitTorrent/TorrentQueue.py:527 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Denne torrenten (eller en med likt innhold) kjører allerede." + +#: BitTorrent/TorrentQueue.py:531 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Denne torrenten (eller en med likt innhold) venter allerede på å kjøre." + +#: BitTorrent/TorrentQueue.py:538 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrenten er i en ukjent tilstand %d" + +#: BitTorrent/TorrentQueue.py:555 +msgid "Could not write file " +msgstr "Kunne ikke skrive filen " + +#: BitTorrent/TorrentQueue.py:557 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"Torrenten vil ikke bli korrekt gjenopprettet ved neste oppstart av klienten" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Kan ikke kjøre mer enn %d torrents samtidig. For mer informasjon, se FAQ/OSS " +"under %s." + +#: BitTorrent/TorrentQueue.py:758 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Starter ikke torrenten, ettersom det er andre torrents som venter på å " +"starte, og denne oppfyller allerede kriteriene for når den skal slutte å så " +"frø." + +#: BitTorrent/TorrentQueue.py:764 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Starter ikke torrenten, ettersom den allerede oppfyller kriteriene for når " +"den siste torrenten skal slutte å så frø." + +#: BitTorrent/__init__.py:20 +msgid "Python 2.2.1 or newer required" +msgstr "Krever Python 2.2.1 eller nyere" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "ikke en gyldig bkodet streng" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "ugyldig bkodet verdi (data etter gyldig prefiks)" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "feil i metainfo - ikke en mappe" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "feil i metainfo - feil (fil)del-nøkkel" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "feil i metainfo - ulovlig dellengde" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "feil i metainfo - ugyldig navn" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "navnet %s er ikke tillatt av sikkerhetsmessige årsaker" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "blanding av enkeltfiler og flere filer" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "feil i metainfo - ugyldig lengde" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "feil i metainfo - \"files\" er ikke en filliste" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "feil i metainfo - ugyldig filverdi" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "feil i metainfo - ugyldig sti" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "feil i metainfo - ugyldig sti til mappe" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "stien %s er ikke tillat av sikkerhetsmessige årsaker" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "feil i metainfo - dobbel sti" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "feil i metainfo - navnet er brukt både som fil og undermappenavn" + +#: BitTorrent/btformats.py:78 +msgid "bad metainfo - wrong object type" +msgstr "feil i metainfo - feil objekttype" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "feil i metainfo - ingen annonseringsURL" + +#: BitTorrent/btformats.py:88 +msgid "non-text failure reason" +msgstr "ikketekstlig feilårsak" + +#: BitTorrent/btformats.py:92 +msgid "non-text warning message" +msgstr "ikketekstlig advarsel" + +#: BitTorrent/btformats.py:97 +msgid "invalid entry in peer list1" +msgstr "ugyldig forekomst i klientliste 1" + +#: BitTorrent/btformats.py:99 +msgid "invalid entry in peer list2" +msgstr "ugyldig forekomst i klientliste 2" + +#: BitTorrent/btformats.py:102 +msgid "invalid entry in peer list3" +msgstr "ugyldig forekomst i klientliste 3" + +#: BitTorrent/btformats.py:106 +msgid "invalid entry in peer list4" +msgstr "ugyldig forekomst i klientliste 4" + +#: BitTorrent/btformats.py:108 +msgid "invalid peer list" +msgstr "Ugyldig klientliste" + +#: BitTorrent/btformats.py:111 +msgid "invalid announce interval" +msgstr "ugyldig annonseringsintervall" + +#: BitTorrent/btformats.py:114 +msgid "invalid min announce interval" +msgstr "ugyldig minste annonseringsintervall" + +#: BitTorrent/btformats.py:116 +msgid "invalid tracker id" +msgstr "ugyldig sporerID" + +#: BitTorrent/btformats.py:119 +msgid "invalid peer count" +msgstr "Ugyldig antall klienter" + +#: BitTorrent/btformats.py:122 +msgid "invalid seed count" +msgstr "Ygyldig antall frø" + +#: BitTorrent/btformats.py:125 +msgid "invalid \"last\" entry" +msgstr "ugyldig \"siste\"-verdi" + +#: BitTorrent/configfile.py:125 +msgid "Could not permanently save options: " +msgstr "Kunne ikke lagre oppsett permanent" + +#: BitTorrent/controlsocket.py:108 BitTorrent/controlsocket.py:157 +msgid "Could not create control socket: " +msgstr "Kunne ikke opprette kontrollforbindelse" + +#: BitTorrent/controlsocket.py:116 BitTorrent/controlsocket.py:134 +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:187 +msgid "Could not send command: " +msgstr "Kunne ikke sende komando: " + +#: BitTorrent/controlsocket.py:144 +msgid "Could not create control socket: already in use" +msgstr "Kunne ikke opprette kontrollforbindelse: allerede i bruk" + +#: BitTorrent/controlsocket.py:149 +msgid "Could not remove old control socket filename:" +msgstr "Kunne ikke fjerne filnavnet for den gamle kontrollforbindelsen" + +#: BitTorrent/defaultargs.py:32 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"Mappe hvor variable data som hurtigfortsettelsesinformasjon og " +"brukergrensesnitttilstand er lagret. Standard er undermappen 'data' i " +"bittorrents konfigurasjonsmappe." + +#: BitTorrent/defaultargs.py:36 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"Tegnkoding brukt på det lokale filsystemet. Hvis tom, automatisk. " +"Automatikk fungerer ikke i Pythonversjoner eldre enn 2.3." + +#: BitTorrent/defaultargs.py:40 +msgid "ISO Language code to use" +msgstr "" + +#: BitTorrent/defaultargs.py:45 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IPadresse å rapportere til sporeren (har ingen effekt hvis du ikke er på " +"samme lokale nettverk som sporeren)" + +#: BitTorrent/defaultargs.py:48 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"Portnummer synlig utenfra hvis det er forskjellig fra det klienten lokalt " +"lytter på." + +#: BitTorrent/defaultargs.py:51 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "laveste port å lytte på, teller oppover hvis utilgjengelig" + +#: BitTorrent/defaultargs.py:53 +msgid "maximum port to listen on" +msgstr "øverste port å lytte på" + +#: BitTorrent/defaultargs.py:55 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "lokal IP å binde til" + +#: BitTorrent/defaultargs.py:57 +msgid "seconds between updates of displayed information" +msgstr "sekunder mellom oppdateringer av vist informasjon" + +#: BitTorrent/defaultargs.py:59 +msgid "minutes to wait between requesting more peers" +msgstr "minutter å vente mellom hver gang flere klienter etterspørres" + +#: BitTorrent/defaultargs.py:61 +msgid "minimum number of peers to not do rerequesting" +msgstr "minste antall klienter for ikke å spørre igjen" + +#: BitTorrent/defaultargs.py:63 +msgid "number of peers at which to stop initiating new connections" +msgstr "Antall klienter før nye tilkoblinger ikke startes." + +#: BitTorrent/defaultargs.py:65 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"Maksimalt antall tilkoblinger tillatt, etter dette blir nye innkommende " +"tilkoblinger stengt med en gang." + +#: BitTorrent/defaultargs.py:68 +msgid "whether to check hashes on disk" +msgstr "Kontroller hasher på disk eller ikke" + +#: BitTorrent/defaultargs.py:70 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "Maks. kB/s å laste opp med, 0 betyr ingen grense" + +#: BitTorrent/defaultargs.py:72 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" +"Antall opplastinger å fylle opp til med ekstra optimistiske metoder for å " +"unngå overbelastning" + +#: BitTorrent/defaultargs.py:74 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"største antall filer i en flerfilstorrent som kan holdes åpne samtidig, 0 " +"betyr ingen grense. Brukt for å unngå å gå tom for filedeskriptorer." + +#: BitTorrent/defaultargs.py:81 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"antall sekunder mellom hver gang et signal for å holde i live forbindelsen " +"sendes ut." + +#: BitTorrent/defaultargs.py:83 +msgid "how many bytes to query for per request." +msgstr "Hvor mange tegn å spørre etter i hver forespørsel." + +#: BitTorrent/defaultargs.py:85 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"største lengde på prefiks for koding du vil akseptere utenfra - større " +"verdier fører til at forbindelsen forkastes." + +#: BitTorrent/defaultargs.py:88 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "sekunder å vente før forbindelser ingenting er mottatt på stenges" + +#: BitTorrent/defaultargs.py:91 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "sekunder å vente mellom hver sjekk etter forbindelser utgått på dato" + +#: BitTorrent/defaultargs.py:93 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maksimal størrelse på biter å sende til klienter, steng forbindelsen hvis en " +"større forspørsel kommer" + +#: BitTorrent/defaultargs.py:96 BitTorrent/defaultargs.py:98 +msgid "maximum amount of time to guess the current rate estimate represents" +msgstr "lengste tid å gjette at nåværende nedlastingshastighet representerer" + +#: BitTorrent/defaultargs.py:100 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "maksimal tid å vente mellom hver annonsering hvis de stadig feiler" + +#: BitTorrent/defaultargs.py:102 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"sekunder å vente på innkommende data over en forbindelse før man kan anta at " +"den er delvis permanent overbelastet." + +#: BitTorrent/defaultargs.py:105 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"antall nedlastinger før programmet endrer fra å velge tilfeldig nedlasting å " +"begynne på til å velge den sjeldneste først" + +#: BitTorrent/defaultargs.py:107 +msgid "how many bytes to write into network buffers at once." +msgstr "hvor mange tegn skal skrives til nettverksbuffere på en gang?" + +#: BitTorrent/defaultargs.py:109 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"avslå flere forbindelser fra adresser med ødelagte eller med vilje " +"fiendtlige klienter som sender ukorrekt data" + +#: BitTorrent/defaultargs.py:112 +msgid "do not connect to several peers that have the same IP address" +msgstr "ikke koble til flere klienter som har samme IPadresse" + +#: BitTorrent/defaultargs.py:114 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "hvis ikke null, sett TOS for klientforbindelser til denne verdien" + +#: BitTorrent/defaultargs.py:116 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"aktiver en omvei rundt en feil i BSD libc som gjør fillesing veldig tregt." + +#: BitTorrent/defaultargs.py:118 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adresse til en HTTPmellomtjener for sporerforbindelser" + +#: BitTorrent/defaultargs.py:120 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "steng forbindelser med RST og unngå TCP TIME_WAITtilstanden" + +#: BitTorrent/defaultargs.py:122 +msgid "force max_allow_in to stay below 30 on Win32" +msgstr "tving max_allow_in under 30 på Win32" + +#: BitTorrent/defaultargs.py:139 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"Filnavn (for enkeltfiltorrents) eller mappenavn (for flerfilstorrents) å " +"lagre torrenten som. Overkjører standardnavnet i torrenten. Se også --" +"save_in. Hvis ingen av dem er spesifisert, blir brukeren spurt om " +"lagringssted." + +#: BitTorrent/defaultargs.py:144 +msgid "display advanced user interface" +msgstr "Vis avansert brukergrensesnitt" + +#: BitTorrent/defaultargs.py:146 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"største antall minutter å så frø til en ferdig torrent før den stopper." + +#: BitTorrent/defaultargs.py:149 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"minste opp-/nedlastingsforhold, i prosent, å oppnå før frøsåing stopper. 0 " +"betyr ingen grense." + +#: BitTorrent/defaultargs.py:152 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"minste opp-/nedlastingsforhold, i prosent, å oppnå før frøsåing for siste " +"torrent stopper. 0 betyr ingen grense." + +#: BitTorrent/defaultargs.py:155 +msgid "start downloader in paused state" +msgstr "start nedlasting i pauset tilstand" + +#: BitTorrent/defaultargs.py:157 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"Spesifiserer hvordan applikasjonen skal oppføre seg når brukeren manuelt " +"prøver å starte en annen torrent: \"replace\" betyr alltid å erstatte den " +"kjørende torrenten med en ny, \"add\" betyr alltid legg til den kjørende " +"torrenten i parallell, og \"ask\" betyr spør brukeren hver gang." + +#: BitTorrent/defaultargs.py:171 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"Filnavn (for enkelttorrents) eller mappenavn (for flere torrents) å lagre " +"torrenten som, overkjører standardnavnet i torrenten. Se også --save_in" + +#: BitTorrent/defaultargs.py:178 BitTorrent/defaultargs.py:198 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at once." +msgstr "" +"Maksimum antall opplastinger tillatt samtidig. -1 betyr et " +"(forhåpentligvis) fornuftig antall, basert på --max_upload_rate. " +"Automatiske verdier gir bare mening for en torrent om gangen." + +#: BitTorrent/defaultargs.py:183 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"Lokal mappe hvor torrentens innhold blir lagret. Filen (enkeltfiltorrents) " +"eller mappen (flere torrents) vil bli laget i denne mappen med " +"standardnavnet spesifisert i .torrentfilen. Se også --save_as." + +#: BitTorrent/defaultargs.py:188 +msgid "file the server response was stored in, alternative to url" +msgstr "Filen tjenersvaret ble lagret i, alternativ til URL." + +#: BitTorrent/defaultargs.py:190 +msgid "url to get file from, alternative to responsefile" +msgstr "URL å hente fil fra, alternativ til svarfil" + +#: BitTorrent/defaultargs.py:192 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "Spør etter sted å lagre nedlastede filer i eller ikke" + +#: BitTorrent/defaultargs.py:203 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"Lokal mappe hvor torrentene vil bli lagret, navn bestemt av --saveas_style. " +"Hvis denne er tom, vil hver torrent bli lagret under mappen til den " +"tilsvarende .torrentfilen." + +#: BitTorrent/defaultargs.py:208 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "Hvor ofte skal torrentmappen sjekkes, i sekunder" + +#: BitTorrent/defaultargs.py:210 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Hvordan skal torrentnedlastinger navngis: 1: bruk navnet PÅ torrentfilen " +"(uten .torrent); 2: bruk navnet spesifisert I torrentfilen; 3: lag en mappe " +"med navnet PÅ torrentfilen (uten .torrent) og lagre filene i den mappen med " +"navn spesifisert I torrentfilen; 4: hvis navn PÅ torrentfilen (uten ." +"torrent) og navnet spesifisert I torrentfilen er identiske, bruk det navnet " +"(punkt 1/2), ellers lag en midlertidig mappe som i punkt 3; ADVARSEL: valg " +"1 og 2 kan skrive over filer uten advarsel, og kan føre til " +"sikkerhetsproblemer." + +#: BitTorrent/defaultargs.py:225 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "Vis full sti eller innholdet i torrenten for hver torrent" + +#: BitTorrent/defaultargs.py:232 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "mappe å se etter .torrentfiler i (delvis rekursiv)" + +#: BitTorrent/defaultargs.py:237 +msgid "whether to display diagnostic info to stdout" +msgstr "vis diagnostisk info til stdout eller ikke" + +#: BitTorrent/defaultargs.py:242 +msgid "which power of two to set the piece size to" +msgstr "hvilken toerpotens skal delens størrelse settes til" + +#: BitTorrent/defaultargs.py:244 +msgid "default tracker name" +msgstr "standard sporernavn" + +#: BitTorrent/defaultargs.py:247 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"hvis usann, lag en sporerløs torrent, i stedet for annonseringsURL, bruk en " +"pålitelig node i form av : eller en tom streng for å hente ut noen " +"noder fra rutingtabellen din" + +#: BitTorrent/download.py:92 +msgid "maxport less than minport - no ports to check" +msgstr "øverste port er lavere enn laveste port - ingen porter å sjekke" + +#: BitTorrent/download.py:104 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Kunne ikke åpne port å lytte på: %s." + +#: BitTorrent/download.py:106 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Kunne ikke åpne port å lytte på: %s." + +#: BitTorrent/download.py:108 +msgid "Check your port range settings." +msgstr "Sjekk portintervall-innstillingene." + +#: BitTorrent/download.py:212 +msgid "Initial startup" +msgstr "Første oppstart" + +#: BitTorrent/download.py:264 +#, python-format +msgid "Could not load fastresume data: %s. " +msgstr "Kunne ikke laste inn hurtigfortsettelsesdata: %s." + +#: BitTorrent/download.py:265 +msgid "Will perform full hash check." +msgstr "Vil foreta full hash-kontroll." + +#: BitTorrent/download.py:272 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "del %d feilet hash-kontroll, henter ned på nytt" + +#: BitTorrent/download.py:383 BitTorrent/launchmanycore.py:139 +msgid "downloading" +msgstr "laster ned" + +#: BitTorrent/download.py:393 +msgid "download failed: " +msgstr "nedlasting feilet:" + +#: BitTorrent/download.py:397 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Inn/Ut-feil: Ikke mer plass på disken, eller kan ikke opprette en så stor " +"fil:" + +#: BitTorrent/download.py:400 +msgid "killed by IO error: " +msgstr "drept av inn/ut-feil" + +#: BitTorrent/download.py:403 +msgid "killed by OS error: " +msgstr "drept av operativsystemfeil:" + +#: BitTorrent/download.py:408 +msgid "killed by internal exception: " +msgstr "drept av internt unntak:" + +#: BitTorrent/download.py:413 +msgid "Additional error when closing down due to error: " +msgstr "Ekstra feil ved avslutning på grunn av feil:" + +#: BitTorrent/download.py:426 +msgid "Could not remove fastresume file after failure:" +msgstr "Kunne ikke fjerne hurtigfortsettelsesfil etter at den feilet:" + +#: BitTorrent/download.py:443 +msgid "seeding" +msgstr "lager frø" + +#: BitTorrent/download.py:466 +msgid "Could not write fastresume data: " +msgstr "Kunne ikke skrive hurtigfortsettelsesdata:" + +#: BitTorrent/download.py:476 +msgid "shut down" +msgstr "avslutt" + +#: BitTorrent/launchmanycore.py:65 +#, fuzzy +msgid "Could not set signal handler: " +msgstr "Kunne ikke sette signalhåndterer: " + +#: BitTorrent/launchmanycore.py:69 btdownloadcurses.py:354 +#: btdownloadheadless.py:237 +msgid "shutting down" +msgstr "avslutter" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "droppet \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "la til \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "Venter på hash-kontroll" + +#: BitTorrent/launchmanycore.py:142 btlaunchmanycurses.py:58 +msgid "connecting to peers" +msgstr "kobler til klienter" + +#: BitTorrent/launchmanycore.py:232 btdownloadcurses.py:361 +#: btdownloadheadless.py:244 +msgid "Error reading config: " +msgstr "Feil ved lesing av konfigurasjon:" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Leser konfigurasjonsfilen om igjen" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Du kan ikke spesifisere navn på .torrentfilen når du genererer flere " +"torrents på en gang" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Filsystemkodingen \"%s\" støttes ikke i denne versjonen" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Kunne ikke konvertere fil-/mappenavnet \"%s\" til utf-8 (%s). Enten er " +"antatt filsystemkoding \"%s\" feil, eller filnavnet inneholder ugyldige tegn." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Fil-/mappenavnet \"%s\" inneholder reserverte unicodeverdier som ikke " +"tilsvarer tegn." + +#: BitTorrent/parseargs.py:23 +#, python-format +msgid "Usage: %s " +msgstr "Bruk: %s" + +#: BitTorrent/parseargs.py:25 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[INNSTILLINGER] [TORRENTMAPPE]\n" +"\n" + +#: BitTorrent/parseargs.py:26 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Hvis et argument som ikke er en innstilling er tilstede, blir det\n" +"brukt som verdien til torrent_dir-innstilingen.\n" + +#: BitTorrent/parseargs.py:29 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[INNSTILLINGER] [TORRENTFILER]\n" + +#: BitTorrent/parseargs.py:31 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[INNSTILLINGER] [TORRENTFIL]\n" + +#: BitTorrent/parseargs.py:33 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[INNSTILLING] SPORERURL FIL [FIL]\n" + +#: BitTorrent/parseargs.py:35 +msgid "arguments are -\n" +msgstr "argumenter er -\n" + +#: BitTorrent/parseargs.py:66 +msgid " (defaults to " +msgstr " (standard er " + +#: BitTorrent/parseargs.py:115 BitTorrent/parseargs.py:152 +msgid "unknown key " +msgstr "ukjent nøkkel" + +#: BitTorrent/parseargs.py:121 BitTorrent/parseargs.py:131 +msgid "parameter passed in at end with no value" +msgstr "parameter sendt på slutten uten verdi" + +#: BitTorrent/parseargs.py:135 +msgid "command line parsing failed at " +msgstr "kommandolinjegjennomgang feilet ved " + +#: BitTorrent/parseargs.py:142 +#, python-format +msgid "Option %s is required." +msgstr "Valget %s er nødvendig." + +#: BitTorrent/parseargs.py:144 +#, python-format +msgid "Must supply at least %d args." +msgstr "Må gi minst %d argumenter." + +#: BitTorrent/parseargs.py:146 +#, python-format +msgid "Too many args - %d max." +msgstr "For mange argumenter - maksimum %d." + +#: BitTorrent/parseargs.py:176 +#, python-format +msgid "wrong format of %s - %s" +msgstr "Feil format av %s - %s" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Kunne ikke lese mappe" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Kunne ikke få status for " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "Fjerner %s (vil legge til på nytt)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**advarsel** %s er er en maken torrent som %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**advarsel** %s har feil" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... vellykket" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "fjerner %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "ferdig med å sjekke" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Port å lytte på." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "fil å lagre nylig nedlastingsinformasjon i" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "Tid uten aktivitet før forbindelser stenges" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "sekunder mellom hver gang dfile lagres" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "sekunder mellom nedlastere som går ut på dato" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "sekunder nedlastere skal vente mellom gjenannonseringer" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send in an info message if the client does not " +"specify a number" +msgstr "standard antall " + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "tid å vente mellom hver sjekk for å se etter tidsavbrutte forbindelser" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "sjekk om en nedlaster er bak NAT hvor mange ganger (0 = ikke sjekk)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "Skal resultater av NATsjekk legges i loggen" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "minste tid siden siste tømming før en ny kan gjøres." + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"minste antall sekunder før et midlertidig lager er betegnet som foreldet, og " +"blir tømt." + +#: BitTorrent/track.py:72 +#, fuzzy +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"Bare tillat nedlastinger av .torrentfiler i denne mappen (og rekursivt i " +"undermapper til mapper som ikke har .torrentfiler selv.) Hvis denne er " +"valgt, vil torrents i denne mappen være synlige på infosiden/scrapesiden " +"enten de har klienter eller ikke." + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"tillat spesielle nøkler i torrentene i \"allowed_dir\" å påvirke " +"sporertilgang" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "skal loggfilen gjenåpnes etter et HUPsignal?" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"om en informasjonsside skal vises når sporerens rotmappe blir lastet inn " +"eller ikke" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "en URL å redirigere informasjonssiden til" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "skal navn fra \"allowed_dir\" vises eller ikke?" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"fil som inneholder x-icon-data å returnere når det kommer en forespørsel " +"etter favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorer IP GETparameter fra maskiner som ikker er på lokalnettets IPadresser " +"(0 = aldri, 1 = alltid, 2 = ignorer hvis NATsjekking ikke er aktivert). " +"HTTPmellomtjenerhoder som oppgir adressen til den originale klienten blir " +"behandlet på samme måte som --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "fil å skrive sporerlogger til, bruk - for stdout (standard)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"Bruk sammen med allowed_dir. Legger til en /file?hash={hash}-URL som lar " +"brukere laste ned torrentfilen" + +#: BitTorrent/track.py:104 +#, fuzzy +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"Behold døde torrents etter at de går ut (slik at de fortsatt vil vises i " +"scrapesiden og websiden.) Gir bare mening hvis allowed_dir ikke er valgt." + +#: BitTorrent/track.py:107 +#, fuzzy +msgid "scrape access allowed (can be none, specific or full)" +msgstr "scrapetilgang er tillatt (kan være ingen, spesiell eller full)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "største antall klienter å oppgi ved enhver forespørsel" + +#: BitTorrent/track.py:161 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"Filen din eksisterer kanskje et annet sted i universet,\n" +"men dessverre ikke her.\n" + +#: BitTorrent/track.py:246 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**advarsel** spesifisert favorittikonfil -- %s -- finnes ikke." + +#: BitTorrent/track.py:269 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**Advarsel** tilstandsfil %s er ødelagt; tilbakestiller til standard" + +#: BitTorrent/track.py:305 +msgid "# Log Started: " +msgstr "# Logg Startet: " + +#: BitTorrent/track.py:307 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**advarsel** kunne ikke omdirigere stdout til loggfil:" + +#: BitTorrent/track.py:315 +msgid "# Log reopened: " +msgstr "# Logg gjenåpnet:" + +#: BitTorrent/track.py:317 +msgid "**warning** could not reopen logfile" +msgstr "**Advarsel** kunne ikke gjenåpne loggfil" + +#: BitTorrent/track.py:457 +msgid "specific scrape function is not available with this tracker." +msgstr "" +"Spesifisert \"scrape\"funksjon er ikke tilgjengelig hos denne sporeren." + +#: BitTorrent/track.py:467 +msgid "full scrape function is not available with this tracker." +msgstr "" +"Fullstendig \"scrape\"funksjon er ikke tilgjengelig hos denne sporeren." + +#: BitTorrent/track.py:480 +msgid "get function is not available with this tracker." +msgstr "Funksjonen \"get\" er ikke tilgjengelig hos denne sporeren." + +#: BitTorrent/track.py:494 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Forespurt nedlasting er ikke autorisert til å bruke denne sporeren." + +#: BitTorrent/track.py:850 btlaunchmanycurses.py:287 +msgid "error: " +msgstr "feil:" + +#: BitTorrent/track.py:851 +msgid "run with no arguments for parameter explanations" +msgstr "Kjør uten argumenter for forklaring på parametrene." + +#: BitTorrent/track.py:859 +msgid "# Shutting down: " +msgstr "# Avslutter:" + +#: btdownloadcurses.py:45 btlaunchmanycurses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Oppstart av teksbasert grafisk brukergrensesnitt feilet, kan ikke fortsette." + +#: btdownloadcurses.py:47 btlaunchmanycurses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Denne nedlastingen krever Pythonmodulen \"curses\", som dessverre ikke er " +"tilgjengelig for Windowsversjonen av Python. Den er derimot tilgjengelig " +"for Cygwinversjonen (www.cygwin.com) av Python, som kjører på alle " +"win32systemer." + +#: btdownloadcurses.py:52 btlaunchmanycurses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Du kan fortsatt bruke \"btdownloadheadless.py\" til nedlasting." + +#: btdownloadcurses.py:57 btdownloadheadless.py:39 +msgid "download complete!" +msgstr "Nedlasting ferdig!" + +#: btdownloadcurses.py:62 btdownloadheadless.py:44 +msgid "" +msgstr "" + +#: btdownloadcurses.py:65 btdownloadheadless.py:47 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "Ferdig om %d:%02d:%02d" + +#: btdownloadcurses.py:151 +msgid "file:" +msgstr "fil:" + +#: btdownloadcurses.py:152 +msgid "size:" +msgstr "Størrelse:" + +#: btdownloadcurses.py:153 +msgid "dest:" +msgstr "mål:" + +#: btdownloadcurses.py:154 +msgid "progress:" +msgstr "fremgang:" + +#: btdownloadcurses.py:155 +msgid "status:" +msgstr "status:" + +#: btdownloadcurses.py:156 +msgid "dl speed:" +msgstr "nedl. hastighet:" + +#: btdownloadcurses.py:157 +msgid "ul speed:" +msgstr "oppl. hastighet:" + +#: btdownloadcurses.py:158 +msgid "sharing:" +msgstr "deler:" + +#: btdownloadcurses.py:159 +msgid "seeds:" +msgstr "frø:" + +#: btdownloadcurses.py:160 +msgid "peers:" +msgstr "klienter:" + +#: btdownloadcurses.py:169 btdownloadheadless.py:94 +msgid "download succeeded" +msgstr "Vellykket nedlasting" + +#: btdownloadcurses.py:213 btdownloadheadless.py:128 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB opp / %.1f MB ned)" + +#: btdownloadcurses.py:216 btdownloadheadless.py:131 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB opp / %.1f MB ned)" + +#: btdownloadcurses.py:222 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d synlige nå, plus %d distribuerte kopier (%s)" + +#: btdownloadcurses.py:227 btdownloadheadless.py:142 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d distribuerte kopier (neste: %s)" + +#: btdownloadcurses.py:249 +msgid "error(s):" +msgstr "feil:" + +#: btdownloadcurses.py:258 +msgid "error:" +msgstr "feil:" + +#: btdownloadcurses.py:261 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Opp Ned Ferdig " +"Hastighet" + +#: btdownloadcurses.py:306 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "laster ned %d deler, har %d biter, %d av %d deler ferdig" + +#: btdownloadcurses.py:336 btdownloadheadless.py:219 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Du kan ikke spesifisere både --save_as og --save_in" + +#: btdownloadcurses.py:404 btdownloadheadless.py:287 +msgid "must have responsefile as arg or parameter, not both" +msgstr "Du må ha responsfil som enten argument eller parameter, ikke begge." + +#: btdownloadcurses.py:417 btdownloadheadless.py:300 +msgid "you must specify a .torrent file" +msgstr "Du må oppgi en .torrentfil" + +#: btdownloadcurses.py:419 btdownloadheadless.py:302 +msgid "Error reading .torrent file: " +msgstr "Feil ved lesing av .torrentfil:" + +#: btdownloadcurses.py:429 +msgid "These errors occurred during execution:" +msgstr "Disse feilene oppstod under kjøring:" + +#: btdownloadgui.py:24 btmaketorrentgui.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installér Python 2.3 eller nyere" + +#: btdownloadgui.py:38 +msgid "PyGTK 2.4 or newer required" +msgstr "Krever PyGTK 2.4 eller nyere" + +#: btdownloadgui.py:104 +msgid "drag to reorder" +msgstr "dra for å endre rekkefølge" + +#: btdownloadgui.py:105 +msgid "right-click for menu" +msgstr "høyreklikk for meny" + +#: btdownloadgui.py:108 +#, python-format +msgid "rate: %s" +msgstr "Forhold: %s" + +#: btdownloadgui.py:111 +msgid "dialup" +msgstr "oppringt" + +#: btdownloadgui.py:112 +msgid "DSL/cable 128k up" +msgstr "DSL/kabel over 128k" + +#: btdownloadgui.py:113 +msgid "DSL/cable 256k up" +msgstr "DSL/kabel over 256k" + +#: btdownloadgui.py:114 +msgid "DSL 768k up" +msgstr "DSL over 768k" + +#: btdownloadgui.py:115 +msgid "T1" +msgstr "T1" + +#: btdownloadgui.py:116 +msgid "T1/E1" +msgstr "T1/E1" + +#: btdownloadgui.py:117 +msgid "E1" +msgstr "E1" + +#: btdownloadgui.py:118 +msgid "T3" +msgstr "T3" + +#: btdownloadgui.py:119 +msgid "OC3" +msgstr "OC3" + +#: btdownloadgui.py:297 +msgid "Maximum upload " +msgstr "Maksimum opplasting" + +#: btdownloadgui.py:310 +msgid "Temporarily stop all running torrents" +msgstr "Stopp alle torrents midlertidig" + +#: btdownloadgui.py:311 +msgid "Resume downloading" +msgstr "Fortsett nedlasting" + +#: btdownloadgui.py:350 +#, python-format +msgid "New %s version available" +msgstr "Ny %s versjon tilgjengelig" + +#: btdownloadgui.py:365 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "En nyere versjon av %s er tilgjengelig.\n" + +#: btdownloadgui.py:366 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Du bruker %s, og den nye versjonen er %s.\n" + +#: btdownloadgui.py:367 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Du kan alltid få nyeste versjon fra \n" +"%s" + +#: btdownloadgui.py:374 btdownloadgui.py:1789 btdownloadgui.py:1894 +msgid "Download _later" +msgstr "Hent ned _senere" + +#: btdownloadgui.py:377 btdownloadgui.py:1753 +msgid "Download _now" +msgstr "Hent ned _nå" + +#: btdownloadgui.py:383 +msgid "_Remind me later" +msgstr "_Minn meg på det senere" + +#: btdownloadgui.py:415 +#, python-format +msgid "About %s" +msgstr "Om %s" + +#: btdownloadgui.py:430 +msgid "Beta" +msgstr "Beta" + +#: btdownloadgui.py:432 +#, python-format +msgid "Version %s" +msgstr "Versjon %s" + +#: btdownloadgui.py:451 +msgid "Donate" +msgstr "Donér" + +#: btdownloadgui.py:471 +#, python-format +msgid "%s Activity Log" +msgstr "%s aktivitetslogg" + +#: btdownloadgui.py:528 +msgid "Save log in:" +msgstr "Lagre logg i:" + +#: btdownloadgui.py:539 +msgid "log saved" +msgstr "Loggen er lagret" + +#: btdownloadgui.py:598 +msgid "log cleared" +msgstr "Loggen er tømt" + +#: btdownloadgui.py:610 +#, python-format +msgid "%s Settings" +msgstr "%s innstillinger" + +#: btdownloadgui.py:621 +msgid "Saving" +msgstr "Lagrer" + +#: btdownloadgui.py:623 +msgid "Download folder:" +msgstr "Nedlastingsmappe:" + +#: btdownloadgui.py:630 +msgid "Default:" +msgstr "Standard:" + +#: btdownloadgui.py:637 +msgid "Change..." +msgstr "Endre..." + +#: btdownloadgui.py:641 +msgid "Ask where to save each download" +msgstr "Spør om nedlastingsmappe for hver nedlasting." + +#: btdownloadgui.py:655 +msgid "Downloading" +msgstr "Laster ned" + +#: btdownloadgui.py:657 +msgid "Starting additional torrents manually:" +msgstr "Starter flere torrents manuelt:" + +#: btdownloadgui.py:666 +msgid "Always stops the _last running torrent" +msgstr "Stopp alltid den _siste kjørende torrenten" + +#: btdownloadgui.py:672 +msgid "Always starts the torrent in _parallel" +msgstr "Start alltid torrenten _parallelt" + +#: btdownloadgui.py:678 +msgid "_Asks each time" +msgstr "Spør _hver gang" + +#: btdownloadgui.py:692 +msgid "Seed completed torrents:" +msgstr "Så frø til ferdige torrents:" + +#: btdownloadgui.py:700 btdownloadgui.py:729 +msgid "until share ratio reaches " +msgstr "til forholdet mellom opplasting og nedlasting når " + +#: btdownloadgui.py:706 +msgid " percent, or" +msgstr " prosent, eller" + +#: btdownloadgui.py:712 +msgid "for " +msgstr "i " + +#: btdownloadgui.py:718 +msgid " minutes, whichever comes first." +msgstr " minutter, ettersom hva som kommer først." + +#: btdownloadgui.py:725 +msgid "Seed last completed torrent:" +msgstr "Så frø til siste ferdige torrent:" + +#: btdownloadgui.py:735 +msgid " percent." +msgstr "prosent." + +#: btdownloadgui.py:741 +msgid "\"0 percent\" means seed forever." +msgstr "\"0 prosent\" betyr så frø for alltid." + +#: btdownloadgui.py:750 +msgid "Network" +msgstr "Nettverk" + +#: btdownloadgui.py:752 +msgid "Look for available port:" +msgstr "Se etter ledig port:" + +#: btdownloadgui.py:755 +msgid "starting at port: " +msgstr "Starter på port:" + +#: btdownloadgui.py:768 +msgid "IP to report to the tracker:" +msgstr "IP som rapporteres til tracker:" + +#: btdownloadgui.py:773 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Har ingen effekt hvis du ikke er på samme\n" +"lokalnett som trackeren.)" + +#: btdownloadgui.py:778 +msgid "Potential Windows TCP stack fix" +msgstr "Potensiell retting av Windows TCP stack" + +#: btdownloadgui.py:792 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Fremdriftsindikatoren er alltid svart\n" +"(Programmet må startes på nytt)" + +#: btdownloadgui.py:805 +msgid "Misc" +msgstr "Diverse" + +#: btdownloadgui.py:812 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ADVARSEL: Endring av disse innstillingene kan\n" +"hindre at %s fungerer som det skal." + +#: btdownloadgui.py:820 +msgid "Option" +msgstr "Valg" + +#: btdownloadgui.py:825 +msgid "Value" +msgstr "Verdi" + +#: btdownloadgui.py:832 +msgid "Advanced" +msgstr "Avansert" + +#: btdownloadgui.py:841 +msgid "Choose default download directory" +msgstr "Velg standard nedlastingsmappe" + +#: btdownloadgui.py:902 +#, python-format +msgid "Files in \"%s\"" +msgstr "Filer i \"%s\"" + +#: btdownloadgui.py:911 +msgid "Apply" +msgstr "Bruk" + +#: btdownloadgui.py:912 +msgid "Allocate" +msgstr "Tilegn" + +#: btdownloadgui.py:913 +msgid "Never download" +msgstr "Aldri last ned" + +#: btdownloadgui.py:914 +msgid "Decrease" +msgstr "Reduser" + +#: btdownloadgui.py:915 +msgid "Increase" +msgstr "Øk" + +#: btdownloadgui.py:925 btlaunchmanycurses.py:142 +msgid "Filename" +msgstr "Filnavn" + +#: btdownloadgui.py:925 +msgid "Length" +msgstr "Lengde" + +#: btdownloadgui.py:925 +msgid "%" +msgstr "%" + +#: btdownloadgui.py:1089 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Klienter for \"%s\"" + +#: btdownloadgui.py:1095 +msgid "IP address" +msgstr "IPadresse" + +#: btdownloadgui.py:1095 +msgid "Client" +msgstr "Klient" + +#: btdownloadgui.py:1095 +msgid "Connection" +msgstr "Tilkobling" + +#: btdownloadgui.py:1095 +msgid "KB/s down" +msgstr "kB/s ned" + +#: btdownloadgui.py:1095 +msgid "KB/s up" +msgstr "kB/s opp" + +#: btdownloadgui.py:1095 +msgid "MB downloaded" +msgstr "MB lastet ned" + +#: btdownloadgui.py:1095 +msgid "MB uploaded" +msgstr "MB lastet opp" + +# Kommer opp feil i poEdit... +# poEdit doesn't like this one... +#: btdownloadgui.py:1095 +#, python-format +msgid "% complete" +msgstr "% ferdig" + +#: btdownloadgui.py:1095 +msgid "KB/s est. peer download" +msgstr "KB/s beregnet klientnedlastingshastighet" + +#: btdownloadgui.py:1101 +msgid "Peer ID" +msgstr "KlientID" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Interested" +msgstr "Interessert" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Choked" +msgstr "Overbelastet" + +#: btdownloadgui.py:1104 +msgid "Snubbed" +msgstr "Døde" + +#: btdownloadgui.py:1107 +msgid "Optimistic upload" +msgstr "optimistisk opplasting" + +#: btdownloadgui.py:1188 +msgid "remote" +msgstr "fjern" + +#: btdownloadgui.py:1188 +msgid "local" +msgstr "lokal" + +#: btdownloadgui.py:1224 +msgid "bad peer" +msgstr "klientfeil" + +#: btdownloadgui.py:1234 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: btdownloadgui.py:1235 +#, python-format +msgid "%d bad" +msgstr "%d ødelagt" + +#: btdownloadgui.py:1237 +msgid "banned" +msgstr "bannlyst" + +#: btdownloadgui.py:1239 +msgid "ok" +msgstr "ok" + +#: btdownloadgui.py:1275 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informasjon for \"%s\"" + +#: btdownloadgui.py:1293 +msgid "Torrent name:" +msgstr "Torrentnavn:" + +#: btdownloadgui.py:1298 +msgid "(trackerless torrent)" +msgstr "(sporerløs torrent)" + +#: btdownloadgui.py:1301 +msgid "Announce url:" +msgstr "annonseringsURL:" + +#: btdownloadgui.py:1305 +msgid ", in one file" +msgstr ", i en fil" + +#: btdownloadgui.py:1307 +#, python-format +msgid ", in %d files" +msgstr ", i %d filer" + +#: btdownloadgui.py:1308 +msgid "Total size:" +msgstr "Total størrelse:" + +#: btdownloadgui.py:1315 +msgid "Pieces:" +msgstr "Deler: " + +#: btdownloadgui.py:1317 +msgid "Info hash:" +msgstr "Infohash:" + +#: btdownloadgui.py:1327 +msgid "Save in:" +msgstr "Lagre i:" + +#: btdownloadgui.py:1331 +msgid "File name:" +msgstr "Filnavn:" + +#: btdownloadgui.py:1357 +msgid "Open directory" +msgstr "Åpne mappe" + +#: btdownloadgui.py:1363 +msgid "Show file list" +msgstr "Vis filliste" + +#: btdownloadgui.py:1458 +msgid "Torrent info" +msgstr "Torrentinformasjon" + +#: btdownloadgui.py:1467 btdownloadgui.py:1890 +msgid "Remove torrent" +msgstr "Fjern torrent" + +#: btdownloadgui.py:1471 +msgid "Abort torrent" +msgstr "Avslutt torrent" + +#: btdownloadgui.py:1528 +#, python-format +msgid ", will seed for %s" +msgstr ", vil så frø i %s" + +#: btdownloadgui.py:1530 +msgid ", will seed indefinitely." +msgstr ", vil så frø uendelig." + +#: btdownloadgui.py:1533 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Ferdig, delingsforhold: %d%%" + +#: btdownloadgui.py:1536 +#, python-format +msgid "Done, %s uploaded" +msgstr "Ferdig, %s lastet opp" + +#: btdownloadgui.py:1568 +msgid "Torrent _info" +msgstr "Torrent_informasjon" + +#: btdownloadgui.py:1569 +msgid "_Open directory" +msgstr "_Åpne mappe" + +#: btdownloadgui.py:1570 +msgid "_Change location" +msgstr "_Endre lagringssted" + +#: btdownloadgui.py:1572 +msgid "_File list" +msgstr "_Filliste" + +#: btdownloadgui.py:1646 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Er du sikker på at du vil fjerne \"%s\"?" + +#: btdownloadgui.py:1649 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Delingsforholdet ditt for denne torrenten er %d%%." + +#: btdownloadgui.py:1651 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Du har lastet opp %s til denne torrenten." + +#: btdownloadgui.py:1654 +msgid "Remove this torrent?" +msgstr "Fjern denne torrenten?" + +#: btdownloadgui.py:1673 +msgid "Finished" +msgstr "Ferdig" + +#: btdownloadgui.py:1674 +msgid "drag into list to seed" +msgstr "dra inn i listen for å så frø" + +#: btdownloadgui.py:1677 +msgid "Failed" +msgstr "Feilet" + +#: btdownloadgui.py:1678 +msgid "drag into list to resume" +msgstr "dra inn i listen for å fortsette" + +#: btdownloadgui.py:1687 +msgid "Re_start" +msgstr "Gjen_start" + +#: btdownloadgui.py:1688 btdownloadgui.py:1759 btdownloadgui.py:1795 +#: btdownloadgui.py:1900 +msgid "_Remove" +msgstr "F_jern" + +#: btdownloadgui.py:1738 +msgid "Waiting" +msgstr "Venter" + +#: btdownloadgui.py:1758 btdownloadgui.py:1794 btdownloadgui.py:1899 +msgid "_Finish" +msgstr "_Gjør ferdig" + +#: btdownloadgui.py:1761 btdownloadgui.py:1790 btdownloadgui.py:1895 +msgid "_Abort" +msgstr "_Avbryt" + +#: btdownloadgui.py:1776 +msgid "Paused" +msgstr "Pause" + +#: btdownloadgui.py:1817 +msgid "Running" +msgstr "Kjører" + +#: btdownloadgui.py:1841 +#, python-format +msgid "Current up: %s" +msgstr "Nåværende opp: %s" + +#: btdownloadgui.py:1842 +#, python-format +msgid "Current down: %s" +msgstr "Nåværende ned: %s" + +#: btdownloadgui.py:1848 +#, python-format +msgid "Previous up: %s" +msgstr "Forrige opp: %s" + +#: btdownloadgui.py:1849 +#, python-format +msgid "Previous down: %s" +msgstr "Forrige ned: %s" + +#: btdownloadgui.py:1855 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Delingsforhold: %0.02f%%" + +#: btdownloadgui.py:1858 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s klienter, %s frø. Totaler fra sporer: %s" + +#: btdownloadgui.py:1862 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Distribuerte kopier: %d; Neste: %s" + +#: btdownloadgui.py:1865 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Deler: %d totalt, %d ferdig, %d delvis, %d aktive (%d tomme)" + +#: btdownloadgui.py:1869 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d ødelagte deler + %s i forkastede forespørsler" + +#: btdownloadgui.py:1903 +msgid "_Peer list" +msgstr "_Klientliste" + +#: btdownloadgui.py:1962 +msgid "Done" +msgstr "Ferdig" + +#: btdownloadgui.py:1977 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% ferdig, %s gjenstår" + +#: btdownloadgui.py:1985 +msgid "Download " +msgstr "Nedlasting" + +#: btdownloadgui.py:1987 +msgid "Upload " +msgstr "Nedlasting" + +#: btdownloadgui.py:2002 +msgid "NA" +msgstr "IT" + +#: btdownloadgui.py:2343 +#, python-format +msgid "%s started" +msgstr "%s startet" + +#: btdownloadgui.py:2356 +msgid "_Open torrent file" +msgstr "_Åpne torrentfil" + +#: btdownloadgui.py:2357 +msgid "Make _new torrent" +msgstr "Lag _ny torrent" + +#: btdownloadgui.py:2360 +msgid "_Pause/Play" +msgstr "_Pause/Play" + +#: btdownloadgui.py:2362 +msgid "_Quit" +msgstr "_Avslutt" + +#: btdownloadgui.py:2364 +msgid "Show/Hide _finished torrents" +msgstr "Vis/Gjem _ferdige torrents" + +#: btdownloadgui.py:2366 +msgid "_Resize window to fit" +msgstr "_Endre størrelsen på vinduet til å passe" + +#: btdownloadgui.py:2368 +msgid "_Log" +msgstr "_Logg" + +#: btdownloadgui.py:2371 +msgid "_Settings" +msgstr "Opp_sett" + +#: btdownloadgui.py:2374 btdownloadgui.py:2390 +msgid "_Help" +msgstr "_Hjelp" + +#: btdownloadgui.py:2376 +msgid "_About" +msgstr "_Om" + +#: btdownloadgui.py:2377 +msgid "_Donate" +msgstr "_Donér" + +#: btdownloadgui.py:2381 +msgid "_File" +msgstr "_Fil" + +#: btdownloadgui.py:2386 +msgid "_View" +msgstr "_Vis" + +#: btdownloadgui.py:2533 +msgid "(stopped)" +msgstr "(stoppet)" + +#: btdownloadgui.py:2545 +msgid "(multiple)" +msgstr "(flere)" + +#: btdownloadgui.py:2659 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Hjelp til %s er på \n" +"%s\n" +"Vil du gå dit nå?" + +#: btdownloadgui.py:2662 +msgid "Visit help web page?" +msgstr "Gå til hjelpesiden?" + +#: btdownloadgui.py:2698 +msgid "There is one finished torrent in the list. " +msgstr "Det er en fullført torrent i listen." + +#: btdownloadgui.py:2699 +msgid "Do you want to remove it?" +msgstr "Vil du fjerne den?" + +#: btdownloadgui.py:2701 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Det er %d fullførte torrents i listen." + +#: btdownloadgui.py:2702 +msgid "Do you want to remove all of them?" +msgstr "Vil du fjerne alle?" + +#: btdownloadgui.py:2704 +msgid "Remove all finished torrents?" +msgstr "Fjerne alle fullførte torrents?" + +#: btdownloadgui.py:2711 +msgid "No finished torrents" +msgstr "Ingen fullførte torrents" + +#: btdownloadgui.py:2712 +msgid "There are no finished torrents to remove." +msgstr "Det er ingen fullførte torrents å fjerne." + +#: btdownloadgui.py:2756 +msgid "Open torrent:" +msgstr "Åpne torrent:" + +#: btdownloadgui.py:2789 +msgid "Change save location for " +msgstr "Endre lagringssted for " + +#: btdownloadgui.py:2815 +msgid "File exists!" +msgstr "Filen eksisterer!" + +#: btdownloadgui.py:2816 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" eksisterer allerede. Vil du lagre under et annet navn?" + +#: btdownloadgui.py:2834 +msgid "Save location for " +msgstr "Lagringssted for " + +#: btdownloadgui.py:2944 +#, python-format +msgid "(global message) : %s" +msgstr "(global melding) : %s" + +#: btdownloadgui.py:2951 +#, python-format +msgid "%s Error" +msgstr "%s-feil" + +#: btdownloadgui.py:2957 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Det har oppstått flere feil. Trykk OK for å se feilloggen." + +#: btdownloadgui.py:3087 +msgid "Stop running torrent?" +msgstr "Stoppe kjørende torrent?" + +#: btdownloadgui.py:3088 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Du skal til å starte \"%s\". Vil du stoppe den forrige kjørende torrenten " +"også?" + +#: btdownloadgui.py:3098 +msgid "Have you donated?" +msgstr "Har du donert?" + +#: btdownloadgui.py:3099 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Velkommen til den nye versjonen av %s. Har du donert?" + +#: btdownloadgui.py:3113 +msgid "Thanks!" +msgstr "Takk!" + +#: btdownloadgui.py:3114 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Takk for din donasjon! For å gi mer, velg \"Donér\" fra \"Hjelp\"menyen." + +#: btdownloadgui.py:3143 +msgid "Can't have both --responsefile and non-option arguments" +msgstr "Kan ikke ha både --responsefile og argumenter " + +#: btdownloadgui.py:3173 +msgid "Temporary Internet Files" +msgstr "Midlertidige internettfiler" + +#: btdownloadgui.py:3174 +#, python-format +msgid "" +"Could not read %s: %s. You are probably using a broken Internet Explorer " +"version that passed BitTorrent a filename that doesn't exist. To work around " +"the problem, try clearing your Temporary Internet Files or right-click the " +"link and save the .torrent file to disk first." +msgstr "" +"Kunne ikke lese %s: %s. Du bruker kanskje en ødelagt versjon av Internet " +"Explorer, som har gitt BitTorrent et filnavn som ikke eksisterer. For å " +"unngå problemet, prøv å slette midlertidige internettfiler eller høyreklikk " +"på lenken og lagre .torrentfilen til disk først." + +#: btdownloadgui.py:3197 +#, python-format +msgid "%s already running" +msgstr "%s kjører allerede" + +#: btdownloadheadless.py:137 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d synlig nå, plus %d distribuerte kopier (%s)" + +#: btdownloadheadless.py:144 +#, python-format +msgid "%d seen now" +msgstr "%d synlig nå" + +#: btdownloadheadless.py:147 +msgid "ERROR:\n" +msgstr "FEIL:\n" + +#: btdownloadheadless.py:148 +msgid "saving: " +msgstr "lagrer:" + +#: btdownloadheadless.py:149 +msgid "percent done: " +msgstr "prosent ferdig:" + +#: btdownloadheadless.py:150 +msgid "time left: " +msgstr "gjenstående tid:" + +#: btdownloadheadless.py:151 +msgid "download to: " +msgstr "last ned til:" + +#: btdownloadheadless.py:152 +msgid "download rate: " +msgstr "nedlastingshastighet:" + +#: btdownloadheadless.py:153 +msgid "upload rate: " +msgstr "opplastingshastighet:" + +#: btdownloadheadless.py:154 +msgid "share rating: " +msgstr "forhold mellom opp- og nedlasting:" + +#: btdownloadheadless.py:155 +msgid "seed status: " +msgstr "frø-status:" + +#: btdownloadheadless.py:156 +msgid "peer status: " +msgstr "klientstatus:" + +#: btlaunchmanycurses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Antatt ferdig om %d:%02d:%02d" + +#: btlaunchmanycurses.py:143 +msgid "Size" +msgstr "Størrelse" + +#: btlaunchmanycurses.py:144 +msgid "Download" +msgstr "Nedlastinger" + +#: btlaunchmanycurses.py:145 +msgid "Upload" +msgstr "Opplastinger" + +#: btlaunchmanycurses.py:146 btlaunchmanycurses.py:239 +msgid "Totals:" +msgstr "Totalt:" + +#: btlaunchmanycurses.py:205 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s up %s dn" +msgstr " (%s) %s - %s klienter %s frø %s distr. kopier - %s opp %s ned" + +#: btlaunchmanycurses.py:227 btlaunchmany.py:35 +msgid "no torrents" +msgstr "ingen torrents" + +#: btlaunchmanycurses.py:265 btlaunchmany.py:49 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTEMFEIL - UNNTAK OPPSTÅTT" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid "Warning: " +msgstr "Advarsel:" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid " is not a directory" +msgstr " er ikke en mappe" + +#: btlaunchmanycurses.py:287 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"Kjør uten argumenter for forklaring på parametrene." + +#: btlaunchmanycurses.py:292 btlaunchmany.py:71 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"UNNTAK:" + +#: btlaunchmany.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"feil: %s\n" +"Kjør uten argumenter for forklaring på parametrene." + +#: btmaketorrentgui.py:55 +#, python-format +msgid "%s metafile creator %s" +msgstr "%s metafilskaper %s" + +#: btmaketorrentgui.py:73 +msgid "" +"Make .torrent metafiles for these files/directories:\n" +"(Directories will become batch torrents)" +msgstr "" +"Lag .torrentfiler for disse filene/mappene:\n" +"(Mapper blir til flerfilstorrents)" + +#: btmaketorrentgui.py:88 +msgid "_Files/directories" +msgstr "_Filer_mapper" + +#: btmaketorrentgui.py:118 +msgid "Piece size:" +msgstr "Delstørrelse:" + +#: btmaketorrentgui.py:135 +msgid "Use _tracker:" +msgstr "Bruk _sporer:" + +#: btmaketorrentgui.py:165 +msgid "Use _DHT" +msgstr "Bruk _DHT" + +#: btmaketorrentgui.py:171 +msgid "Nodes (optional):" +msgstr "Noder (valgfritt):" + +#: btmaketorrentgui.py:203 +msgid "Comments:" +msgstr "Kommentarer:" + +#: btmaketorrentgui.py:232 +msgid "Make" +msgstr "Lag" + +#: btmaketorrentgui.py:405 +msgid "_Host" +msgstr "_Vert" + +#: btmaketorrentgui.py:412 +msgid "_Port" +msgstr "_Port" + +#: btmaketorrentgui.py:505 +msgid "Building torrents..." +msgstr "Lager torrents..." + +#: btmaketorrentgui.py:513 +msgid "Checking file sizes..." +msgstr "Kontrollerer filstørrelser..." + +#: btmaketorrentgui.py:531 +msgid "Start seeding" +msgstr "Begynn å så frø" + +#: btmaketorrentgui.py:551 +msgid "building " +msgstr "bygger opp" + +#: btmaketorrentgui.py:571 +msgid "Done." +msgstr "Ferdig." + +#: btmaketorrentgui.py:572 +msgid "Done building torrents." +msgstr "Ferdig med å lage torrents" + +#: btmaketorrentgui.py:580 +msgid "Error!" +msgstr "Feil!" + +#: btmaketorrentgui.py:581 +msgid "Error building torrents: " +msgstr "Feil mens torrents ble laget:" + +#: btmaketorrent.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "Valgfri leselig kommentar å legge i .torrentfilen" + +#: btmaketorrent.py:31 +msgid "optional target file for the torrent" +msgstr "Valgfri målfil for torrenten" + +#: btreannounce.py:22 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Bruk: %s SPORER_URL [TORRENTFIL [TORRENTFIL ... ] ]" + +#: btreannounce.py:31 +#, python-format +msgid "old announce for %s: %s" +msgstr "gammel annonsering av %s: %s" + +#: btrename.py:26 +#, python-format +msgid "%s %s - change the suggested filename in a .torrent file" +msgstr "%s %s - endre det foreslåtte navnet i en .torrentfil" + +#: btrename.py:31 +#, python-format +msgid "Usage: %s TORRENTFILE NEW_FILE_NAME" +msgstr "Bruk: %s TORRENTFIL NYTT_FILNAVN" + +#: btrename.py:38 +#, python-format +msgid "old filename: %s" +msgstr "gammelt filnavn: %s" + +#: btrename.py:40 +#, python-format +msgid "new filename: %s" +msgstr "nytt filnavn: %s" + +#: btrename.py:45 +msgid "done." +msgstr "ferdig." + +#: btshowmetainfo.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - dekod %s metainformasjonsfiler" + +#: btshowmetainfo.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Bruk: %s [TORRENTFIL [TORRENTFIL ... ] ]" + +#: btshowmetainfo.py:42 +#, python-format +msgid "metainfo file.: %s" +msgstr "metainfofil.: %s" + +#: btshowmetainfo.py:43 +#, python-format +msgid "info hash.....: %s" +msgstr "info hash.....: %s" + +#: btshowmetainfo.py:47 +#, python-format +msgid "file name.....: %s" +msgstr "filnavn.......: %s" + +#: btshowmetainfo.py:49 +msgid "file size.....:" +msgstr "filstørrelse..:" + +#: btshowmetainfo.py:52 +#, python-format +msgid "directory name: %s" +msgstr "mappenavn.....: %s" + +#: btshowmetainfo.py:53 +msgid "files.........: " +msgstr "filer.........:" + +#: btshowmetainfo.py:63 +msgid "archive size..:" +msgstr "arkivstørrelse:" + +#: btshowmetainfo.py:67 +#, python-format +msgid "announce url..: %s" +msgstr "annonseringsURL: %s" + +#: btshowmetainfo.py:68 +msgid "comment.......: \n" +msgstr "kommentar.....: \n" + +#~ msgid "Choose existing folder" +#~ msgstr "Velg eksisterende mappe" + +#~ msgid "Create new folder" +#~ msgstr "Lag ny mappe" diff --git a/btlocale/pt_BR/LC_MESSAGES/bittorrent.mo b/btlocale/pt_BR/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..61630d1e83bf9e64460f6376c8b33de7222ebf89 GIT binary patch literal 57953 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\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Parece haver uma versão antiga do Python que não suporta detecção da " +"codificação de sistema de arquivos. Assumindo 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python falhou ao ao autodetectar a codificação de sistema de arquivos. Uando " +"então 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Codificação de sistema de arquivos '%s' não é suportada. Usando então " +"'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componente do caminho de arquivo errado: " + +#: BitTorrent/ConvertedMetainfo.py:188 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"nomes de arquivos codificados incorretamente. Alguns ou todos os nomes de " +"arquivos podem aparecer diferentes daquilo que o criador do arquivo .torrent " +"quis." + +#: BitTorrent/ConvertedMetainfo.py:194 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"valores errados de caracteres que não correspondem a nenhum caracter real. " +"Alguns ou todos os nomes de arquivos podem aparecer diferentes daquilo que o " +"criador do arquivo .torrent quis." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"nomes de arquivos codificados incorretamente. Os nomes usados podem ainda " +"estar corretos." + +#: BitTorrent/ConvertedMetainfo.py:206 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"O conjunto de caracteres usado no sistema de arquivos local (\"%s\") pode " +"não representar todos os caracteres usados no(s) nome(s) de arquivo(s) deste " +"torrent. Os nomes de arquivos foram modificados do original." + +#: BitTorrent/ConvertedMetainfo.py:212 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"O sistema de arquivos do Windows não consegue lidar com todos os caracteres " +"usados no(s) nome(s) de arquivo(s) deste torrent. Os nomes de arquivos foram " +"modificados do original." + +#: BitTorrent/ConvertedMetainfo.py:217 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui pelo " +"menos 1 nome de arquivo ou de diretório inválido. Contudo, como todos os " +"arquivos nessa situação foram marcados como tendo comprimento 0, serão " +"ignorados." + +#: BitTorrent/Encoder.py:173 +msgid "Can't start two separate instances of the same torrent" +msgstr "Impossível iniciar duas instâncias distintas do mesmo torrent" + +#: BitTorrent/GUI.py:149 +#, python-format +msgid "%d days" +msgstr "%d dias" + +#: BitTorrent/GUI.py:151 +#, python-format +msgid "1 day %d hours" +msgstr "1 dia e %d horas" + +#: BitTorrent/GUI.py:153 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d horas" + +#: BitTorrent/GUI.py:155 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutos" + +#: BitTorrent/GUI.py:157 +#, python-format +msgid "%d seconds" +msgstr "%d segundos" + +#: BitTorrent/GUI.py:159 +msgid "0 seconds" +msgstr "0 segundos" + +#: BitTorrent/GUI.py:201 +#, python-format +msgid "%s Help" +msgstr "%s Ajuda" + +#: BitTorrent/GUI.py:208 +msgid "Frequently Asked Questions:" +msgstr "Perguntas mais Freqüentes:" + +#: BitTorrent/GUI.py:213 +msgid "Go" +msgstr "Ir" + +#: BitTorrent/GUI.py:434 BitTorrent/GUI.py:486 +msgid "Choose an existing folder..." +msgstr "" + +#: BitTorrent/GUI.py:444 +msgid "All Files" +msgstr "Todos os arquivos" + +#: BitTorrent/GUI.py:449 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:483 +msgid "Create a new folder..." +msgstr "" + +#: BitTorrent/GUI.py:545 +msgid "Select file" +msgstr "Selecione arquivo" + +#: BitTorrent/GUI.py:546 +msgid "Select folder" +msgstr "Selecione pasta" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Mon" +msgstr "Seg" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Tue" +msgstr "Ter" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Wed" +msgstr "Qua" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Thu" +msgstr "Qui" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Fri" +msgstr "Sex" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sat" +msgstr "Sáb" + +#: BitTorrent/HTTPHandler.py:20 +msgid "Sun" +msgstr "Dom" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Feb" +msgstr "Fev" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Apr" +msgstr "Abr" + +#: BitTorrent/HTTPHandler.py:22 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:22 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Aug" +msgstr "Ago" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Sep" +msgstr "Set" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Oct" +msgstr "Out" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Dec" +msgstr "Dez" + +#: BitTorrent/HTTPHandler.py:83 +msgid "Got Accept-Encoding: " +msgstr "Recebido Aceitar Codificação: " + +#: BitTorrent/HTTPHandler.py:125 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Compactado: %i Descompactado: %i\n" + +#: BitTorrent/RawServer.py:273 +msgid "lost server socket" +msgstr "socket do servidor perdido" + +#: BitTorrent/RawServer.py:289 +msgid "Error handling accepted connection: " +msgstr "Error lidando com conexão aceita: " + +#: BitTorrent/RawServer.py:371 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Foi preciso sair devido ao desmoronamento da pilha TCP. Favor ver o FAQ em %s" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Anúncio do rastreador incompleto %d segundos após seu início" + +#: BitTorrent/Rerequester.py:172 +msgid "Problem connecting to tracker - " +msgstr "Problema ao conectar ao rastreador - " + +#: BitTorrent/Rerequester.py:199 +msgid "bad data from tracker - " +msgstr "dados errados do rastreador - " + +#: BitTorrent/Rerequester.py:210 +msgid "rejected by tracker - " +msgstr "rejeitado pelo rastreador - " + +#: BitTorrent/Rerequester.py:216 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Cancelando o torrent, por ter sido rejeitado pelo rastreador enquanto não " +"conectado a pontos." + +#: BitTorrent/Rerequester.py:218 +msgid " Message from the tracker: " +msgstr " Mensagem do rastreador: " + +#: BitTorrent/Rerequester.py:224 +msgid "warning from tracker - " +msgstr "aviso do rastreador - " + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "O arquivo %s pertence a outro torrent em execução" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "O arquivo %s já existe, mas não é um arquivo normal" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Leitura curta - algo truncou os arquivos?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formato de arquivo de retomada rápida não suportado, talvez de outra versão " +"de cliente?" + +#: BitTorrent/Storage.py:240 +msgid "Fastresume info doesn't match file modification time" +msgstr "Informação de retomada rápida não bate com a hora de modificação" + +#: BitTorrent/Storage.py:243 +msgid "Fastresume data doesn't match actual filesize" +msgstr "Dados de retomada rápida não batem com o tamanho real do arquivo" + +#: BitTorrent/Storage.py:257 BitTorrent/StorageWrapper.py:284 +msgid "Couldn't read fastresume data: " +msgstr "Impossível ler dados de retomada rápida: " + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "dados errados no arquivo de restposta - total pequeno demais" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "dados errados no arquivo de restposta - total grande demais" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "verificando arquivo existente" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 ou informações de retomada rápida não bate com arquivo de " +"estado (dados faltando)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Informações de retomada rápida erradas (arquivos contêm mais dados)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Informações de retomada rápida erradas (valor ilegal)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" +"dados corrompidos no disco - talvez você tenha duas cópias em execução?" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"dito arquivo completo na inicialização, mas o pedaço falhou na verificação " +"de hash" + +#: BitTorrent/TorrentQueue.py:120 +msgid "Could not load saved state: " +msgstr "Impossível carregar estado salvo: " + +#: BitTorrent/TorrentQueue.py:160 +msgid "Version check failed: no DNS library" +msgstr "Verificação da versão falhou: sem biblioteca DNS" + +#: BitTorrent/TorrentQueue.py:177 +msgid "DNS query failed" +msgstr "Consulta ao DNS falhou" + +#: BitTorrent/TorrentQueue.py:179 +msgid "number of received TXT fields is not 1" +msgstr "Número de campos TXT recebidos não é 1" + +#: BitTorrent/TorrentQueue.py:182 +msgid "number of strings in reply is not 1?" +msgstr "Número de strings de resposta não é 1?" + +#: BitTorrent/TorrentQueue.py:192 +msgid "Could not parse new version string" +msgstr "Impossível interpretar a string de nova versão" + +#: BitTorrent/TorrentQueue.py:202 +#, python-format +msgid "" +"A newer version of BitTorrent is available.\n" +"You can always get the latest version from\n" +"%s." +msgstr "" +"Está disponível uma nova versão do BitTorrent.\n" +"Você sempre pode pegar a mais nova versão em\n" +"%s." + +#: BitTorrent/TorrentQueue.py:207 +msgid "Version check failed: " +msgstr "Verificação de versão falhou: " + +#: BitTorrent/TorrentQueue.py:244 +msgid "Could not save UI state: " +msgstr "Impossível salvar estado da IU: " + +#: BitTorrent/TorrentQueue.py:254 BitTorrent/TorrentQueue.py:256 +#: BitTorrent/TorrentQueue.py:329 BitTorrent/TorrentQueue.py:332 +#: BitTorrent/TorrentQueue.py:342 BitTorrent/TorrentQueue.py:354 +#: BitTorrent/TorrentQueue.py:371 +msgid "Invalid state file contents" +msgstr "Conteúdo de arquivo de estado inválido" + +#: BitTorrent/TorrentQueue.py:269 +msgid "Error reading file " +msgstr "Erro lendo arquivo " + +#: BitTorrent/TorrentQueue.py:271 +msgid "cannot restore state completely" +msgstr "Impossível salvar estado completamente" + +#: BitTorrent/TorrentQueue.py:274 +msgid "Invalid state file (duplicate entry)" +msgstr "Arquivo de estado inválido (entrada duplicada)" + +#: BitTorrent/TorrentQueue.py:280 BitTorrent/TorrentQueue.py:285 +msgid "Corrupt data in " +msgstr "Dados corrompidos em " + +#: BitTorrent/TorrentQueue.py:281 BitTorrent/TorrentQueue.py:286 +msgid " , cannot restore torrent (" +msgstr " , impossível restaurar torrent (" + +#: BitTorrent/TorrentQueue.py:300 +msgid "Invalid state file (bad entry)" +msgstr "Arquivo de estado inválido (entrada errada)" + +#: BitTorrent/TorrentQueue.py:319 +msgid "Bad UI state file" +msgstr "Arquivo de estado da IU errado" + +#: BitTorrent/TorrentQueue.py:323 +msgid "Bad UI state file version" +msgstr "Versão do arquivo de estado da IU errada" + +#: BitTorrent/TorrentQueue.py:325 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versão do arquivo de estado da IU não suportada (de uma versão mais nova?)" + +#: BitTorrent/TorrentQueue.py:496 +msgid "Could not delete cached metainfo file:" +msgstr "Impossível apagar arquivo de metainfo em cache:" + +#: BitTorrent/TorrentQueue.py:519 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Este não é um arquivo torrent válido. (%s)" + +#: BitTorrent/TorrentQueue.py:527 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Este torrent (ou um com o mesmo conteúdo) já está em execução." + +#: BitTorrent/TorrentQueue.py:531 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Este torrent (ou um com o mesmo conteúdo) já está aguardando para exeucção." + +#: BitTorrent/TorrentQueue.py:538 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent em estato desconhecido %d" + +#: BitTorrent/TorrentQueue.py:555 +msgid "Could not write file " +msgstr "Impossível escrever em arquivo" + +#: BitTorrent/TorrentQueue.py:557 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrent não reiniciará corretamente quando o cliente reiniciar" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Impossível executar mais que %d torrents simultaneamente. Para maiores " +"informações, veja o FAQ em %s." + +#: BitTorrent/TorrentQueue.py:758 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Não iniciando o torrent, pois há outros torrents aguardando para execução, e " +"este já atende às configurações de quando parar de semear." + +#: BitTorrent/TorrentQueue.py:764 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Não iniciando o torrent, pois este já atende às configurações de quando " +"parar de semear o último torrent concluído." + +#: BitTorrent/__init__.py:20 +msgid "Python 2.2.1 or newer required" +msgstr "Requer Python 2.2.1 ou mais novo" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "não é uma string codificada válida" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "valor codificado inválido (dados após prefixo válido)" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo errada - não é dicionário" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo errada - chave de pedaços errada" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo errada - comprimento ilegal de pedaço" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo errada - nome errado" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "nome %s proibido por questões de segurança" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "confusão de arquivo simples/múltiplo" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo errada - comprimento errado" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo errada - \"arquivos\" não é uma lista de arquivos" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo errada - valor de arquivo errado" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo errada - caminho errado" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo errada - caminho de diretório errado" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "caminho %s proibido por questões de segurança" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo errada - caminho duplicado" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo errada - nome usado ao mesmo tempo para arquivo e subdiretório" + +#: BitTorrent/btformats.py:78 +msgid "bad metainfo - wrong object type" +msgstr "metainfo errada - tipo de objeto errado" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo errada - sem string da URL de anúncio" + +#: BitTorrent/btformats.py:88 +msgid "non-text failure reason" +msgstr "motivo de falha não-textual" + +#: BitTorrent/btformats.py:92 +msgid "non-text warning message" +msgstr "mensagem de aviso não-textual" + +#: BitTorrent/btformats.py:97 +msgid "invalid entry in peer list1" +msgstr "entrada inválida na lista de pontos 1" + +#: BitTorrent/btformats.py:99 +msgid "invalid entry in peer list2" +msgstr "entrada inválida na lista de pontos 2" + +#: BitTorrent/btformats.py:102 +msgid "invalid entry in peer list3" +msgstr "entrada inválida na lista de pontos 3" + +#: BitTorrent/btformats.py:106 +msgid "invalid entry in peer list4" +msgstr "entrada inválida na lista de pontos 4" + +#: BitTorrent/btformats.py:108 +msgid "invalid peer list" +msgstr "lista de pontos inválida" + +#: BitTorrent/btformats.py:111 +msgid "invalid announce interval" +msgstr "intervalo de anúncio inválido" + +#: BitTorrent/btformats.py:114 +msgid "invalid min announce interval" +msgstr "intervalo mínimo de anúncio inválido" + +#: BitTorrent/btformats.py:116 +msgid "invalid tracker id" +msgstr "id do rastreador inválido" + +#: BitTorrent/btformats.py:119 +msgid "invalid peer count" +msgstr "número de ponto inválido" + +#: BitTorrent/btformats.py:122 +msgid "invalid seed count" +msgstr "número de semente inválido" + +#: BitTorrent/btformats.py:125 +msgid "invalid \"last\" entry" +msgstr "\"Última\" entrada inválida" + +#: BitTorrent/configfile.py:125 +msgid "Could not permanently save options: " +msgstr "Impossível salvar permanentemente as opções: " + +#: BitTorrent/controlsocket.py:108 BitTorrent/controlsocket.py:157 +msgid "Could not create control socket: " +msgstr "Impossível criar socket de controle: " + +#: BitTorrent/controlsocket.py:116 BitTorrent/controlsocket.py:134 +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:187 +msgid "Could not send command: " +msgstr "Impossível enviar comando: " + +#: BitTorrent/controlsocket.py:144 +msgid "Could not create control socket: already in use" +msgstr "Impossível criar socket de controle: já em uso" + +#: BitTorrent/controlsocket.py:149 +msgid "Could not remove old control socket filename:" +msgstr "Impossível remover nome de arquivo do socket de controle antigo:" + +#: BitTorrent/defaultargs.py:32 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"diretório sob o qual dados de variáveis tais como informação de retomada " +"rápida e estado da IGU são salvos. Padrão no subdiretório 'data' do " +"diretório de configuração do bittorrent." + +#: BitTorrent/defaultargs.py:36 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codificação de caracteres usada no sistema de arquivos local. Autodetectado, " +"se deixado vazio. Detecção automática não funciona em versões do python " +"anteriores a 2.3" + +#: BitTorrent/defaultargs.py:40 +msgid "ISO Language code to use" +msgstr "" + +#: BitTorrent/defaultargs.py:45 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"endereço IP para informar ao rastreador (não tem efeito, a menos que você " +"esteja na mesma rede local que o rastreador)" + +#: BitTorrent/defaultargs.py:48 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "número porta vísivel externamente se for diferende da de escuta local" + +#: BitTorrent/defaultargs.py:51 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "Porta mínima de escuta, aumentando se indisponível" + +#: BitTorrent/defaultargs.py:53 +msgid "maximum port to listen on" +msgstr "Porta máxima de escuta" + +#: BitTorrent/defaultargs.py:55 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "endereço IP para ligar localmente" + +#: BitTorrent/defaultargs.py:57 +msgid "seconds between updates of displayed information" +msgstr "segundos entre atualizações de informação mostrada" + +#: BitTorrent/defaultargs.py:59 +msgid "minutes to wait between requesting more peers" +msgstr "minutos de espera entre pedidos de mais pontos" + +#: BitTorrent/defaultargs.py:61 +msgid "minimum number of peers to not do rerequesting" +msgstr "número mínimo de pontos para não fazer re-solicitações" + +#: BitTorrent/defaultargs.py:63 +msgid "number of peers at which to stop initiating new connections" +msgstr "número de pontos em que parar de iniciar novas conexões" + +#: BitTorrent/defaultargs.py:65 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"número máximo de conexões permitidas, acima disso novas conexões entrantes " +"serão imediatamente fechadas" + +#: BitTorrent/defaultargs.py:68 +msgid "whether to check hashes on disk" +msgstr "se verifica hashes no disco" + +#: BitTorrent/defaultargs.py:70 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "máximo de kB/s para o upload, 0 significa sem limite" + +#: BitTorrent/defaultargs.py:72 +#, fuzzy +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "o número de uploads a preencher com desengasgos extras otimistas" + +#: BitTorrent/defaultargs.py:74 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"o número máximo de arquivos num torrent multi-arquivos a permanecerem " +"abertos simultaneamente, 0 significa sem limite. Usado para evitar ficar sem " +"descritores de arquivo." + +#: BitTorrent/defaultargs.py:81 +msgid "number of seconds to pause between sending keepalives" +msgstr "número de segundos de pausa entre envio de keepalives" + +#: BitTorrent/defaultargs.py:83 +msgid "how many bytes to query for per request." +msgstr "quantos bytes pedir por solicitação." + +#: BitTorrent/defaultargs.py:85 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"máximo comprimento do prefixo de codificação aceitável na linha - valores " +"maiores fazem a conexão cair." + +#: BitTorrent/defaultargs.py:88 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "segundos a esperar entre fechamento de sockets que não receberam nada" + +#: BitTorrent/defaultargs.py:91 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"segundos a esperar entre verificação se ocorreu timeout em alguma conexão" + +#: BitTorrent/defaultargs.py:93 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"comprimento máximo de fatia a enviar para pontos, fechar conexão se recebida " +"solicitação maior" + +#: BitTorrent/defaultargs.py:96 BitTorrent/defaultargs.py:98 +msgid "maximum amount of time to guess the current rate estimate represents" +msgstr "" +"quantidade máxima de tempo para adivinhar quanto representa a taxa atual " +"esitmada" + +#: BitTorrent/defaultargs.py:100 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"tempo máximo de espera entre tentativas de anúncio se continuarem falhando" + +#: BitTorrent/defaultargs.py:102 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"segundos a esperar por dados entrantes numa conexão antes de assumir que ela " +"está semi-permanentemente engasgada" + +#: BitTorrent/defaultargs.py:105 +#, fuzzy +msgid "number of downloads at which to switch from random to rarest first" +msgstr "número de downloads para mudar, de aleatório para mais raro primeiro" + +#: BitTorrent/defaultargs.py:107 +msgid "how many bytes to write into network buffers at once." +msgstr "quantos bytes deverm ser escritos nos buffers de rede por vez." + +#: BitTorrent/defaultargs.py:109 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"recusar conexões adicionais de endereços com pontos falhos ou " +"intencionalmente hostis que enviam dados incorretos" + +#: BitTorrent/defaultargs.py:112 +msgid "do not connect to several peers that have the same IP address" +msgstr "não conectar a vários pontos que têm o mesmo endereço IP" + +#: BitTorrent/defaultargs.py:114 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"Se diferente de zero, ajuste a opção TOS para conexões de ponto para este " +"valor" + +#: BitTorrent/defaultargs.py:116 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"habilitar contornar falha na libc do BSD, que faz leituras de arquivos " +"ficarem muito lentas." + +#: BitTorrent/defaultargs.py:118 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "endereço do proxy HTTP para usar em conexões de rastreador" + +#: BitTorrent/defaultargs.py:120 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "fechar conexões com RST e evitar o estado TIME_WAIT do TCP" + +#: BitTorrent/defaultargs.py:122 +msgid "force max_allow_in to stay below 30 on Win32" +msgstr "forçar max_allow_in a permanecer abaixo de 30 on Win32" + +#: BitTorrent/defaultargs.py:139 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nome do arquivo (para torrents de único arquivo) ou nome do diretório (para " +"torrents em lote) para salvar o torrent, sobrescrevendo o nome padrão no " +"torrent. Veja também --save_in; se nenhum for especificado, o usuário será " +"perguntado sobre o local de salvamento" + +#: BitTorrent/defaultargs.py:144 +msgid "display advanced user interface" +msgstr "Mostrar interface de usuário avançada" + +#: BitTorrent/defaultargs.py:146 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"o número máximo de minutos para semear um torrent completo antes de parar a " +"semeadura" + +#: BitTorrent/defaultargs.py:149 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"a mínima razão entre upload/download, em percentual, a ser alcançada antes " +"de parar de semear. 0 significa sem limite." + +#: BitTorrent/defaultargs.py:152 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"a mínima razão entre upload/download, em percentual, a ser alcançada antes " +"de parar de semear o último torrent. 0 significa sem limite." + +#: BitTorrent/defaultargs.py:155 +msgid "start downloader in paused state" +msgstr "inicar baixador em estado de pausa" + +#: BitTorrent/defaultargs.py:157 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"especifica como o aplicativo deve se comportar quando o usuário tenta " +"manualmente iniciar outro torrent: \"substituir\" significa sempre " +"substituir o torrent em execução com o novo, \"adicionar\" significa sempre " +"adicionar ao torrent em execução em paralelo, e \"perguntar\" significa " +"perguntar ao usuário a cada vez." + +#: BitTorrent/defaultargs.py:171 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nome do arquivo (para torrents de único arquivo) ou nome do diretório (para " +"torrents em lote) para salvar o torrent, sobrescrevendo o nome padrão no " +"torrent. Veja também --save_in" + +#: BitTorrent/defaultargs.py:178 BitTorrent/defaultargs.py:198 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at once." +msgstr "" +"o número máximo de uploads permitidos por vez. -1 significa um número " +"razoável baseado em --max_upload_rate (deseja-se desta forma). Os valores " +"automáticos só são sensíveis ao executar um torrent por vez." + +#: BitTorrent/defaultargs.py:183 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"diretório local onde o conteúdo do torrent será salvo. O arquivo (torrents " +"de único arquivo) ou diretório (torrents em lote) serão criados dentro desse " +"dirtetório usando o nome padrão especificado no arquivo .torrent. Veja " +"também --save_as." + +#: BitTorrent/defaultargs.py:188 +msgid "file the server response was stored in, alternative to url" +msgstr "arquivo que armazena a resposta do servidor, alternativa à URL" + +#: BitTorrent/defaultargs.py:190 +msgid "url to get file from, alternative to responsefile" +msgstr "URL de onde pegar o arquivo, alternativa ao arquivo de resposta" + +#: BitTorrent/defaultargs.py:192 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "Se perguntar ou não por um local onde salvar os arquivos baixados" + +#: BitTorrent/defaultargs.py:203 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"diretório local onde os torrents serão salvos, usando um nome determinado " +"por --saveas_style. Se deixado em branco, cada torrent será salvo no " +"diretório do arquivo .torrent correspondente" + +#: BitTorrent/defaultargs.py:208 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "Freqüência de busca no diretório do torrent, em segundos" + +#: BitTorrent/defaultargs.py:210 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Como nomear downloads de torrent: 1: use o nome DO arquivo torrent (menos o ." +"torrent); 2: use o nome codificado NO arquivo torrent; 3: crie um diretório " +"com o nome DO arquivo torrent (menos o .torrent) e salve naquele diretório " +"usando o nome codificado NO arquivo torrent; 4: se o nome DO arquivo torrent " +"(menos o .torrent) e o nome codificado NO arquivo torrent são idênticos, use " +"aquele nome (estilo 1/2), ou crie um diretório intermediário como no estilo " +"3; CUIDADO: opções 1 e 2 têm a capacidade de sobrescrever arquivos sem " +"advertir e podem apresentar problemas de segurança." + +#: BitTorrent/defaultargs.py:225 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "se mostra o caminho completo do conteúdo do torrent para cada torrent" + +#: BitTorrent/defaultargs.py:232 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "diretório de busca por arquivos .torrent (semi-recursivo)" + +#: BitTorrent/defaultargs.py:237 +msgid "whether to display diagnostic info to stdout" +msgstr "se mostra informações de diagnóstico em stdout" + +#: BitTorrent/defaultargs.py:242 +msgid "which power of two to set the piece size to" +msgstr "que potência de dois deve ser escolhida como tamanho do pedaço" + +#: BitTorrent/defaultargs.py:244 +msgid "default tracker name" +msgstr "nome padrão do rastreador" + +#: BitTorrent/defaultargs.py:247 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"se falso gerar um torrent sem rastreador, ao invés de URL de anúncio, use um " +"nó confiável na forma : ou uma string vazia para puxar " +"alguns nós de sua tabela de roteamento" + +#: BitTorrent/download.py:92 +msgid "maxport less than minport - no ports to check" +msgstr "porta máxima menor que porta mínima - sem portas para verificar" + +#: BitTorrent/download.py:104 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Impossível abrir uma porta de escuta: %s." + +#: BitTorrent/download.py:106 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Impossível abrir uma porta de escuta: %s. " + +#: BitTorrent/download.py:108 +msgid "Check your port range settings." +msgstr "Verifique suas configurações de faixa de portas." + +#: BitTorrent/download.py:212 +msgid "Initial startup" +msgstr "Inicialização" + +#: BitTorrent/download.py:264 +#, python-format +msgid "Could not load fastresume data: %s. " +msgstr "Impossível carregar dados de retomada rápida: %s. " + +#: BitTorrent/download.py:265 +msgid "Will perform full hash check." +msgstr "Fará verificação de hash completa." + +#: BitTorrent/download.py:272 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "falhou a verificação de hash do pedaço %d, baixando-o novamente" + +#: BitTorrent/download.py:383 BitTorrent/launchmanycore.py:139 +msgid "downloading" +msgstr "baixando" + +#: BitTorrent/download.py:393 +msgid "download failed: " +msgstr "download falhou: " + +#: BitTorrent/download.py:397 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Erro de E/S: Espaço insuficiente no disco, ou impossível criar arquivo tão " +"grande:" + +#: BitTorrent/download.py:400 +msgid "killed by IO error: " +msgstr "morto por erro de E/S: " + +#: BitTorrent/download.py:403 +msgid "killed by OS error: " +msgstr "morto por erro no SO: " + +#: BitTorrent/download.py:408 +msgid "killed by internal exception: " +msgstr "morto por exceção interna: " + +#: BitTorrent/download.py:413 +msgid "Additional error when closing down due to error: " +msgstr "Erro adicional quando fechendo devido a erro: " + +#: BitTorrent/download.py:426 +msgid "Could not remove fastresume file after failure:" +msgstr "Impossível remover arquivo de retomada rápida após a falha:" + +#: BitTorrent/download.py:443 +msgid "seeding" +msgstr "semeando" + +#: BitTorrent/download.py:466 +msgid "Could not write fastresume data: " +msgstr "Impossível escrever dados de retomada rápida: " + +#: BitTorrent/download.py:476 +msgid "shut down" +msgstr "desligar" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Impossível mandar manuseador de sinal: " + +#: BitTorrent/launchmanycore.py:69 btdownloadcurses.py:354 +#: btdownloadheadless.py:237 +msgid "shutting down" +msgstr "desligando" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "descartado \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "adicionado \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "agruardando por verificação de hash" + +#: BitTorrent/launchmanycore.py:142 btlaunchmanycurses.py:58 +msgid "connecting to peers" +msgstr "conectando aos pontos" + +#: BitTorrent/launchmanycore.py:232 btdownloadcurses.py:361 +#: btdownloadheadless.py:244 +msgid "Error reading config: " +msgstr "Erro ao ler configuração: " + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Relendo arquivo de configuração" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Você não pode especificar o nome do arquivo .torrent quando estiver gerando " +"torrents múltiplos de uma vez" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" +"A codifificação de seistema de arquivos \"%s\" não é suportada por esta " +"versão" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Impossível converter nome de arquivo/diretório \"%s\" para utf-8 (%s). Ou a " +"codificação de sistema de arquivos assumida \"%s\" está errada ou contém " +"bytes ilegais" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"O nome de arquivo/diretório \"%s\" contém vlores unicode reservados que não " +"correspondem a caracteres." + +#: BitTorrent/parseargs.py:23 +#, python-format +msgid "Usage: %s " +msgstr "Uso: %s " + +#: BitTorrent/parseargs.py:25 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPÇÕES] [DIRETÓRIODOTORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:26 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Se um argumento que não é opção estiver presente será \n" +"tomado como o valor da opção torrent_dir.\n" + +#: BitTorrent/parseargs.py:29 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPÇÕES] [ARQUIVOSTORRENT]\n" + +#: BitTorrent/parseargs.py:31 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPÇÕES] [ARQUIVOTORRENT]\n" + +#: BitTorrent/parseargs.py:33 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPÇÃO] URL_RASTREADOR ARQUIVO [ARQUIVO]\n" + +#: BitTorrent/parseargs.py:35 +msgid "arguments are -\n" +msgstr "os argumentos são -\n" + +#: BitTorrent/parseargs.py:66 +msgid " (defaults to " +msgstr " (padrão de " + +#: BitTorrent/parseargs.py:115 BitTorrent/parseargs.py:152 +msgid "unknown key " +msgstr "chave desconhecida " + +#: BitTorrent/parseargs.py:121 BitTorrent/parseargs.py:131 +msgid "parameter passed in at end with no value" +msgstr "parâmetro passado ao final sem valor" + +#: BitTorrent/parseargs.py:135 +msgid "command line parsing failed at " +msgstr "interpretação da linha de comando falhou em " + +#: BitTorrent/parseargs.py:142 +#, python-format +msgid "Option %s is required." +msgstr "Opção %s é obrigatória." + +#: BitTorrent/parseargs.py:144 +#, python-format +msgid "Must supply at least %d args." +msgstr "Deve fornecer pelo menos %d argumentos." + +#: BitTorrent/parseargs.py:146 +#, python-format +msgid "Too many args - %d max." +msgstr "Argumentos demais - máximo de %d." + +#: BitTorrent/parseargs.py:176 +#, python-format +msgid "wrong format of %s - %s" +msgstr "formato errado de %s - %s" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Impossível ler diretório " + +#: BitTorrent/parsedir.py:43 +#, fuzzy +msgid "Could not stat " +msgstr "Impossível ver status de " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "removendo %s (re-adicionará)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**atenção** %s é um torrent duplicado de %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**atenção** %s tem erros" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... com sucesso" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "removendo %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "verificação concluída" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Porta de escuta." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "arquivo para armazenar inrformação de baixador recente" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tempo limite para fechar conexões" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "segundos entre salvamento de dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "segundos entre expiração de quem baixa" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "segundos que quem baixa deve esperar entre reanúncios" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send in an info message if the client does not " +"specify a number" +msgstr "" +"número padrão de pontos para mandar uma mensagem de informação se o cliente " +"não especificar um número" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"tempo de espera entre verificação se qualquer das conexões exprirou o tempo" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"número de vezes a verificar de quem baixa está atrás de um NAT ( 0 = não " +"verificar)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "se adicionar entradas ao log para verificação de NAT" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "tempo mínimo decorrido desde a última descarga para outra" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"tempo mínimo em segundos antes de um cache ser considerado estagnado e " +"jogado fora" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"só permitir downlods de .torrents neste diretório (e recursivamente em " +"subdiretórios de diretórios que não possuam arquivos .torrent). Se marcado, " +"os torrents neste diretório aparecerão numa página de informações, " +"independente de terem pontos ou não" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permite que chaves especiais em torrents em allowed_dir afetem o acesso ao " +"rastreador" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "Se reabre o arquivo de log no recebimento de um sinal HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"se mostra uma página de informação quando o diretório raiz do rastreador é " +"carregado" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "uma URL para redirecionar a página de informação" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "se mostra nomes do diretório permitido" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"Arquivo contendo dados x-icon a serem retornados quando o browser solicitar " +"favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorar o parâmetro IP GET de máquinas que não estão nos IPs da rede local " +"(0 = nunca, 1 = sempre, 2 = ignorar se verificação de NAT desabilitada). " +"Cabeçalhos de proxy HTTP dando endereço do cliente original serão tratados " +"da mesma forma que --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"arquivo para escrever os logs de rastreador, use - para stdout (padrão)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"use com allowed_dir; adiciona uma URL /arquivo?hash={hash} que permite aos " +"usuários baixar o arquivo torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"manter torrents mortos depois de expirar (para que eles ainda apareçam em " +"seu /scrape e página da web). Só importa se allowed_dir não está marcado" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "acesso a scrape permitido (pode ser nenhum, específico ou total)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "número máximo de pontos para dar com qualquer solicitação" + +#: BitTorrent/track.py:161 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"seu arquivo pode existir em qualquer lugar no universo,\n" +"mas não aqui\n" + +#: BitTorrent/track.py:246 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**atenção** arquivo especificado como favicon -- %s -- não existe." + +#: BitTorrent/track.py:269 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**atenção** arquivo de estado %s corrompido; reiniciando" + +#: BitTorrent/track.py:305 +msgid "# Log Started: " +msgstr "# Log Iniciado: " + +#: BitTorrent/track.py:307 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**atenção** impossível redirecionar stdout para o arquivo de log: " + +#: BitTorrent/track.py:315 +msgid "# Log reopened: " +msgstr "# Log reaberto: " + +#: BitTorrent/track.py:317 +msgid "**warning** could not reopen logfile" +msgstr "**atenção** impossível reabrir o arquivo de log" + +#: BitTorrent/track.py:457 +msgid "specific scrape function is not available with this tracker." +msgstr "função específica de scrape indisponível com este rastreador." + +#: BitTorrent/track.py:467 +msgid "full scrape function is not available with this tracker." +msgstr "função scrape total indisponível com este rastreador." + +#: BitTorrent/track.py:480 +msgid "get function is not available with this tracker." +msgstr "função de conseguir indisponível com este rastreador." + +#: BitTorrent/track.py:494 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Download solicitado não está autorizado para uso com este rastreador." + +#: BitTorrent/track.py:850 btlaunchmanycurses.py:287 +msgid "error: " +msgstr "erro: " + +#: BitTorrent/track.py:851 +msgid "run with no arguments for parameter explanations" +msgstr "rode sem argumentos para explicações sobre parâmetros" + +#: BitTorrent/track.py:859 +msgid "# Shutting down: " +msgstr "# Desligando: " + +#: btdownloadcurses.py:45 btlaunchmanycurses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Inicialização da IGU no modo texto falhou; impossível prosseguir." + +#: btdownloadcurses.py:47 btlaunchmanycurses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Essa interface de download requer o módulo padrão do Python \"curses\", que " +"infelizmente está indisponível para a versão nativa em Windows do Python. " +"Contudo está disponível para a versão Cygwin do Python, que roda em todos os " +"sistemas Win32 (www.cygwin.com)." + +#: btdownloadcurses.py:52 btlaunchmanycurses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Você ainda pode usar \"btdownloadheadless.py\" para baixar." + +#: btdownloadcurses.py:57 btdownloadheadless.py:39 +msgid "download complete!" +msgstr "download completo!" + +#: btdownloadcurses.py:62 btdownloadheadless.py:44 +msgid "" +msgstr "" + +#: btdownloadcurses.py:65 btdownloadheadless.py:47 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "terminando em %d:%02d:%02d" + +#: btdownloadcurses.py:151 +msgid "file:" +msgstr "arquivo:" + +#: btdownloadcurses.py:152 +msgid "size:" +msgstr "tamanho:" + +#: btdownloadcurses.py:153 +msgid "dest:" +msgstr "dest:" + +#: btdownloadcurses.py:154 +msgid "progress:" +msgstr "progresso:" + +#: btdownloadcurses.py:155 +msgid "status:" +msgstr "status:" + +#: btdownloadcurses.py:156 +msgid "dl speed:" +msgstr "vel downl:" + +#: btdownloadcurses.py:157 +msgid "ul speed:" +msgstr "vel upl:" + +#: btdownloadcurses.py:158 +msgid "sharing:" +msgstr "compartilhamento:" + +#: btdownloadcurses.py:159 +msgid "seeds:" +msgstr "sementes:" + +#: btdownloadcurses.py:160 +msgid "peers:" +msgstr "pontos:" + +#: btdownloadcurses.py:169 btdownloadheadless.py:94 +msgid "download succeeded" +msgstr "download bem-sucedido" + +#: btdownloadcurses.py:213 btdownloadheadless.py:128 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB up / %.1f MB down)" + +#: btdownloadcurses.py:216 btdownloadheadless.py:131 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB up / %.1f MB down)" + +#: btdownloadcurses.py:222 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d visto agora, mais %d cópias distribuídas(%s)" + +#: btdownloadcurses.py:227 btdownloadheadless.py:142 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d cópias distribuídas (próxima: %s)" + +#: btdownloadcurses.py:249 +msgid "error(s):" +msgstr "erro(s):" + +#: btdownloadcurses.py:258 +msgid "error:" +msgstr "erro:" + +#: btdownloadcurses.py:261 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Upload Download Completo Velocidade" + +#: btdownloadcurses.py:306 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "baixando %d pedaços, tem %d fragmentos, %d de %d pedaços completos" + +#: btdownloadcurses.py:336 btdownloadheadless.py:219 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Impossível especificar --save_as and --save_in simultanemente" + +#: btdownloadcurses.py:404 btdownloadheadless.py:287 +msgid "must have responsefile as arg or parameter, not both" +msgstr "" +"necessário ter o arquivo de resposta como argumento ou parâmetro, não ambos" + +#: btdownloadcurses.py:417 btdownloadheadless.py:300 +msgid "you must specify a .torrent file" +msgstr "você deve especificar um arquivo .torrent" + +#: btdownloadcurses.py:419 btdownloadheadless.py:302 +msgid "Error reading .torrent file: " +msgstr "Erro lendo arquivo .torrent: " + +#: btdownloadcurses.py:429 +msgid "These errors occurred during execution:" +msgstr "Ocorreram estes erros durante a execução:" + +#: btdownloadgui.py:24 btmaketorrentgui.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Instale Python 2.3 ou mais recente" + +#: btdownloadgui.py:38 +msgid "PyGTK 2.4 or newer required" +msgstr "Requer PyGTK 2.4 ou mais recente" + +#: btdownloadgui.py:104 +msgid "drag to reorder" +msgstr "arraste para reordenar" + +#: btdownloadgui.py:105 +msgid "right-click for menu" +msgstr "clique direito para menu" + +#: btdownloadgui.py:108 +#, python-format +msgid "rate: %s" +msgstr "taxa: %s" + +#: btdownloadgui.py:111 +msgid "dialup" +msgstr "discada" + +#: btdownloadgui.py:112 +msgid "DSL/cable 128k up" +msgstr "DSL/cabo com 128k de subida" + +#: btdownloadgui.py:113 +msgid "DSL/cable 256k up" +msgstr "DSL/cabo com 256k de subida" + +#: btdownloadgui.py:114 +msgid "DSL 768k up" +msgstr "DSL com 768k de subida" + +#: btdownloadgui.py:115 +msgid "T1" +msgstr "T1" + +#: btdownloadgui.py:116 +msgid "T1/E1" +msgstr "T1/E1" + +#: btdownloadgui.py:117 +msgid "E1" +msgstr "E1" + +#: btdownloadgui.py:118 +msgid "T3" +msgstr "T3" + +#: btdownloadgui.py:119 +msgid "OC3" +msgstr "OC3" + +#: btdownloadgui.py:297 +msgid "Maximum upload " +msgstr "Subida máxima" + +#: btdownloadgui.py:310 +msgid "Temporarily stop all running torrents" +msgstr "Parando temporariamente todos torrents em ação" + +#: btdownloadgui.py:311 +msgid "Resume downloading" +msgstr "Retomar download" + +#: btdownloadgui.py:350 +#, python-format +msgid "New %s version available" +msgstr "Nova %s versão disponível" + +#: btdownloadgui.py:365 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Uma nova versão de %s está disponível.\n" + +#: btdownloadgui.py:366 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Você está usando %s, e a nova versão é %s.\n" + +#: btdownloadgui.py:367 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Você sempre pode pegar a mais nova versão em\n" +"%s" + +#: btdownloadgui.py:374 btdownloadgui.py:1789 btdownloadgui.py:1894 +msgid "Download _later" +msgstr "Baixar_depois" + +#: btdownloadgui.py:377 btdownloadgui.py:1753 +msgid "Download _now" +msgstr "Baixar_agora" + +#: btdownloadgui.py:383 +msgid "_Remind me later" +msgstr "_Lembre-me depois" + +#: btdownloadgui.py:415 +#, python-format +msgid "About %s" +msgstr "Sobre %s" + +#: btdownloadgui.py:430 +msgid "Beta" +msgstr "Beta" + +#: btdownloadgui.py:432 +#, python-format +msgid "Version %s" +msgstr "Versão %s" + +#: btdownloadgui.py:451 +msgid "Donate" +msgstr "Faça sua doação" + +#: btdownloadgui.py:471 +#, python-format +msgid "%s Activity Log" +msgstr "%s Log de Atividade" + +#: btdownloadgui.py:528 +msgid "Save log in:" +msgstr "Salvar log em:" + +#: btdownloadgui.py:539 +msgid "log saved" +msgstr "log salvo" + +#: btdownloadgui.py:598 +msgid "log cleared" +msgstr "log limpo" + +#: btdownloadgui.py:610 +#, python-format +msgid "%s Settings" +msgstr "%s Configurações" + +#: btdownloadgui.py:621 +msgid "Saving" +msgstr "Salvando" + +#: btdownloadgui.py:623 +msgid "Download folder:" +msgstr "Pasta para Download:" + +#: btdownloadgui.py:630 +msgid "Default:" +msgstr "Padrão:" + +#: btdownloadgui.py:637 +msgid "Change..." +msgstr "Modificar..." + +#: btdownloadgui.py:641 +msgid "Ask where to save each download" +msgstr "Perguntar onde salvar carda download" + +#: btdownloadgui.py:655 +msgid "Downloading" +msgstr "Baixando" + +#: btdownloadgui.py:657 +msgid "Starting additional torrents manually:" +msgstr "Iniciando torrents adicionais manualmente:" + +#: btdownloadgui.py:666 +msgid "Always stops the _last running torrent" +msgstr "Sempre parar o _último torrent em execução" + +#: btdownloadgui.py:672 +msgid "Always starts the torrent in _parallel" +msgstr "Sempre iniciar o torrent em _paralelo" + +#: btdownloadgui.py:678 +msgid "_Asks each time" +msgstr "_Perguntar cada vez" + +#: btdownloadgui.py:692 +msgid "Seed completed torrents:" +msgstr "Semear torrents completos:" + +#: btdownloadgui.py:700 btdownloadgui.py:729 +msgid "until share ratio reaches " +msgstr "até a proporção de compartilhamento alcance " + +#: btdownloadgui.py:706 +msgid " percent, or" +msgstr " por cento, ou" + +#: btdownloadgui.py:712 +msgid "for " +msgstr "por " + +#: btdownloadgui.py:718 +msgid " minutes, whichever comes first." +msgstr " minutos, o que acontecer primeiro." + +#: btdownloadgui.py:725 +msgid "Seed last completed torrent:" +msgstr "Semear o último torrent completado:" + +#: btdownloadgui.py:735 +msgid " percent." +msgstr " por cento." + +#: btdownloadgui.py:741 +msgid "\"0 percent\" means seed forever." +msgstr "\"0 por cento\" significa semear indefinidamente." + +#: btdownloadgui.py:750 +msgid "Network" +msgstr "Rede" + +#: btdownloadgui.py:752 +msgid "Look for available port:" +msgstr "Procurar por porta disponível:" + +#: btdownloadgui.py:755 +msgid "starting at port: " +msgstr "iniciando na porta: " + +#: btdownloadgui.py:768 +msgid "IP to report to the tracker:" +msgstr "IP para informar ao rastreador:" + +#: btdownloadgui.py:773 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Sem efeito, a menos que esteja na\n" +"mesma rede local que o rastreador)" + +#: btdownloadgui.py:778 +msgid "Potential Windows TCP stack fix" +msgstr "Conserto potencial da pilha TCP do Windows" + +#: btdownloadgui.py:792 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Texto da barra de progresso sempre preto\n" +"(é preciso reiniciar)" + +#: btdownloadgui.py:805 +msgid "Misc" +msgstr "Miscelâneas" + +#: btdownloadgui.py:812 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ATENÇÃO: Mudar esses valores pode\n" +"fazer %s não funcionar corretamente." + +#: btdownloadgui.py:820 +msgid "Option" +msgstr "Opção" + +#: btdownloadgui.py:825 +msgid "Value" +msgstr "Valor" + +#: btdownloadgui.py:832 +msgid "Advanced" +msgstr "Avançado" + +#: btdownloadgui.py:841 +msgid "Choose default download directory" +msgstr "Escolha o diretório padrão para download" + +#: btdownloadgui.py:902 +#, python-format +msgid "Files in \"%s\"" +msgstr "Arquivos em \"%s\"" + +#: btdownloadgui.py:911 +msgid "Apply" +msgstr "Aplicar" + +#: btdownloadgui.py:912 +msgid "Allocate" +msgstr "Alocar" + +#: btdownloadgui.py:913 +msgid "Never download" +msgstr "Nunca baixar" + +#: btdownloadgui.py:914 +msgid "Decrease" +msgstr "Diminuir" + +#: btdownloadgui.py:915 +msgid "Increase" +msgstr "Aumentar" + +#: btdownloadgui.py:925 btlaunchmanycurses.py:142 +msgid "Filename" +msgstr "Nome de arquivo" + +#: btdownloadgui.py:925 +msgid "Length" +msgstr "Comprimento" + +#: btdownloadgui.py:925 +msgid "%" +msgstr "%" + +#: btdownloadgui.py:1089 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Pontos para \"%s\"" + +#: btdownloadgui.py:1095 +msgid "IP address" +msgstr "endereço IP" + +#: btdownloadgui.py:1095 +msgid "Client" +msgstr "Cliente" + +#: btdownloadgui.py:1095 +msgid "Connection" +msgstr "Conexão" + +#: btdownloadgui.py:1095 +msgid "KB/s down" +msgstr "KB/s down" + +#: btdownloadgui.py:1095 +msgid "KB/s up" +msgstr "KB/s up" + +#: btdownloadgui.py:1095 +msgid "MB downloaded" +msgstr "MB baixado" + +#: btdownloadgui.py:1095 +msgid "MB uploaded" +msgstr "MB subido" + +#: btdownloadgui.py:1095 +#, python-format +msgid "% complete" +msgstr "% completo" + +#: btdownloadgui.py:1095 +msgid "KB/s est. peer download" +msgstr "KB/s est. download do ponto" + +#: btdownloadgui.py:1101 +msgid "Peer ID" +msgstr "ID do ponto" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Interested" +msgstr "Interessado" + +#: btdownloadgui.py:1104 btdownloadgui.py:1107 +msgid "Choked" +msgstr "Engasgado" + +#: btdownloadgui.py:1104 +msgid "Snubbed" +msgstr "Ignorado" + +#: btdownloadgui.py:1107 +msgid "Optimistic upload" +msgstr "Upload otimista" + +#: btdownloadgui.py:1188 +msgid "remote" +msgstr "remoto" + +#: btdownloadgui.py:1188 +msgid "local" +msgstr "local" + +#: btdownloadgui.py:1224 +msgid "bad peer" +msgstr "ponto errado" + +#: btdownloadgui.py:1234 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: btdownloadgui.py:1235 +#, python-format +msgid "%d bad" +msgstr "%d errado" + +#: btdownloadgui.py:1237 +msgid "banned" +msgstr "banido" + +#: btdownloadgui.py:1239 +msgid "ok" +msgstr "ok" + +#: btdownloadgui.py:1275 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informações sobre \"%s\"" + +#: btdownloadgui.py:1293 +msgid "Torrent name:" +msgstr "Nome do Torrent:" + +#: btdownloadgui.py:1298 +msgid "(trackerless torrent)" +msgstr "(torrent sem rastreador)" + +#: btdownloadgui.py:1301 +msgid "Announce url:" +msgstr "URL de anúncio:" + +#: btdownloadgui.py:1305 +msgid ", in one file" +msgstr ", em um arquivo" + +#: btdownloadgui.py:1307 +#, python-format +msgid ", in %d files" +msgstr ", em %d arquivos" + +#: btdownloadgui.py:1308 +msgid "Total size:" +msgstr "Tamanho total:" + +#: btdownloadgui.py:1315 +msgid "Pieces:" +msgstr "Pedaços:" + +#: btdownloadgui.py:1317 +msgid "Info hash:" +msgstr "Hash de informação:" + +#: btdownloadgui.py:1327 +msgid "Save in:" +msgstr "Salvar em:" + +#: btdownloadgui.py:1331 +msgid "File name:" +msgstr "Nome do arquivo:" + +#: btdownloadgui.py:1357 +msgid "Open directory" +msgstr "Abrir diretório" + +#: btdownloadgui.py:1363 +msgid "Show file list" +msgstr "Mostrar lista de arquivos" + +#: btdownloadgui.py:1458 +msgid "Torrent info" +msgstr "Informações do torrent" + +#: btdownloadgui.py:1467 btdownloadgui.py:1890 +msgid "Remove torrent" +msgstr "Remover torrent" + +#: btdownloadgui.py:1471 +msgid "Abort torrent" +msgstr "Cancelar torrent" + +#: btdownloadgui.py:1528 +#, python-format +msgid ", will seed for %s" +msgstr ", vai semear por %s" + +#: btdownloadgui.py:1530 +msgid ", will seed indefinitely." +msgstr ", vai semear indefinidamente." + +#: btdownloadgui.py:1533 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Concluído, proporção de compartilhamento: %d%%" + +#: btdownloadgui.py:1536 +#, python-format +msgid "Done, %s uploaded" +msgstr "Concluído, %s com upload feito" + +#: btdownloadgui.py:1568 +msgid "Torrent _info" +msgstr "_Informação do torrent" + +#: btdownloadgui.py:1569 +msgid "_Open directory" +msgstr "_Abrir diretório" + +#: btdownloadgui.py:1570 +msgid "_Change location" +msgstr "_Mudar localização" + +#: btdownloadgui.py:1572 +msgid "_File list" +msgstr "Lista de _Arquivos" + +#: btdownloadgui.py:1646 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Tem certeza que quer remover \"%s\"?" + +#: btdownloadgui.py:1649 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Sua proporção de compartilhament para este torrent é %d%%. " + +#: btdownloadgui.py:1651 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Você fez upload de %s para este torrent. " + +#: btdownloadgui.py:1654 +msgid "Remove this torrent?" +msgstr "Remover este torrent?" + +#: btdownloadgui.py:1673 +msgid "Finished" +msgstr "Concluído" + +#: btdownloadgui.py:1674 +msgid "drag into list to seed" +msgstr "arraste para a lista para semear" + +#: btdownloadgui.py:1677 +msgid "Failed" +msgstr "Falhou" + +#: btdownloadgui.py:1678 +msgid "drag into list to resume" +msgstr "arraste para a lista para continuar" + +#: btdownloadgui.py:1687 +msgid "Re_start" +msgstr "Rei_niciar" + +#: btdownloadgui.py:1688 btdownloadgui.py:1759 btdownloadgui.py:1795 +#: btdownloadgui.py:1900 +msgid "_Remove" +msgstr "_Remover" + +#: btdownloadgui.py:1738 +msgid "Waiting" +msgstr "Aguardando" + +#: btdownloadgui.py:1758 btdownloadgui.py:1794 btdownloadgui.py:1899 +msgid "_Finish" +msgstr "_Terminar" + +#: btdownloadgui.py:1761 btdownloadgui.py:1790 btdownloadgui.py:1895 +msgid "_Abort" +msgstr "_Cancelar" + +#: btdownloadgui.py:1776 +msgid "Paused" +msgstr "em Pausa" + +#: btdownloadgui.py:1817 +msgid "Running" +msgstr "em Execução" + +#: btdownloadgui.py:1841 +#, python-format +msgid "Current up: %s" +msgstr "Subida atual: %s" + +#: btdownloadgui.py:1842 +#, python-format +msgid "Current down: %s" +msgstr "Descida atual: %s" + +#: btdownloadgui.py:1848 +#, python-format +msgid "Previous up: %s" +msgstr "Subida anterior: %s" + +#: btdownloadgui.py:1849 +#, python-format +msgid "Previous down: %s" +msgstr "Descida anterior: %s" + +#: btdownloadgui.py:1855 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Prop. compart.: %0.02f%%" + +#: btdownloadgui.py:1858 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s pontos, %s sementes. Totais do rastreador: %s" + +#: btdownloadgui.py:1862 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Cópias distribuídas: %d; Próxima: %s" + +#: btdownloadgui.py:1865 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Pedaços: %d total, %d completo, %d parcial, %d ativo (%d vazio)" + +#: btdownloadgui.py:1869 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d pedaços errados + %s em solicitações descartadas" + +#: btdownloadgui.py:1903 +msgid "_Peer list" +msgstr "_Lista de pontos" + +#: btdownloadgui.py:1962 +msgid "Done" +msgstr "Concluído" + +#: btdownloadgui.py:1977 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% concluído, %s restando" + +#: btdownloadgui.py:1985 +msgid "Download " +msgstr "Download " + +#: btdownloadgui.py:1987 +msgid "Upload " +msgstr "Upload " + +#: btdownloadgui.py:2002 +msgid "NA" +msgstr "NA" + +#: btdownloadgui.py:2343 +#, python-format +msgid "%s started" +msgstr "%s iniciado" + +#: btdownloadgui.py:2356 +msgid "_Open torrent file" +msgstr "_Abrir arquivo de torrent" + +#: btdownloadgui.py:2357 +msgid "Make _new torrent" +msgstr "Fazer _novo torrent" + +#: btdownloadgui.py:2360 +msgid "_Pause/Play" +msgstr "_Pause/Play" + +#: btdownloadgui.py:2362 +msgid "_Quit" +msgstr "_Sair" + +#: btdownloadgui.py:2364 +msgid "Show/Hide _finished torrents" +msgstr "Mostrar/Esconder torrents _concluídos" + +#: btdownloadgui.py:2366 +msgid "_Resize window to fit" +msgstr "Redimensionar _janela para caber" + +#: btdownloadgui.py:2368 +msgid "_Log" +msgstr "_Log" + +#: btdownloadgui.py:2371 +msgid "_Settings" +msgstr "Config_urações" + +#: btdownloadgui.py:2374 btdownloadgui.py:2390 +msgid "_Help" +msgstr "_Ajuda" + +#: btdownloadgui.py:2376 +msgid "_About" +msgstr "_Sobre" + +#: btdownloadgui.py:2377 +msgid "_Donate" +msgstr "_Doe" + +#: btdownloadgui.py:2381 +msgid "_File" +msgstr "_Arquivo" + +#: btdownloadgui.py:2386 +msgid "_View" +msgstr "_Ver" + +#: btdownloadgui.py:2533 +msgid "(stopped)" +msgstr "(parado)" + +#: btdownloadgui.py:2545 +msgid "(multiple)" +msgstr "(múltiplo)" + +#: btdownloadgui.py:2659 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Ajuda para %s está em \n" +"%s\n" +"Você gostaria de ir lá agora?" + +#: btdownloadgui.py:2662 +msgid "Visit help web page?" +msgstr "Visitar a página da web de ajuda?" + +#: btdownloadgui.py:2698 +msgid "There is one finished torrent in the list. " +msgstr "Há um torrent concluído na lista. " + +#: btdownloadgui.py:2699 +msgid "Do you want to remove it?" +msgstr "Você quer removê-lo?" + +#: btdownloadgui.py:2701 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Há %d torrents concluídos na lista. " + +#: btdownloadgui.py:2702 +msgid "Do you want to remove all of them?" +msgstr "Você quer removê-los?" + +#: btdownloadgui.py:2704 +msgid "Remove all finished torrents?" +msgstr "Remover todos torrents concluídos?" + +#: btdownloadgui.py:2711 +msgid "No finished torrents" +msgstr "Nenhum torrent concluído" + +#: btdownloadgui.py:2712 +msgid "There are no finished torrents to remove." +msgstr "Não há torrent concluídos para remover." + +#: btdownloadgui.py:2756 +msgid "Open torrent:" +msgstr "Abrir torrent:" + +#: btdownloadgui.py:2789 +msgid "Change save location for " +msgstr "Mudar local de salvamento para " + +#: btdownloadgui.py:2815 +msgid "File exists!" +msgstr "Arquivo existe!" + +#: btdownloadgui.py:2816 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" já existe. Você quer escolher um nome diferente de arquivo?" + +#: btdownloadgui.py:2834 +msgid "Save location for " +msgstr "Local de salvamento para " + +#: btdownloadgui.py:2944 +#, python-format +msgid "(global message) : %s" +msgstr "(mensagem global) : %s" + +#: btdownloadgui.py:2951 +#, python-format +msgid "%s Error" +msgstr "%s Erro" + +#: btdownloadgui.py:2957 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Ocorreram erros múltiplos. Clique em OK para ver o log de erro." + +#: btdownloadgui.py:3087 +msgid "Stop running torrent?" +msgstr "Parar o torrent em execução?" + +#: btdownloadgui.py:3088 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Você está prestes a iniciar \"%s\". Você quer então parar o último torrent " +"em execução?" + +#: btdownloadgui.py:3098 +msgid "Have you donated?" +msgstr "Você fez sua doação?" + +#: btdownloadgui.py:3099 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bem-vindo à nova versão do %s. Você fez sua doação?" + +#: btdownloadgui.py:3113 +msgid "Thanks!" +msgstr "Obrigado!" + +#: btdownloadgui.py:3114 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Obrigado por fazer uma doação! Para doar novamente, selecione \"Doar\" no " +"menu de \"Ajuda\"." + +#: btdownloadgui.py:3143 +msgid "Can't have both --responsefile and non-option arguments" +msgstr "" +"Impossível ter simultaneamente os argumentos --responsefile e non-option" + +#: btdownloadgui.py:3173 +msgid "Temporary Internet Files" +msgstr "Arquivos de Internet Temporários" + +#: btdownloadgui.py:3174 +#, python-format +msgid "" +"Could not read %s: %s. You are probably using a broken Internet Explorer " +"version that passed BitTorrent a filename that doesn't exist. To work around " +"the problem, try clearing your Temporary Internet Files or right-click the " +"link and save the .torrent file to disk first." +msgstr "" +"Impossível ler %s: %s. Provavelmente você está usando uma versão defeituosa " +"do Internet Explorer que passou ao BitTorrent um nome de arquivo " +"inexistente. Para contornar o problema, tente limpar seus Arquivos de " +"Internet Temporários ou clique com o direito do mouse no link e salve o " +"arquivo .torrent no disco primeiro." + +#: btdownloadgui.py:3197 +#, python-format +msgid "%s already running" +msgstr "%s já em execução" + +#: btdownloadheadless.py:137 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d visto agora, mais %d cópias distribuídas (%s)" + +#: btdownloadheadless.py:144 +#, python-format +msgid "%d seen now" +msgstr "%d visto agora" + +#: btdownloadheadless.py:147 +msgid "ERROR:\n" +msgstr "ERRO:\n" + +#: btdownloadheadless.py:148 +msgid "saving: " +msgstr "salvando: " + +#: btdownloadheadless.py:149 +msgid "percent done: " +msgstr "percentual concluído: " + +#: btdownloadheadless.py:150 +msgid "time left: " +msgstr "tempo restante: " + +#: btdownloadheadless.py:151 +msgid "download to: " +msgstr "baixar para: " + +#: btdownloadheadless.py:152 +msgid "download rate: " +msgstr "taxa de download: " + +#: btdownloadheadless.py:153 +msgid "upload rate: " +msgstr "taxa de upload: " + +#: btdownloadheadless.py:154 +msgid "share rating: " +msgstr "percentual de compartilhamento: " + +#: btdownloadheadless.py:155 +msgid "seed status: " +msgstr "status de sementes: " + +#: btdownloadheadless.py:156 +msgid "peer status: " +msgstr "status do ponto: " + +#: btlaunchmanycurses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tpo Estimado em %d:%02d:%02d" + +#: btlaunchmanycurses.py:143 +msgid "Size" +msgstr "Tamanho" + +#: btlaunchmanycurses.py:144 +msgid "Download" +msgstr "Download" + +#: btlaunchmanycurses.py:145 +msgid "Upload" +msgstr "Upload" + +#: btlaunchmanycurses.py:146 btlaunchmanycurses.py:239 +msgid "Totals:" +msgstr "Totais:" + +#: btlaunchmanycurses.py:205 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s up %s dn" +msgstr " (%s) %s - %s pontos %s sementes %s cópias dist - %s up %s dn" + +#: btlaunchmanycurses.py:227 btlaunchmany.py:35 +msgid "no torrents" +msgstr "sem torrents" + +#: btlaunchmanycurses.py:265 btlaunchmany.py:49 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERRO DE SISTEMA - EXCEÇÃO GERADA" + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid "Warning: " +msgstr "Atenção: " + +#: btlaunchmanycurses.py:285 btlaunchmany.py:64 +msgid " is not a directory" +msgstr " não é um diretório" + +#: btlaunchmanycurses.py:287 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"rode sem argumentos para explicações sobre parâmetros" + +#: btlaunchmanycurses.py:292 btlaunchmany.py:71 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEÇÃO:" + +#: btlaunchmany.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"erro: %s\n" +"rode sem argumentos para explicações sobre parâmetros" + +#: btmaketorrentgui.py:55 +#, python-format +msgid "%s metafile creator %s" +msgstr "%s criador de metarquivo %s" + +#: btmaketorrentgui.py:73 +msgid "" +"Make .torrent metafiles for these files/directories:\n" +"(Directories will become batch torrents)" +msgstr "" +"Fazer metarquivo .torrent para esses arquivos/diretórios:\n" +"(Diretórios tornar-se-ão torrents em lote)" + +#: btmaketorrentgui.py:88 +msgid "_Files/directories" +msgstr "_Arquivos/diretórios" + +#: btmaketorrentgui.py:118 +msgid "Piece size:" +msgstr "Tamanho do pedaço:" + +#: btmaketorrentgui.py:135 +msgid "Use _tracker:" +msgstr "Usar _rastreador" + +#: btmaketorrentgui.py:165 +msgid "Use _DHT" +msgstr "Usar _DHT" + +#: btmaketorrentgui.py:171 +msgid "Nodes (optional):" +msgstr "Nós (opcional):" + +#: btmaketorrentgui.py:203 +msgid "Comments:" +msgstr "Comentários:" + +#: btmaketorrentgui.py:232 +msgid "Make" +msgstr "Fazer" + +#: btmaketorrentgui.py:405 +msgid "_Host" +msgstr "_Host" + +#: btmaketorrentgui.py:412 +msgid "_Port" +msgstr "_Porta" + +#: btmaketorrentgui.py:505 +msgid "Building torrents..." +msgstr "Construindo torrents..." + +#: btmaketorrentgui.py:513 +msgid "Checking file sizes..." +msgstr "Verificando tamanhos de arquivo..." + +#: btmaketorrentgui.py:531 +msgid "Start seeding" +msgstr "Iniciar semeadura" + +#: btmaketorrentgui.py:551 +msgid "building " +msgstr "construindo " + +#: btmaketorrentgui.py:571 +msgid "Done." +msgstr "Concluído." + +#: btmaketorrentgui.py:572 +msgid "Done building torrents." +msgstr "Concluída construção de torrents." + +#: btmaketorrentgui.py:580 +msgid "Error!" +msgstr "Erro!" + +#: btmaketorrentgui.py:581 +msgid "Error building torrents: " +msgstr "Erro ao construir torrents: " + +#: btmaketorrent.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "comentário legível opcional para pôr no .torrent" + +#: btmaketorrent.py:31 +msgid "optional target file for the torrent" +msgstr "arquivo alvo opcional para o torrent" + +#: btreannounce.py:22 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s URL_RASTREADOR [ARQUIVOTORRENT [ARQUIVOTORRENT ... ] ]" + +#: btreannounce.py:31 +#, python-format +msgid "old announce for %s: %s" +msgstr "anúncio antigo para %s: %s" + +#: btrename.py:26 +#, python-format +msgid "%s %s - change the suggested filename in a .torrent file" +msgstr "%s %s - muda o nome sugerido num arquivo .torrent" + +#: btrename.py:31 +#, python-format +msgid "Usage: %s TORRENTFILE NEW_FILE_NAME" +msgstr "Uso: %s ARQUIVOTORRENT NOVO_NOME_ARQUIVO" + +#: btrename.py:38 +#, python-format +msgid "old filename: %s" +msgstr "nome de arquivo antigo: %s" + +#: btrename.py:40 +#, python-format +msgid "new filename: %s" +msgstr "nome de arquivo novo: %s" + +#: btrename.py:45 +msgid "done." +msgstr "concluído." + +#: btshowmetainfo.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodificar %s arquivos metainfo" + +#: btshowmetainfo.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s [ARQUIVOTORRENT [ARQUIVOTORRENT ... ] ]" + +#: btshowmetainfo.py:42 +#, python-format +msgid "metainfo file.: %s" +msgstr "arq metainfo.: %s" + +#: btshowmetainfo.py:43 +#, python-format +msgid "info hash.....: %s" +msgstr "hash de inform: %s" + +#: btshowmetainfo.py:47 +#, python-format +msgid "file name.....: %s" +msgstr "nome arq....: %s" + +#: btshowmetainfo.py:49 +msgid "file size.....:" +msgstr "tam arq.....:" + +#: btshowmetainfo.py:52 +#, python-format +msgid "directory name: %s" +msgstr "nome diretório: %s" + +#: btshowmetainfo.py:53 +msgid "files.........: " +msgstr "arquivos..: " + +#: btshowmetainfo.py:63 +msgid "archive size..:" +msgstr "tam arquivo..:" + +#: btshowmetainfo.py:67 +#, python-format +msgid "announce url..: %s" +msgstr "url de anúncio: %s" + +#: btshowmetainfo.py:68 +msgid "comment.......: \n" +msgstr "comentário....: \n" + +#~ msgid "Choose existing folder" +#~ msgstr "Escolha pasta existente" + +#~ msgid "Create new folder" +#~ msgstr "Criar nova pasta" diff --git a/feedparser.py b/feedparser.py new file mode 100755 index 0000000..48fb176 --- /dev/null +++ b/feedparser.py @@ -0,0 +1,2591 @@ +#!/usr/bin/env python +"""Universal feed parser + +Handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom feeds + +Visit http://feedparser.org/ for the latest version +Visit http://feedparser.org/docs/ for the latest documentation + +Required: Python 2.1 or later +Recommended: Python 2.3 or later +Recommended: CJKCodecs and iconv_codec +""" +from types import * +#__version__ = "pre-3.3-" + "$Revision: 1.51 $"[11:15] + "-cvs" +__version__ = "3.3.2" +__license__ = "Python" +__copyright__ = "Copyright 2002-4, Mark Pilgrim" +__author__ = "Mark Pilgrim " +__contributors__ = ["Jason Diamond ", + "John Beimler ", + "Fazal Majid ", + "Aaron Swartz "] +_debug = 0 + +# HTTP "User-Agent" header to send to servers when downloading feeds. +# If you are embedding feedparser in a larger application, you should +# change this to your application name and URL. +USER_AGENT = "UniversalFeedParser/%s +http://feedparser.org/" % __version__ + +# HTTP "Accept" header to send to servers when downloading feeds. If you don't +# want to send an Accept header, set this to None. +ACCEPT_HEADER = "application/atom+xml,application/rdf+xml,application/rss+xml,application/x-netcdf,application/xml;q=0.9,text/xml;q=0.2,*/*;q=0.1" + +# List of preferred XML parsers, by SAX driver name. These will be tried first, +# but if they're not installed, Python will keep searching through its own list +# of pre-installed parsers until it finds one that supports everything we need. +PREFERRED_XML_PARSERS = ["drv_libxml2"] + +# If you want feedparser to automatically run HTML markup through HTML Tidy, set +# this to 1. This is off by default because of reports of crashing on some +# platforms. If it crashes for you, please submit a bug report with your OS +# platform, Python version, and the URL of the feed you were attempting to parse. +# Requires mxTidy +TIDY_MARKUP = 0 + +# ---------- required modules (should come with any Python distribution) ---------- +import sgmllib, re, sys, copy, urlparse, time, rfc822, types, cgi +try: + from cStringIO import StringIO as _StringIO +except: + from StringIO import StringIO as _StringIO + +# ---------- optional modules (feedparser will work without these, but with reduced functionality) ---------- + +# gzip is included with most Python distributions, but may not be available if you compiled your own +try: + import gzip +except: + gzip = None +try: + import zlib +except: + zlib = None + +# timeoutsocket allows feedparser to time out rather than hang forever on ultra-slow servers. +# Python 2.3 now has this functionality available in the standard socket library, so under +# 2.3 you don't need to install anything. But you probably should anyway, because the socket +# module is buggy and timeoutsocket is better. +try: + import timeoutsocket # http://www.timo-tasi.org/python/timeoutsocket.py + timeoutsocket.setDefaultSocketTimeout(20) +except ImportError: + import socket + if hasattr(socket, 'setdefaulttimeout'): + socket.setdefaulttimeout(20) +import urllib, urllib2 + +_mxtidy = None +if TIDY_MARKUP: + try: + from mx.Tidy import Tidy as _mxtidy + except: + pass + +# If a real XML parser is available, feedparser will attempt to use it. feedparser has +# been tested with the built-in SAX parser, PyXML, and libxml2. On platforms where the +# Python distribution does not come with an XML parser (such as Mac OS X 10.2 and some +# versions of FreeBSD), feedparser will quietly fall back on regex-based parsing. +try: + import xml.sax + xml.sax.make_parser(PREFERRED_XML_PARSERS) # test for valid parsers + from xml.sax.saxutils import escape as _xmlescape + _XML_AVAILABLE = 1 +except: + _XML_AVAILABLE = 0 + def _xmlescape(data): + data = data.replace("&", "&") + data = data.replace(">", ">") + data = data.replace("<", "<") + return data + +# base64 support for Atom feeds that contain embedded binary data +try: + import base64, binascii +except: + base64 = binascii = None + +# cjkcodecs and iconv_codec provide support for more character encodings. +# Both are available from http://cjkpython.i18n.org/ +try: + import cjkcodecs.aliases +except: + pass +try: + import iconv_codec +except: + pass + +# ---------- don't touch these ---------- +class CharacterEncodingOverride(Exception): pass +class CharacterEncodingUnknown(Exception): pass +class NonXMLContentType(Exception): pass + +sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*') +sgmllib.special = re.compile('" % (tag, "".join([' %s="%s"' % t for t in attrs])), escape=0) + + # match namespaces + if tag.find(':') <> -1: + prefix, suffix = tag.split(':', 1) + else: + prefix, suffix = '', tag + prefix = self.namespacemap.get(prefix, prefix) + if prefix: + prefix = prefix + '_' + + # special hack for better tracking of empty textinput/image elements in illformed feeds + if (not prefix) and tag not in ('title', 'link', 'description', 'name'): + self.intextinput = 0 + if (not prefix) and tag not in ('title', 'link', 'description', 'url', 'width', 'height'): + self.inimage = 0 + + # call special handler (if defined) or default handler + methodname = '_start_' + prefix + suffix + try: + method = getattr(self, methodname) + return method(attrsD) + except AttributeError: + return self.push(prefix + suffix, 1) + + def unknown_endtag(self, tag): + if _debug: sys.stderr.write('end %s\n' % tag) + # match namespaces + if tag.find(':') <> -1: + prefix, suffix = tag.split(':', 1) + else: + prefix, suffix = '', tag + prefix = self.namespacemap.get(prefix, prefix) + if prefix: + prefix = prefix + '_' + + # call special handler (if defined) or default handler + methodname = '_end_' + prefix + suffix + try: + method = getattr(self, methodname) + method() + except AttributeError: + self.pop(prefix + suffix) + + # track inline content + if self.incontent and self.contentparams.get('mode') == 'escaped': + # element declared itself as escaped markup, but it isn't really + self.contentparams['mode'] = 'xml' + if self.incontent and self.contentparams.get('mode') == 'xml': + tag = tag.split(':')[-1] + self.handle_data("" % tag, escape=0) + + # track xml:base and xml:lang going out of scope + if self.basestack: + self.basestack.pop() + if self.basestack and self.basestack[-1]: + self.baseuri = self.basestack[-1] + if self.langstack: + self.langstack.pop() + if self.langstack: # and (self.langstack[-1] is not None): + self.lang = self.langstack[-1] + + def handle_charref(self, ref): + # called for each character reference, e.g. for " ", ref will be "160" + if not self.elementstack: return + ref = ref.lower() + if ref in ('34', '38', '39', '60', '62', 'x22', 'x26', 'x27', 'x3c', 'x3e'): + text = "&#%s;" % ref + else: + if ref[0] == 'x': + c = int(ref[1:], 16) + else: + c = int(ref) + text = unichr(c).encode('utf-8') + self.elementstack[-1][2].append(text) + + def handle_entityref(self, ref): + # called for each entity reference, e.g. for "©", ref will be "copy" + if not self.elementstack: return + if _debug: sys.stderr.write("entering handle_entityref with %s\n" % ref) + if ref in ('lt', 'gt', 'quot', 'amp', 'apos'): + text = '&%s;' % ref + else: + # entity resolution graciously donated by Aaron Swartz + def name2cp(k): + import htmlentitydefs + if hasattr(htmlentitydefs, "name2codepoint"): # requires Python 2.3 + return htmlentitydefs.name2codepoint[k] + k = htmlentitydefs.entitydefs[k] + if k.startswith("&#") and k.endswith(";"): + return int(k[2:-1]) # not in latin-1 + return ord(k) + try: name2cp(ref) + except KeyError: text = "&%s;" % ref + else: text = unichr(name2cp(ref)).encode('utf-8') + self.elementstack[-1][2].append(text) + + def handle_data(self, text, escape=1): + # called for each block of plain text, i.e. outside of any tag and + # not containing any character or entity references + if not self.elementstack: return + if escape and self.contentparams.get('mode') == 'xml': + text = _xmlescape(text) + self.elementstack[-1][2].append(text) + + def handle_comment(self, text): + # called for each comment, e.g. + pass + + def handle_pi(self, text): + # called for each processing instruction, e.g. + pass + + def handle_decl(self, text): + pass + + def parse_declaration(self, i): + # override internal declaration handler to handle CDATA blocks + if _debug: sys.stderr.write("entering parse_declaration\n") + if self.rawdata[i:i+9] == '', i) + if k == -1: k = len(self.rawdata) + self.handle_data(_xmlescape(self.rawdata[i+9:k]), 0) + return k+3 + else: + k = self.rawdata.find('>', i) + return k+1 + + def trackNamespace(self, prefix, uri): + if (prefix, uri) == (None, 'http://my.netscape.com/rdf/simple/0.9/') and not self.version: + self.version = 'rss090' + if uri == 'http://purl.org/rss/1.0/' and not self.version: + self.version = 'rss10' + if not prefix: return + if uri.find('backend.userland.com/rss') <> -1: + # match any backend.userland.com namespace + uri = 'http://backend.userland.com/rss' + if self.namespaces.has_key(uri): + self.namespacemap[prefix] = self.namespaces[uri] + + def resolveURI(self, uri): + return urlparse.urljoin(self.baseuri or '', uri) + + def decodeEntities(self, element, data): + return data + + def push(self, element, expectingText): + self.elementstack.append([element, expectingText, []]) + + def pop(self, element): + if not self.elementstack: return + if self.elementstack[-1][0] != element: return + + element, expectingText, pieces = self.elementstack.pop() + output = "".join(pieces) + output = output.strip() + if not expectingText: return output + + # decode base64 content + if self.contentparams.get('mode') == 'base64' and base64: + try: + output = base64.decodestring(output) + except binascii.Error: + pass + except binascii.Incomplete: + pass + + # resolve relative URIs + if (element in self.can_be_relative_uri) and output: + output = self.resolveURI(output) + + # decode entities within embedded markup + output = self.decodeEntities(element, output) + + # resolve relative URIs within embedded markup + if self.contentparams.get('type', 'text/html') in self.html_types: + if element in self.can_contain_relative_uris: + output = _resolveRelativeURIs(output, self.baseuri, self.encoding) + + # sanitize embedded markup + if self.contentparams.get('type', 'text/html') in self.html_types: + if element in self.can_contain_dangerous_markup: + output = _sanitizeHTML(output, self.encoding) + + if self.encoding and (type(output) == types.StringType): + try: + output = unicode(output, self.encoding) + except: + pass + + # store output in appropriate place(s) + if self.inentry: + if element == 'content': + self.entries[-1].setdefault(element, []) + contentparams = copy.deepcopy(self.contentparams) + contentparams['value'] = output + self.entries[-1][element].append(contentparams) + elif element == 'category': + self.entries[-1][element] = output + domain = self.entries[-1]['categories'][-1][0] + self.entries[-1]['categories'][-1] = (domain, output) + elif element == 'source': + self.entries[-1]['source']['value'] = output + elif element == 'link': + self.entries[-1][element] = output + if output: + self.entries[-1]['links'][-1]['href'] = output + else: + if element == 'description': + element = 'summary' + self.entries[-1][element] = output + if self.incontent: + contentparams = copy.deepcopy(self.contentparams) + contentparams['value'] = output + self.entries[-1][element + '_detail'] = contentparams + elif self.infeed and (not self.intextinput) and (not self.inimage): + if element == 'description': + element = 'tagline' + self.feeddata[element] = output + if element == 'category': + domain = self.feeddata['categories'][-1][0] + self.feeddata['categories'][-1] = (domain, output) + elif element == 'link': + self.feeddata['links'][-1]['href'] = output + elif self.incontent: + contentparams = copy.deepcopy(self.contentparams) + contentparams['value'] = output + self.feeddata[element + '_detail'] = contentparams + return output + + def _mapToStandardPrefix(self, name): + colonpos = name.find(':') + if colonpos <> -1: + prefix = name[:colonpos] + suffix = name[colonpos+1:] + prefix = self.namespacemap.get(prefix, prefix) + name = prefix + ':' + suffix + return name + + def _getAttribute(self, attrsD, name): + return attrsD.get(self._mapToStandardPrefix(name)) + + def _save(self, key, value): + if self.inentry: + self.entries[-1].setdefault(key, value) + elif self.feeddata: + self.feeddata.setdefault(key, value) + + def _start_rss(self, attrsD): + versionmap = {'0.91': 'rss091u', + '0.92': 'rss092', + '0.93': 'rss093', + '0.94': 'rss094'} + if not self.version: + attr_version = attrsD.get('version', '') + version = versionmap.get(attr_version) + if version: + self.version = version + elif attr_version.startswith('2.'): + self.version = 'rss20' + else: + self.version = 'rss' + + def _start_dlhottitles(self, attrsD): + self.version = 'hotrss' + + def _start_channel(self, attrsD): + self.infeed = 1 + self._cdf_common(attrsD) + _start_feedinfo = _start_channel + + def _cdf_common(self, attrsD): + if attrsD.has_key('lastmod'): + self._start_modified({}) + self.elementstack[-1][-1] = attrsD['lastmod'] + self._end_modified() + if attrsD.has_key('href'): + self._start_link({}) + self.elementstack[-1][-1] = attrsD['href'] + self._end_link() + + def _start_feed(self, attrsD): + self.infeed = 1 + versionmap = {'0.1': 'atom01', + '0.2': 'atom02', + '0.3': 'atom03'} + if not self.version: + attr_version = attrsD.get('version') + version = versionmap.get(attr_version) + if version: + self.version = version + else: + self.version = 'atom' + + def _end_channel(self): + self.infeed = 0 + _end_feed = _end_channel + + def _start_image(self, attrsD): + self.inimage = 1 + self.push('image', 0) + context = self._getContext() + context.setdefault('image', FeedParserDict()) + + def _end_image(self): + self.pop('image') + self.inimage = 0 + + def _start_textinput(self, attrsD): + self.intextinput = 1 + self.push('textinput', 0) + context = self._getContext() + context.setdefault('textinput', FeedParserDict()) + _start_textInput = _start_textinput + + def _end_textinput(self): + self.pop('textinput') + self.intextinput = 0 + _end_textInput = _end_textinput + + def _start_author(self, attrsD): + self.inauthor = 1 + self.push('author', 1) + _start_managingeditor = _start_author + _start_dc_author = _start_author + _start_dc_creator = _start_author + + def _end_author(self): + self.pop('author') + self.inauthor = 0 + self._sync_author_detail() + _end_managingeditor = _end_author + _end_dc_author = _end_author + _end_dc_creator = _end_author + + def _start_contributor(self, attrsD): + self.incontributor = 1 + context = self._getContext() + context.setdefault('contributors', []) + context['contributors'].append(FeedParserDict()) + self.push('contributor', 0) + + def _end_contributor(self): + self.pop('contributor') + self.incontributor = 0 + + def _start_name(self, attrsD): + self.push('name', 0) + + def _end_name(self): + value = self.pop('name') + if self.inauthor: + self._save_author('name', value) + elif self.incontributor: + self._save_contributor('name', value) + elif self.intextinput: + context = self._getContext() + context['textinput']['name'] = value + + def _start_width(self, attrsD): + self.push('width', 0) + + def _end_width(self): + value = self.pop('width') + try: + value = int(value) + except: + value = 0 + if self.inimage: + context = self._getContext() + context['image']['width'] = value + + def _start_height(self, attrsD): + self.push('height', 0) + + def _end_height(self): + value = self.pop('height') + try: + value = int(value) + except: + value = 0 + if self.inimage: + context = self._getContext() + context['image']['height'] = value + + def _start_url(self, attrsD): + self.push('url', 1) + _start_homepage = _start_url + _start_uri = _start_url + + def _end_url(self): + value = self.pop('url') + if self.inauthor: + self._save_author('url', value) + elif self.incontributor: + self._save_contributor('url', value) + elif self.inimage: + context = self._getContext() + context['image']['url'] = value + elif self.intextinput: + context = self._getContext() + context['textinput']['link'] = value + _end_homepage = _end_url + _end_uri = _end_url + + def _start_email(self, attrsD): + self.push('email', 0) + + def _end_email(self): + value = self.pop('email') + if self.inauthor: + self._save_author('email', value) + elif self.incontributor: + self._save_contributor('email', value) + pass + + def _getContext(self): + if self.inentry: + context = self.entries[-1] + else: + context = self.feeddata + return context + + def _save_author(self, key, value): + context = self._getContext() + context.setdefault('author_detail', FeedParserDict()) + context['author_detail'][key] = value + self._sync_author_detail() + + def _save_contributor(self, key, value): + context = self._getContext() + context.setdefault('contributors', [FeedParserDict()]) + context['contributors'][-1][key] = value + + def _sync_author_detail(self, key='author'): + context = self._getContext() + detail = context.get('%s_detail' % key) + if detail: + name = detail.get('name') + email = detail.get('email') + if name and email: + context[key] = "%s (%s)" % (name, email) + elif name: + context[key] = name + elif email: + context[key] = email + else: + author = context.get(key) + if not author: return + emailmatch = re.search(r"""(([a-zA-Z0-9\_\-\.\+]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?))""", author) + if not emailmatch: return + email = emailmatch.group(0) + # probably a better way to do the following, but it passes all the tests + author = author.replace(email, '') + author = author.replace('()', '') + author = author.strip() + if author and (author[0] == '('): + author = author[1:] + if author and (author[-1] == ')'): + author = author[:-1] + author = author.strip() + context.setdefault('%s_detail' % key, FeedParserDict()) + context['%s_detail' % key]['name'] = author + context['%s_detail' % key]['email'] = email + + def _start_tagline(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'escaped'), + 'type': attrsD.get('type', 'text/plain'), + 'language': self.lang, + 'base': self.baseuri}) + self.push('tagline', 1) + _start_subtitle = _start_tagline + + def _end_tagline(self): + value = self.pop('tagline') + self.incontent -= 1 + self.contentparams.clear() + if self.infeed: + self.feeddata['description'] = value + _end_subtitle = _end_tagline + + def _start_copyright(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'escaped'), + 'type': attrsD.get('type', 'text/plain'), + 'language': self.lang, + 'base': self.baseuri}) + self.push('copyright', 1) + _start_dc_rights = _start_copyright + + def _end_copyright(self): + self.pop('copyright') + self.incontent -= 1 + self.contentparams.clear() + _end_dc_rights = _end_copyright + + def _start_item(self, attrsD): + self.entries.append(FeedParserDict()) + self.push('item', 0) + self.inentry = 1 + self.guidislink = 0 + id = self._getAttribute(attrsD, 'rdf:about') + if id: + context = self._getContext() + context['id'] = id + self._cdf_common(attrsD) + _start_entry = _start_item + _start_product = _start_item + + def _end_item(self): + self.pop('item') + self.inentry = 0 + _end_entry = _end_item + + def _start_dc_language(self, attrsD): + self.push('language', 1) + _start_language = _start_dc_language + + def _end_dc_language(self): + self.lang = self.pop('language') + _end_language = _end_dc_language + + def _start_dc_publisher(self, attrsD): + self.push('publisher', 1) + _start_webmaster = _start_dc_publisher + + def _end_dc_publisher(self): + self.pop('publisher') + self._sync_author_detail('publisher') + _end_webmaster = _end_dc_publisher + + def _start_dcterms_issued(self, attrsD): + self.push('issued', 1) + _start_issued = _start_dcterms_issued + + def _end_dcterms_issued(self): + value = self.pop('issued') + self._save('issued_parsed', _parse_date(value)) + _end_issued = _end_dcterms_issued + + def _start_dcterms_created(self, attrsD): + self.push('created', 1) + _start_created = _start_dcterms_created + + def _end_dcterms_created(self): + value = self.pop('created') + self._save('created_parsed', _parse_date(value)) + _end_created = _end_dcterms_created + + def _start_dcterms_modified(self, attrsD): + self.push('modified', 1) + _start_modified = _start_dcterms_modified + _start_dc_date = _start_dcterms_modified + _start_pubdate = _start_dcterms_modified + + def _end_dcterms_modified(self): + value = self.pop('modified') + parsed_value = _parse_date(value) + self._save('modified_parsed', parsed_value) + _end_modified = _end_dcterms_modified + _end_dc_date = _end_dcterms_modified + _end_pubdate = _end_dcterms_modified + + def _start_expirationdate(self, attrsD): + self.push('expired', 1) + + def _end_expirationdate(self): + self._save('expired_parsed', _parse_date(self.pop('expired'))) + + def _start_cc_license(self, attrsD): + self.push('license', 1) + value = self._getAttribute(attrsD, 'rdf:resource') + if value: + self.elementstack[-1][2].append(value) + self.pop('license') + + def _start_creativecommons_license(self, attrsD): + self.push('license', 1) + + def _end_creativecommons_license(self): + self.pop('license') + + def _start_category(self, attrsD): + self.push('category', 1) + domain = self._getAttribute(attrsD, 'domain') + cats = [] + if self.inentry: + cats = self.entries[-1].setdefault('categories', []) + elif self.infeed: + cats = self.feeddata.setdefault('categories', []) + cats.append((domain, None)) + _start_dc_subject = _start_category + _start_keywords = _start_category + + def _end_category(self): + self.pop('category') + _end_dc_subject = _end_category + _end_keywords = _end_category + + def _start_cloud(self, attrsD): + self.feeddata['cloud'] = FeedParserDict(attrsD) + + def _start_link(self, attrsD): + attrsD.setdefault('rel', 'alternate') + attrsD.setdefault('type', 'text/html') + if attrsD.has_key('href'): + attrsD['href'] = self.resolveURI(attrsD['href']) + expectingText = self.infeed or self.inentry + if self.inentry: + self.entries[-1].setdefault('links', []) + self.entries[-1]['links'].append(FeedParserDict(attrsD)) + elif self.infeed: + self.feeddata.setdefault('links', []) + self.feeddata['links'].append(FeedParserDict(attrsD)) + if attrsD.has_key('href'): + expectingText = 0 + if attrsD.get('type', '') in self.html_types: + if self.inentry: + self.entries[-1]['link'] = attrsD['href'] + elif self.infeed: + self.feeddata['link'] = attrsD['href'] + else: + self.push('link', expectingText) + _start_producturl = _start_link + + def _end_link(self): + value = self.pop('link') + if self.intextinput: + context = self._getContext() + context['textinput']['link'] = value + if self.inimage: + context = self._getContext() + context['image']['link'] = value + _end_producturl = _end_link + + def _start_guid(self, attrsD): + self.guidislink = (attrsD.get('ispermalink', 'true') == 'true') + self.push('id', 1) + + def _end_guid(self): + value = self.pop('id') + self._save('guidislink', self.guidislink and not self._getContext().has_key('link')) + if self.guidislink: + # guid acts as link, but only if "ispermalink" is not present or is "true", + # and only if the item doesn't already have a link element + self._save('link', value) + + def _start_id(self, attrsD): + self.push('id', 1) + + def _end_id(self): + value = self.pop('id') + + def _start_title(self, attrsD): + self.incontent += 1 + if _debug: sys.stderr.write('attrsD.xml:lang = %s\n' % attrsD.get('xml:lang')) + if _debug: sys.stderr.write('self.lang = %s\n' % self.lang) + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'escaped'), + 'type': attrsD.get('type', 'text/plain'), + 'language': self.lang, + 'base': self.baseuri}) + self.push('title', self.infeed or self.inentry) + _start_dc_title = _start_title + + def _end_title(self): + value = self.pop('title') + self.incontent -= 1 + self.contentparams.clear() + if self.intextinput: + context = self._getContext() + context['textinput']['title'] = value + elif self.inimage: + context = self._getContext() + context['image']['title'] = value + _end_dc_title = _end_title + + def _start_description(self, attrsD, default_content_type='text/html'): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'escaped'), + 'type': attrsD.get('type', default_content_type), + 'language': self.lang, + 'base': self.baseuri}) + self.push('description', self.infeed or self.inentry) + + def _start_abstract(self, attrsD): + return self._start_description(attrsD, 'text/plain') + + def _end_description(self): + value = self.pop('description') + self.incontent -= 1 + self.contentparams.clear() + context = self._getContext() + if self.intextinput: + context['textinput']['description'] = value + elif self.inimage: + context['image']['description'] = value +# elif self.inentry: +# context['summary'] = value +# elif self.infeed: +# context['tagline'] = value + _end_abstract = _end_description + + def _start_info(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'escaped'), + 'type': attrsD.get('type', 'text/plain'), + 'language': self.lang, + 'base': self.baseuri}) + self.push('info', 1) + + def _end_info(self): + self.pop('info') + self.incontent -= 1 + self.contentparams.clear() + + def _start_generator(self, attrsD): + if attrsD: + if attrsD.has_key('url'): + attrsD['url'] = self.resolveURI(attrsD['url']) + self.feeddata['generator_detail'] = FeedParserDict(attrsD) + self.push('generator', 1) + + def _end_generator(self): + value = self.pop('generator') + if self.feeddata.has_key('generator_detail'): + self.feeddata['generator_detail']['name'] = value + + def _start_admin_generatoragent(self, attrsD): + self.push('generator', 1) + value = self._getAttribute(attrsD, 'rdf:resource') + if value: + self.elementstack[-1][2].append(value) + self.pop('generator') + self.feeddata['generator_detail'] = FeedParserDict({"url": value}) + + def _start_admin_errorreportsto(self, attrsD): + self.push('errorreportsto', 1) + value = self._getAttribute(attrsD, 'rdf:resource') + if value: + self.elementstack[-1][2].append(value) + self.pop('errorreportsto') + + def _start_summary(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'escaped'), + 'type': attrsD.get('type', 'text/plain'), + 'language': self.lang, + 'base': self.baseuri}) + self.push('summary', 1) + + def _end_summary(self): + value = self.pop('summary') + if self.entries: + self.entries[-1]['description'] = value + self.incontent -= 1 + self.contentparams.clear() + + def _start_enclosure(self, attrsD): + if self.inentry: + self.entries[-1].setdefault('enclosures', []) + self.entries[-1]['enclosures'].append(FeedParserDict(attrsD)) + + def _start_source(self, attrsD): + if self.inentry: + self.entries[-1]['source'] = FeedParserDict(attrsD) + self.push('source', 1) + + def _end_source(self): + self.pop('source') + + def _start_content(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'xml'), + 'type': attrsD.get('type', 'text/plain'), + 'language': self.lang, + 'base': self.baseuri}) + self.push('content', 1) + + def _start_prodlink(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': attrsD.get('mode', 'xml'), + 'type': attrsD.get('type', 'text/html'), + 'language': self.lang, + 'base': self.baseuri}) + self.push('content', 1) + + def _start_body(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': 'xml', + 'type': 'application/xhtml+xml', + 'language': self.lang, + 'base': self.baseuri}) + self.push('content', 1) + _start_xhtml_body = _start_body + + def _start_content_encoded(self, attrsD): + self.incontent += 1 + self.contentparams = FeedParserDict({'mode': 'escaped', + 'type': 'text/html', + 'language': self.lang, + 'base': self.baseuri}) + self.push('content', 1) + _start_fullitem = _start_content_encoded + + def _end_content(self): + value = self.pop('content') + if self.contentparams.get('type') in (['text/plain'] + self.html_types): + self._save('description', value) + self.incontent -= 1 + self.contentparams.clear() + _end_body = _end_content + _end_xhtml_body = _end_content + _end_content_encoded = _end_content + _end_fullitem = _end_content + _end_prodlink = _end_content + +if _XML_AVAILABLE: + class _StrictFeedParser(_FeedParserMixin, xml.sax.handler.ContentHandler): + def __init__(self, baseuri, baselang, encoding): + if _debug: sys.stderr.write('trying StrictFeedParser\n') + xml.sax.handler.ContentHandler.__init__(self) + _FeedParserMixin.__init__(self, baseuri, baselang, encoding) + self.bozo = 0 + self.exc = None + + def startPrefixMapping(self, prefix, uri): + self.trackNamespace(prefix, uri) + + def startElementNS(self, name, qname, attrs): + namespace, localname = name + namespace = str(namespace or '') + if namespace.find('backend.userland.com/rss') <> -1: + # match any backend.userland.com namespace + namespace = 'http://backend.userland.com/rss' + prefix = self.namespaces.get(namespace, 'unknown') + if prefix: + localname = prefix + ':' + localname + localname = str(localname).lower() + + # qname implementation is horribly broken in Python 2.1 (it + # doesn't report any), and slightly broken in Python 2.2 (it + # doesn't report the xml: namespace). So we match up namespaces + # with a known list first, and then possibly override them with + # the qnames the SAX parser gives us (if indeed it gives us any + # at all). Thanks to MatejC for helping me test this and + # tirelessly telling me that it didn't work yet. + attrsD = {} + for (namespace, attrlocalname), attrvalue in attrs._attrs.items(): + prefix = self.namespaces.get(namespace, '') + if prefix: + attrlocalname = prefix + ":" + attrlocalname + attrsD[str(attrlocalname).lower()] = attrvalue + for qname in attrs.getQNames(): + attrsD[str(qname).lower()] = attrs.getValueByQName(qname) + self.unknown_starttag(localname, attrsD.items()) + +# def resolveEntity(self, publicId, systemId): +# return _StringIO() + + def characters(self, text): + self.handle_data(text) + + def endElementNS(self, name, qname): + namespace, localname = name + namespace = str(namespace) + prefix = self.namespaces.get(namespace, '') + if prefix: + localname = prefix + ':' + localname + localname = str(localname).lower() + self.unknown_endtag(localname) + + def error(self, exc): + self.bozo = 1 + self.exc = exc + + def fatalError(self, exc): + self.error(exc) + raise exc + +class _BaseHTMLProcessor(sgmllib.SGMLParser): + elements_no_end_tag = ['area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', + 'img', 'input', 'isindex', 'link', 'meta', 'param'] + + def __init__(self, encoding): + self.encoding = encoding + if _debug: sys.stderr.write('entering BaseHTMLProcessor, encoding=%s\n' % self.encoding) + sgmllib.SGMLParser.__init__(self) + + def reset(self): + self.pieces = [] + sgmllib.SGMLParser.reset(self) + + def feed(self, data): + data = re.compile(r'', r'<\1>', data) + data = data.replace(''', "'") + data = data.replace('"', '"') + if self.encoding and (type(data) == types.UnicodeType): + data = data.encode(self.encoding) + sgmllib.SGMLParser.feed(self, data) + + def normalize_attrs(self, attrs): + # utility method to be called by descendants + attrs = [(k.lower(), v) for k, v in attrs] +# if self.encoding: +# if _debug: sys.stderr.write('normalize_attrs, encoding=%s\n' % self.encoding) +# attrs = [(k, v.encode(self.encoding)) for k, v in attrs] + attrs = [(k, k in ('rel', 'type') and v.lower() or v) for k, v in attrs] + return attrs + + def unknown_starttag(self, tag, attrs): + # called for each start tag + # attrs is a list of (attr, value) tuples + # e.g. for
, tag="pre", attrs=[("class", "screen")]
+		attrsList = []
+		for attr in attrs:
+			attrsList.append(list(attr))
+					
+		for attr in attrsList:
+			for key in attr:
+				if type(key) is UnicodeType:
+					strKey = key.encode('utf-8')
+					attr.remove(key)
+					attr.append(strKey)
+	
+		if _debug: sys.stderr.write('_BaseHTMLProcessor, unknown_starttag, tag=%s\n' % tag)
+		strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrsList])
+		if tag in self.elements_no_end_tag:
+			self.pieces.append("<%(tag)s%(strattrs)s />" % locals())
+		else:
+			self.pieces.append("<%(tag)s%(strattrs)s>" % locals())
+        
+    def unknown_endtag(self, tag):
+        # called for each end tag, e.g. for 
, tag will be "pre" + # Reconstruct the original end tag. + if tag not in self.elements_no_end_tag: + self.pieces.append("" % locals()) + + def handle_charref(self, ref): + # called for each character reference, e.g. for " ", ref will be "160" + # Reconstruct the original character reference. + self.pieces.append("&#%(ref)s;" % locals()) + + def handle_entityref(self, ref): + # called for each entity reference, e.g. for "©", ref will be "copy" + # Reconstruct the original entity reference. + self.pieces.append("&%(ref)s;" % locals()) + + def handle_data(self, text): + # called for each block of plain text, i.e. outside of any tag and + # not containing any character or entity references + # Store the original text verbatim. + if _debug: sys.stderr.write('_BaseHTMLProcessor, handle_text, text=%s\n' % text) + self.pieces.append(text) + + def handle_comment(self, text): + # called for each HTML comment, e.g. + # Reconstruct the original comment. + self.pieces.append("" % locals()) + + def handle_pi(self, text): + # called for each processing instruction, e.g. + # Reconstruct original processing instruction. + self.pieces.append("" % locals()) + + def handle_decl(self, text): + # called for the DOCTYPE, if present, e.g. + # + # Reconstruct original DOCTYPE + self.pieces.append("" % locals()) + + _new_declname_match = re.compile(r'[a-zA-Z][-_.a-zA-Z0-9:]*\s*').match + def _scan_name(self, i, declstartpos): + rawdata = self.rawdata + n = len(rawdata) + if i == n: + return None, -1 + m = self._new_declname_match(rawdata, i) + if m: + s = m.group() + name = s.strip() + if (i + len(s)) == n: + return None, -1 # end of buffer + return name.lower(), m.end() + else: + self.handle_data(rawdata) +# self.updatepos(declstartpos, i) + return None, -1 + + def output(self): + """Return processed HTML as a single string""" + return "".join([str(p) for p in self.pieces]) + +class _LooseFeedParser(_FeedParserMixin, _BaseHTMLProcessor): + def __init__(self, baseuri, baselang, encoding): + sgmllib.SGMLParser.__init__(self) + _FeedParserMixin.__init__(self, baseuri, baselang, encoding) + + def decodeEntities(self, element, data): + data = data.replace('<', '<') + data = data.replace('<', '<') + data = data.replace('>', '>') + data = data.replace('>', '>') + data = data.replace('&', '&') + data = data.replace('&', '&') + data = data.replace('"', '"') + data = data.replace('"', '"') + data = data.replace(''', ''') + data = data.replace(''', ''') + if self.contentparams.get('mode') == 'escaped': + data = data.replace('<', '<') + data = data.replace('>', '>') + data = data.replace('&', '&') + data = data.replace('"', '"') + data = data.replace(''', "'") + return data + +class _RelativeURIResolver(_BaseHTMLProcessor): + relative_uris = [('a', 'href'), + ('applet', 'codebase'), + ('area', 'href'), + ('blockquote', 'cite'), + ('body', 'background'), + ('del', 'cite'), + ('form', 'action'), + ('frame', 'longdesc'), + ('frame', 'src'), + ('iframe', 'longdesc'), + ('iframe', 'src'), + ('head', 'profile'), + ('img', 'longdesc'), + ('img', 'src'), + ('img', 'usemap'), + ('input', 'src'), + ('input', 'usemap'), + ('ins', 'cite'), + ('link', 'href'), + ('object', 'classid'), + ('object', 'codebase'), + ('object', 'data'), + ('object', 'usemap'), + ('q', 'cite'), + ('script', 'src')] + + def __init__(self, baseuri, encoding): + _BaseHTMLProcessor.__init__(self, encoding) + self.baseuri = baseuri + + def resolveURI(self, uri): + return urlparse.urljoin(self.baseuri, uri) + + def unknown_starttag(self, tag, attrs): + attrs = self.normalize_attrs(attrs) + attrs = [(key, ((tag, key) in self.relative_uris) and self.resolveURI(value) or value) for key, value in attrs] + _BaseHTMLProcessor.unknown_starttag(self, tag, attrs) + +def _resolveRelativeURIs(htmlSource, baseURI, encoding): + if _debug: sys.stderr.write("entering _resolveRelativeURIs\n") + p = _RelativeURIResolver(baseURI, encoding) + p.feed(htmlSource) + return p.output() + +class _HTMLSanitizer(_BaseHTMLProcessor): + acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area', 'b', 'big', + 'blockquote', 'br', 'button', 'caption', 'center', 'cite', 'code', 'col', + 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', + 'font', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'input', + 'ins', 'kbd', 'label', 'legend', 'li', 'map', 'menu', 'ol', 'optgroup', + 'option', 'p', 'pre', 'q', 's', 'samp', 'select', 'small', 'span', 'strike', + 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', + 'thead', 'tr', 'tt', 'u', 'ul', 'var'] + + acceptable_attributes = ['abbr', 'accept', 'accept-charset', 'accesskey', + 'action', 'align', 'alt', 'axis', 'border', 'cellpadding', 'cellspacing', + 'char', 'charoff', 'charset', 'checked', 'cite', 'class', 'clear', 'cols', + 'colspan', 'color', 'compact', 'coords', 'datetime', 'dir', 'disabled', + 'enctype', 'for', 'frame', 'headers', 'height', 'href', 'hreflang', 'hspace', + 'id', 'ismap', 'label', 'lang', 'longdesc', 'maxlength', 'media', 'method', + 'multiple', 'name', 'nohref', 'noshade', 'nowrap', 'prompt', 'readonly', + 'rel', 'rev', 'rows', 'rowspan', 'rules', 'scope', 'selected', 'shape', 'size', + 'span', 'src', 'start', 'summary', 'tabindex', 'target', 'title', 'type', + 'usemap', 'valign', 'value', 'vspace', 'width','style'] + + unacceptable_elements_with_end_tag = ['script', 'applet'] + + def reset(self): + _BaseHTMLProcessor.reset(self) + self.unacceptablestack = 0 + + def unknown_starttag(self, tag, attrs): + if not tag in self.acceptable_elements: + if tag in self.unacceptable_elements_with_end_tag: + self.unacceptablestack += 1 + return + attrs = self.normalize_attrs(attrs) + attrs = [(key, value) for key, value in attrs if key in self.acceptable_attributes] + _BaseHTMLProcessor.unknown_starttag(self, tag, attrs) + + def unknown_endtag(self, tag): + if not tag in self.acceptable_elements: + if tag in self.unacceptable_elements_with_end_tag: + self.unacceptablestack -= 1 + return + _BaseHTMLProcessor.unknown_endtag(self, tag) + + def handle_pi(self, text): + pass + + def handle_decl(self, text): + pass + + def handle_data(self, text): + if not self.unacceptablestack: + _BaseHTMLProcessor.handle_data(self, text) + +def _sanitizeHTML(htmlSource, encoding): + p = _HTMLSanitizer(encoding) + p.feed(htmlSource) + data = p.output() + if _mxtidy and TIDY_MARKUP: + nerrors, nwarnings, data, errordata = _mxtidy.tidy(data, output_xhtml=1, numeric_entities=1, wrap=0) + if data.count(''): + data = data.split('>', 1)[1] + if data.count(' stream + + This function lets you define parsers that take any input source + (URL, pathname to local or network file, or actual data as a string) + and deal with it in a uniform manner. Returned object is guaranteed + to have all the basic stdio read methods (read, readline, readlines). + Just .close() the object when you're done with it. + + If the etag argument is supplied, it will be used as the value of an + If-None-Match request header. + + If the modified argument is supplied, it must be a tuple of 9 integers + as returned by gmtime() in the standard Python time module. This MUST + be in GMT (Greenwich Mean Time). The formatted date/time will be used + as the value of an If-Modified-Since request header. + + If the agent argument is supplied, it will be used as the value of a + User-Agent request header. + + If the referrer argument is supplied, it will be used as the value of a + Referer[sic] request header. + + If handlers is supplied, it is a list of handlers used to build a + urllib2 opener. + """ + + if hasattr(url_file_stream_or_string, "read"): + return url_file_stream_or_string + + if url_file_stream_or_string == "-": + return sys.stdin + + if urlparse.urlparse(url_file_stream_or_string)[0] in ('http', 'https', 'ftp'): + if not agent: + agent = USER_AGENT + # test for inline user:password for basic auth + auth = None + if base64: + urltype, rest = urllib.splittype(url_file_stream_or_string) + realhost, rest = urllib.splithost(rest) + if realhost: + user_passwd, realhost = urllib.splituser(realhost) + if user_passwd: + url_file_stream_or_string = "%s://%s%s" % (urltype, realhost, rest) + auth = base64.encodestring(user_passwd).strip() + # try to open with urllib2 (to use optional headers) + request = urllib2.Request(url_file_stream_or_string) + request.add_header("User-Agent", agent) + if etag: + request.add_header("If-None-Match", etag) + if modified: + # format into an RFC 1123-compliant timestamp. We can't use + # time.strftime() since the %a and %b directives can be affected + # by the current locale, but RFC 2616 states that dates must be + # in English. + short_weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] + months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + request.add_header("If-Modified-Since", "%s, %02d %s %04d %02d:%02d:%02d GMT" % (short_weekdays[modified[6]], modified[2], months[modified[1] - 1], modified[0], modified[3], modified[4], modified[5])) + if referrer: + request.add_header("Referer", referrer) + if gzip and zlib: + request.add_header("Accept-encoding", "gzip, deflate") + elif gzip: + request.add_header("Accept-encoding", "gzip") + elif zlib: + request.add_header("Accept-encoding", "deflate") + else: + request.add_header("Accept-encoding", "") + if auth: + request.add_header("Authorization", "Basic %s" % auth) + if ACCEPT_HEADER: + request.add_header("Accept", ACCEPT_HEADER) + opener = apply(urllib2.build_opener, tuple([_FeedURLHandler()] + handlers)) + opener.addheaders = [] # RMK - must clear so we only send our custom User-Agent + try: + return opener.open(request) + finally: + opener.close() # JohnD + + # try to open with native open function (if url_file_stream_or_string is a filename) + try: + return open(url_file_stream_or_string) + except: + pass + + # treat url_file_stream_or_string as string + return _StringIO(str(url_file_stream_or_string)) + +_date_handlers = [] +def registerDateHandler(func): + """Register a date handler function (takes string, returns 9-tuple date in GMT)""" + _date_handlers.insert(0, func) + +# ISO-8601 date parsing routines written by Fazal Majid. +# The ISO 8601 standard is very convoluted and irregular - a full ISO 8601 +# parser is beyond the scope of feedparser and would be a worthwhile addition +# to the Python library. +# A single regular expression cannot parse ISO 8601 date formats into groups +# as the standard is highly irregular (for instance is 030104 2003-01-04 or +# 0301-04-01), so we use templates instead. +# Please note the order in templates is significant because we need a +# greedy match. +_iso8601_tmpl = ['YYYY-?MM-?DD', 'YYYY-MM', 'YYYY-?OOO', + 'YY-?MM-?DD', 'YY-?OOO', 'YYYY', + '-YY-?MM', '-OOO', '-YY', + '--MM-?DD', '--MM', + '---DD', + 'CC', ''] +_iso8601_re = [ + tmpl.replace( + 'YYYY', r'(?P\d{4})').replace( + 'YY', r'(?P\d\d)').replace( + 'MM', r'(?P[01]\d)').replace( + 'DD', r'(?P[0123]\d)').replace( + 'OOO', r'(?P[0123]\d\d)').replace( + 'CC', r'(?P\d\d$)') + + r'(T?(?P\d{2}):(?P\d{2})' + + r'(:(?P\d{2}))?' + + r'(?P[+-](?P\d{2})(:(?P\d{2}))?|Z)?)?' + for tmpl in _iso8601_tmpl] +del tmpl +_iso8601_matches = [re.compile(regex).match for regex in _iso8601_re] +del regex +def _parse_date_iso8601(dateString): + """Parse a variety of ISO-8601-compatible formats like 20040105""" + m = None + for _iso8601_match in _iso8601_matches: + m = _iso8601_match(dateString) + if m: break + if not m: return + if m.span() == (0, 0): return + params = m.groupdict() + ordinal = params.get("ordinal", 0) + if ordinal: + ordinal = int(ordinal) + else: + ordinal = 0 + year = params.get("year", "--") + if not year or year == "--": + year = time.gmtime()[0] + elif len(year) == 2: + # ISO 8601 assumes current century, i.e. 93 -> 2093, NOT 1993 + year = 100 * int(time.gmtime()[0] / 100) + int(year) + else: + year = int(year) + month = params.get("month", "-") + if not month or month == "-": + # ordinals are NOT normalized by mktime, we simulate them + # by setting month=1, day=ordinal + if ordinal: + month = 1 + else: + month = time.gmtime()[1] + month = int(month) + day = params.get("day", 0) + if not day: + # see above + if ordinal: + day = ordinal + elif params.get("century", 0) or \ + params.get("year", 0) or params.get("month", 0): + day = 1 + else: + day = time.gmtime()[2] + else: + day = int(day) + # special case of the century - is the first year of the 21st century + # 2000 or 2001 ? The debate goes on... + if "century" in params.keys(): + year = (int(params["century"]) - 1) * 100 + 1 + # in ISO 8601 most fields are optional + for field in ["hour", "minute", "second", "tzhour", "tzmin"]: + if not params.get(field, None): + params[field] = 0 + hour = int(params.get("hour", 0)) + minute = int(params.get("minute", 0)) + second = int(params.get("second", 0)) + # weekday is normalized by mktime(), we can ignore it + weekday = 0 + # daylight savings is complex, but not needed for feedparser's purposes + # as time zones, if specified, include mention of whether it is active + # (e.g. PST vs. PDT, CET). Using -1 is implementation-dependent and + # and most implementations have DST bugs + daylight_savings_flag = 0 + tm = [year, month, day, hour, minute, second, weekday, + ordinal, daylight_savings_flag] + # ISO 8601 time zone adjustments + tz = params.get("tz") + if tz and tz != "Z": + if tz[0] == "-": + tm[3] += int(params.get("tzhour", 0)) + tm[4] += int(params.get("tzmin", 0)) + elif tz[0] == "+": + tm[3] -= int(params.get("tzhour", 0)) + tm[4] -= int(params.get("tzmin", 0)) + else: + return None + # Python's time.mktime() is a wrapper around the ANSI C mktime(3c) + # which is guaranteed to normalize d/m/y/h/m/s. + # Many implementations have bugs, but we'll pretend they don't. + return time.localtime(time.mktime(tm)) +registerDateHandler(_parse_date_iso8601) + +# 8-bit date handling routines written by ytrewq1. +_korean_year = u'\ub144' # b3e2 in euc-kr +_korean_month = u'\uc6d4' # bff9 in euc-kr +_korean_day = u'\uc77c' # c0cf in euc-kr +_korean_am = u'\uc624\uc804' # bfc0 c0fc in euc-kr +_korean_pm = u'\uc624\ud6c4' # bfc0 c8c4 in euc-kr + +_korean_onblog_date_re = \ + re.compile('(\d{4})%s\s+(\d{2})%s\s+(\d{2})%s\s+(\d{2}):(\d{2}):(\d{2})' % \ + (_korean_year, _korean_month, _korean_day)) +_korean_nate_date_re = \ + re.compile(u'(\d{4})-(\d{2})-(\d{2})\s+(%s|%s)\s+(\d{,2}):(\d{,2}):(\d{,2})' % \ + (_korean_am, _korean_pm)) +def _parse_date_onblog(dateString): + """Parse a string according to the OnBlog 8-bit date format""" + m = _korean_onblog_date_re.match(dateString) + if not m: return + w3dtfdate = "%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s" % \ + {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ + 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\ + 'zonediff': '+09:00'} + if _debug: sys.stderr.write("OnBlog date parsed as: %s\n" % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_onblog) + +def _parse_date_nate(dateString): + """Parse a string according to the Nate 8-bit date format""" + m = _korean_nate_date_re.match(dateString) + if not m: return + hour = int(m.group(5)) + ampm = m.group(4) + if (ampm == _korean_pm): + hour += 12 + hour = str(hour) + if len(hour) == 1: + hour = '0' + hour + w3dtfdate = "%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s" % \ + {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ + 'hour': hour, 'minute': m.group(6), 'second': m.group(7),\ + 'zonediff': '+09:00'} + if _debug: sys.stderr.write("Nate date parsed as: %s\n" % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_nate) + +_mssql_date_re = \ + re.compile('(\d{4})-(\d{2})-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})\.\d+') +def _parse_date_mssql(dateString): + """Parse a string according to the MS SQL date format""" + m = _mssql_date_re.match(dateString) + if not m: return + w3dtfdate = "%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s:%(second)s%(zonediff)s" % \ + {'year': m.group(1), 'month': m.group(2), 'day': m.group(3),\ + 'hour': m.group(4), 'minute': m.group(5), 'second': m.group(6),\ + 'zonediff': '+09:00'} + if _debug: sys.stderr.write("MS SQL date parsed as: %s\n" % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_mssql) + +# Unicode strings for Greek date strings +_greek_months = \ + { \ + u'\u0399\u03b1\u03bd': u'Jan', # c9e1ed in iso-8859-7 + u'\u03a6\u03b5\u03b2': u'Feb', # d6e5e2 in iso-8859-7 + u'\u039c\u03ac\u03ce': u'Mar', # ccdcfe in iso-8859-7 + u'\u039c\u03b1\u03ce': u'Mar', # cce1fe in iso-8859-7 + u'\u0391\u03c0\u03c1': u'Apr', # c1f0f1 in iso-8859-7 + u'\u039c\u03ac\u03b9': u'May', # ccdce9 in iso-8859-7 + u'\u039c\u03b1\u03ca': u'May', # cce1fa in iso-8859-7 + u'\u039c\u03b1\u03b9': u'May', # cce1e9 in iso-8859-7 + u'\u0399\u03bf\u03cd\u03bd': u'Jun', # c9effded in iso-8859-7 + u'\u0399\u03bf\u03bd': u'Jun', # c9efed in iso-8859-7 + u'\u0399\u03bf\u03cd\u03bb': u'Jul', # c9effdeb in iso-8859-7 + u'\u0399\u03bf\u03bb': u'Jul', # c9f9eb in iso-8859-7 + u'\u0391\u03cd\u03b3': u'Aug', # c1fde3 in iso-8859-7 + u'\u0391\u03c5\u03b3': u'Aug', # c1f5e3 in iso-8859-7 + u'\u03a3\u03b5\u03c0': u'Sep', # d3e5f0 in iso-8859-7 + u'\u039f\u03ba\u03c4': u'Oct', # cfeaf4 in iso-8859-7 + u'\u039d\u03bf\u03ad': u'Nov', # cdefdd in iso-8859-7 + u'\u039d\u03bf\u03b5': u'Nov', # cdefe5 in iso-8859-7 + u'\u0394\u03b5\u03ba': u'Dec', # c4e5ea in iso-8859-7 + } + +_greek_wdays = \ + { \ + u'\u039a\u03c5\u03c1': u'Sun', # caf5f1 in iso-8859-7 + u'\u0394\u03b5\u03c5': u'Mon', # c4e5f5 in iso-8859-7 + u'\u03a4\u03c1\u03b9': u'Tue', # d4f1e9 in iso-8859-7 + u'\u03a4\u03b5\u03c4': u'Wed', # d4e5f4 in iso-8859-7 + u'\u03a0\u03b5\u03bc': u'Thu', # d0e5ec in iso-8859-7 + u'\u03a0\u03b1\u03c1': u'Fri', # d0e1f1 in iso-8859-7 + u'\u03a3\u03b1\u03b2': u'Sat', # d3e1e2 in iso-8859-7 + } + +_greek_date_format_re = \ + re.compile(u'([^,]+),\s+(\d{2})\s+([^\s]+)\s+(\d{4})\s+(\d{2}):(\d{2}):(\d{2})\s+([^\s]+)') + +def _parse_date_greek(dateString): + """Parse a string according to a Greek 8-bit date format.""" + m = _greek_date_format_re.match(dateString) + if not m: return + try: + wday = _greek_wdays[m.group(1)] + month = _greek_months[m.group(3)] + except: + return + rfc822date = "%(wday)s, %(day)s %(month)s %(year)s %(hour)s:%(minute)s:%(second)s %(zonediff)s" % \ + {'wday': wday, 'day': m.group(2), 'month': month, 'year': m.group(4),\ + 'hour': m.group(5), 'minute': m.group(6), 'second': m.group(7),\ + 'zonediff': m.group(8)} + if _debug: sys.stderr.write("Greek date parsed as: %s\n" % rfc822date) + return _parse_date_rfc822(rfc822date) +registerDateHandler(_parse_date_greek) + +# Unicode strings for Hungarian date strings +_hungarian_months = \ + { \ + u'janu\u00e1r': u'01', # e1 in iso-8859-2 + u'febru\u00e1ri': u'02', # e1 in iso-8859-2 + u'm\u00e1rcius': u'03', # e1 in iso-8859-2 + u'\u00e1prilis': u'04', # e1 in iso-8859-2 + u'm\u00e1ujus': u'05', # e1 in iso-8859-2 + u'j\u00fanius': u'06', # fa in iso-8859-2 + u'j\u00falius': u'07', # fa in iso-8859-2 + u'augusztus': u'08', + u'szeptember': u'09', + u'okt\u00f3ber': u'10', # f3 in iso-8859-2 + u'november': u'11', + u'december': u'12', + } + +_hungarian_date_format_re = \ + re.compile(u'(\d{4})-([^-]+)-(\d{,2})T(\d{,2}):(\d{2})((\+|-)(\d{,2}:\d{2}))') + +def _parse_date_hungarian(dateString): + """Parse a string according to a Hungarian 8-bit date format.""" + m = _hungarian_date_format_re.match(dateString) + if not m: return + try: + month = _hungarian_months[m.group(2)] + day = m.group(3) + if len(day) == 1: + day = '0' + day + hour = m.group(4) + if len(hour) == 1: + hour = '0' + hour + except: + return + w3dtfdate = "%(year)s-%(month)s-%(day)sT%(hour)s:%(minute)s%(zonediff)s" % \ + {'year': m.group(1), 'month': month, 'day': day,\ + 'hour': hour, 'minute': m.group(5),\ + 'zonediff': m.group(6)} + if _debug: sys.stderr.write("Hungarian date parsed as: %s\n" % w3dtfdate) + return _parse_date_w3dtf(w3dtfdate) +registerDateHandler(_parse_date_hungarian) + +# W3DTF-style date parsing adapted from PyXML xml.utils.iso8601, written by +# Drake and licensed under the Python license. Removed all range checking +# for month, day, hour, minute, and second, since mktime will normalize +# these later +def _parse_date_w3dtf(dateString): + def __extract_date(m): + year = int(m.group("year")) + if year < 100: + year = 100 * int(time.gmtime()[0] / 100) + int(year) + if year < 1000: + return 0, 0, 0 + julian = m.group("julian") + if julian: + julian = int(julian) + month = julian / 30 + 1 + day = julian % 30 + 1 + jday = None + while jday != julian: + t = time.mktime((year, month, day, 0, 0, 0, 0, 0, 0)) + jday = time.gmtime(t)[-2] + diff = abs(jday - julian) + if jday > julian: + if diff < day: + day = day - diff + else: + month = month - 1 + day = 31 + elif jday < julian: + if day + diff < 28: + day = day + diff + else: + month = month + 1 + return year, month, day + month = m.group("month") + day = 1 + if month is None: + month = 1 + else: + month = int(month) + day = m.group("day") + if day: + day = int(day) + else: + day = 1 + return year, month, day + + def __extract_time(m): + if not m: + return 0, 0, 0 + hours = m.group("hours") + if not hours: + return 0, 0, 0 + hours = int(hours) + minutes = int(m.group("minutes")) + seconds = m.group("seconds") + if seconds: + seconds = int(seconds) + else: + seconds = 0 + return hours, minutes, seconds + + def __extract_tzd(m): + """Return the Time Zone Designator as an offset in seconds from UTC.""" + if not m: + return 0 + tzd = m.group("tzd") + if not tzd: + return 0 + if tzd == "Z": + return 0 + hours = int(m.group("tzdhours")) + minutes = m.group("tzdminutes") + if minutes: + minutes = int(minutes) + else: + minutes = 0 + offset = (hours*60 + minutes) * 60 + if tzd[0] == "+": + return -offset + return offset + + __date_re = ("(?P\d\d\d\d)" + "(?:(?P-|)" + "(?:(?P\d\d\d)" + "|(?P\d\d)(?:(?P=dsep)(?P\d\d))?))?") + __tzd_re = "(?P[-+](?P\d\d)(?::?(?P\d\d))|Z)" + __tzd_rx = re.compile(__tzd_re) + __time_re = ("(?P\d\d)(?P:|)(?P\d\d)" + "(?:(?P=tsep)(?P\d\d(?:[.,]\d+)?))?" + + __tzd_re) + __datetime_re = "%s(?:T%s)?" % (__date_re, __time_re) + __datetime_rx = re.compile(__datetime_re) + m = __datetime_rx.match(dateString) + if (m is None) or (m.group() != dateString): return + gmt = __extract_date(m) + __extract_time(m) + (0, 0, 0) + if gmt[0] == 0: return + return time.gmtime(time.mktime(gmt) + __extract_tzd(m) - time.timezone) +registerDateHandler(_parse_date_w3dtf) + +def _parse_date_rfc822(dateString): + """Parse an RFC822, RFC1123, RFC2822, or asctime-style date""" + tm = rfc822.parsedate_tz(dateString) + if tm: + return time.gmtime(rfc822.mktime_tz(tm)) +# rfc822.py defines several time zones, but we define some extra ones. +# "ET" is equivalent to "EST", etc. +_additional_timezones = {'AT': -400, 'ET': -500, 'CT': -600, 'MT': -700, 'PT': -800} +rfc822._timezones.update(_additional_timezones) +registerDateHandler(_parse_date_rfc822) + +def _parse_date(dateString): + """Parses a variety of date formats into a 9-tuple in GMT""" + for handler in _date_handlers: + try: + date9tuple = handler(dateString) + if not date9tuple: continue + if len(date9tuple) != 9: + if _debug: sys.stderr.write("date handler function must return 9-tuple\n") + raise ValueError + map(int, date9tuple) + return date9tuple + except Exception, e: + if _debug: sys.stderr.write("%s raised %s\n" % (handler.__name__, repr(e))) + pass + return None + +def _getCharacterEncoding(http_headers, xml_data): + """Get the character encoding of the XML document + + http_headers is a dictionary + xml_data is a raw string (not Unicode) + + This is so much trickier than it sounds, it's not even funny. + According to RFC 3023 ("XML Media Types"), if the HTTP Content-Type + is application/xml, application/*+xml, + application/xml-external-parsed-entity, or application/xml-dtd, + the encoding given in the charset parameter of the HTTP Content-Type + takes precedence over the encoding given in the XML prefix within the + document, and defaults to "utf-8" if neither are specified. But, if + the HTTP Content-Type is text/xml, text/*+xml, or + text/xml-external-parsed-entity, the encoding given in the XML prefix + within the document is ALWAYS IGNORED and only the encoding given in + the charset parameter of the HTTP Content-Type header should be + respected, and it defaults to "us-ascii" if not specified. + + Furthermore, discussion on the atom-syntax mailing list with the + author of RFC 3023 leads me to the conclusion that any document + served with a Content-Type of text/* and no charset parameter + must be treated as us-ascii. (We now do this.) And also that it + must always be flagged as non-well-formed. (We now do this too.) + + If Content-Type is unspecified (input was local file or non-HTTP source) + or unrecognized (server just got it totally wrong), then go by the + encoding given in the XML prefix of the document and default to + "iso-8859-1" as per the HTTP specification (RFC 2616). + + Then, assuming we didn't find a character encoding in the HTTP headers + (and the HTTP Content-type allowed us to look in the body), we need + to sniff the first few bytes of the XML data and try to determine + whether the encoding is ASCII-compatible. Section F of the XML + specification shows the way here: + http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info + + If the sniffed encoding is not ASCII-compatible, we need to make it + ASCII compatible so that we can sniff further into the XML declaration + to find the encoding attribute, which will tell us the true encoding. + + Of course, none of this guarantees that we will be able to parse the + feed in the declared character encoding (assuming it was declared + correctly, which many are not). CJKCodecs and iconv_codec help a lot; + you should definitely install them if you can. + http://cjkpython.i18n.org/ + """ + + def _parseHTTPContentType(content_type): + """takes HTTP Content-Type header and returns (content type, charset) + + If no charset is specified, returns (content type, '') + If no content type is specified, returns ('', '') + Both return parameters are guaranteed to be lowercase strings + """ + content_type = content_type or '' + content_type, params = cgi.parse_header(content_type) + return content_type, params.get('charset', '').replace("'", "") + + sniffed_xml_encoding = '' + xml_encoding = '' + true_encoding = '' + http_content_type, http_encoding = _parseHTTPContentType(http_headers.get("content-type")) + # Must sniff for non-ASCII-compatible character encodings before + # searching for XML declaration. This heuristic is defined in + # section F of the XML specification: + # http://www.w3.org/TR/REC-xml/#sec-guessing-no-ext-info + try: + if xml_data[:4] == '\x4c\x6f\xa7\x94': + # EBCDIC + xml_data = _ebcdic_to_ascii(xml_data) + elif xml_data[:4] == '\x00\x3c\x00\x3f': + # UTF-16BE + sniffed_xml_encoding = 'utf-16be' + xml_data = unicode(xml_data, 'utf-16be').encode('utf-8') + elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') and (xml_data[2:4] != '\x00\x00'): + # UTF-16BE with BOM + sniffed_xml_encoding = 'utf-16be' + xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8') + elif xml_data[:4] == '\x3c\x00\x3f\x00': + # UTF-16LE + sniffed_xml_encoding = 'utf-16le' + xml_data = unicode(xml_data, 'utf-16le').encode('utf-8') + elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and (xml_data[2:4] != '\x00\x00'): + # UTF-16LE with BOM + sniffed_xml_encoding = 'utf-16le' + xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8') + elif xml_data[:4] == '\x00\x00\x00\x3c': + # UTF-32BE + sniffed_xml_encoding = 'utf-32be' + xml_data = unicode(xml_data, 'utf-32be').encode('utf-8') + elif xml_data[:4] == '\x3c\x00\x00\x00': + # UTF-32LE + sniffed_xml_encoding = 'utf-32le' + xml_data = unicode(xml_data, 'utf-32le').encode('utf-8') + elif xml_data[:4] == '\x00\x00\xfe\xff': + # UTF-32BE with BOM + sniffed_xml_encoding = 'utf-32be' + xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8') + elif xml_data[:4] == '\xff\xfe\x00\x00': + # UTF-32LE with BOM + sniffed_xml_encoding = 'utf-32le' + xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8') + elif xml_data[:3] == '\xef\xbb\xbf': + # UTF-8 with BOM + sniffed_xml_encoding = 'utf-8' + xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8') + else: + # ASCII-compatible + pass + xml_encoding_match = re.compile('^<\?.*encoding=[\'"](.*?)[\'"].*\?>').match(xml_data) + except: + xml_encoding_match = None + if xml_encoding_match: + xml_encoding = xml_encoding_match.groups()[0].lower() + if sniffed_xml_encoding and (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode', 'iso-10646-ucs-4', 'ucs-4', 'csucs4', 'utf-16', 'utf-32', 'utf_16', 'utf_32', 'utf16', 'u16')): + xml_encoding = sniffed_xml_encoding + acceptable_content_type = 0 + application_content_types = ('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity') + text_content_types = ('text/xml', 'text/xml-external-parsed-entity') + if (http_content_type in application_content_types) or \ + (http_content_type.startswith('application/') and http_content_type.endswith('+xml')): + acceptable_content_type = 1 + true_encoding = http_encoding or xml_encoding or 'utf-8' + elif (http_content_type in text_content_types) or \ + (http_content_type.startswith('text/')) and http_content_type.endswith('+xml'): + acceptable_content_type = 1 + true_encoding = http_encoding or 'us-ascii' + elif http_content_type.startswith('text/'): + true_encoding = http_encoding or 'us-ascii' + elif http_headers and (not http_headers.has_key('content-type')): + true_encoding = xml_encoding or 'iso-8859-1' + else: + true_encoding = xml_encoding or 'utf-8' + return true_encoding, http_encoding, xml_encoding, sniffed_xml_encoding, acceptable_content_type + +def _toUTF8(data, encoding): + """Changes an XML data stream on the fly to specify a new encoding + + data is a raw sequence of bytes (not Unicode) that is presumed to be in %encoding already + encoding is a string recognized by encodings.aliases + """ + if _debug: sys.stderr.write('entering _toUTF8, trying encoding %s\n' % encoding) + # strip Byte Order Mark (if present) + if (len(data) >= 4) and (data[:2] == '\xfe\xff') and (data[2:4] != '\x00\x00'): + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-16be': + sys.stderr.write('trying utf-16be instead\n') + encoding = 'utf-16be' + data = data[2:] + elif (len(data) >= 4) and (data[:2] == '\xff\xfe') and (data[2:4] != '\x00\x00'): + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-16le': + sys.stderr.write('trying utf-16le instead\n') + encoding = 'utf-16le' + data = data[2:] + elif data[:3] == '\xef\xbb\xbf': + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-8': + sys.stderr.write('trying utf-8 instead\n') + encoding = 'utf-8' + data = data[3:] + elif data[:4] == '\x00\x00\xfe\xff': + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-32be': + sys.stderr.write('trying utf-32be instead\n') + encoding = 'utf-32be' + data = data[4:] + elif data[:4] == '\xff\xfe\x00\x00': + if _debug: + sys.stderr.write('stripping BOM\n') + if encoding != 'utf-32le': + sys.stderr.write('trying utf-32le instead\n') + encoding = 'utf-32le' + data = data[4:] + newdata = unicode(data, encoding) + if _debug: sys.stderr.write('successfully converted %s data to unicode\n' % encoding) + declmatch = re.compile('^<\?xml[^>]*?>') + newdecl = """""" + if declmatch.search(newdata): + newdata = declmatch.sub(newdecl, newdata) + else: + newdata = newdecl + u'\n' + newdata + return newdata.encode("utf-8") + +def _stripDoctype(data): + """Strips DOCTYPE from XML document, returns (rss_version, stripped_data) + + rss_version may be "rss091n" or None + stripped_data is the same XML document, minus the DOCTYPE + """ + entity_pattern = re.compile(r']*?)>', re.MULTILINE) + data = entity_pattern.sub('', data) + doctype_pattern = re.compile(r']*?)>', re.MULTILINE) + doctype_results = doctype_pattern.findall(data) + doctype = doctype_results and doctype_results[0] or '' + if doctype.lower().count('netscape'): + version = 'rss091n' + else: + version = None + data = doctype_pattern.sub('', data) + return version, data + +def parse(url_file_stream_or_string, etag=None, modified=None, agent=None, referrer=None, handlers=[]): + """Parse a feed from a URL, file, stream, or string""" + result = FeedParserDict() + result['feed'] = FeedParserDict() + result['entries'] = [] + if _XML_AVAILABLE: + result['bozo'] = 0 + if type(handlers) == types.InstanceType: + handlers = [handlers] + try: + f = _open_resource(url_file_stream_or_string, etag, modified, agent, referrer, handlers) + data = f.read() + except Exception, e: + result['bozo'] = 1 + result['bozo_exception'] = e + data = '' + f = None + + # if feed is gzip-compressed, decompress it + if f and data and hasattr(f, "headers"): + if gzip and f.headers.get('content-encoding', '') == 'gzip': + try: + data = gzip.GzipFile(fileobj=_StringIO(data)).read() + except Exception, e: + # Some feeds claim to be gzipped but they're not, so + # we get garbage. Ideally, we should re-request the + # feed without the "Accept-encoding: gzip" header, + # but we don't. + result['bozo'] = 1 + result['bozo_exception'] = e + data = '' + elif zlib and f.headers.get('content-encoding', '') == 'deflate': + try: + data = zlib.decompress(data, -zlib.MAX_WBITS) + except Exception, e: + result['bozo'] = 1 + result['bozo_exception'] = e + data = '' + + # save HTTP headers + if hasattr(f, "info"): + info = f.info() + result["etag"] = info.getheader("ETag") + last_modified = info.getheader("Last-Modified") + if last_modified: + result["modified"] = _parse_date(last_modified) + if hasattr(f, "url"): + result["url"] = f.url + result["status"] = 200 + if hasattr(f, "status"): + result["status"] = f.status + if hasattr(f, "headers"): + result["headers"] = f.headers.dict + if hasattr(f, "close"): + f.close() + + # there are four encodings to keep track of: + # - http_encoding is the encoding declared in the Content-Type HTTP header + # - xml_encoding is the encoding declared in the ; changed +# project name +#2.5 - 7/25/2003 - MAP - changed to Python license (all contributors agree); +# removed unnecessary urllib code -- urllib2 should always be available anyway; +# return actual url, status, and full HTTP headers (as result['url'], +# result['status'], and result['headers']) if parsing a remote feed over HTTP -- +# this should pass all the HTTP tests at ; +# added the latest namespace-of-the-week for RSS 2.0 +#2.5.1 - 7/26/2003 - RMK - clear opener.addheaders so we only send our custom +# User-Agent (otherwise urllib2 sends two, which confuses some servers) +#2.5.2 - 7/28/2003 - MAP - entity-decode inline xml properly; added support for +# inline and as used in some RSS 2.0 feeds +#2.5.3 - 8/6/2003 - TvdV - patch to track whether we're inside an image or +# textInput, and also to return the character encoding (if specified) +#2.6 - 1/1/2004 - MAP - dc:author support (MarekK); fixed bug tracking +# nested divs within content (JohnD); fixed missing sys import (JohanS); +# fixed regular expression to capture XML character encoding (Andrei); +# added support for Atom 0.3-style links; fixed bug with textInput tracking; +# added support for cloud (MartijnP); added support for multiple +# category/dc:subject (MartijnP); normalize content model: "description" gets +# description (which can come from description, summary, or full content if no +# description), "content" gets dict of base/language/type/value (which can come +# from content:encoded, xhtml:body, content, or fullitem); +# fixed bug matching arbitrary Userland namespaces; added xml:base and xml:lang +# tracking; fixed bug tracking unknown tags; fixed bug tracking content when +# element is not in default namespace (like Pocketsoap feed); +# resolve relative URLs in link, guid, docs, url, comments, wfw:comment, +# wfw:commentRSS; resolve relative URLs within embedded HTML markup in +# description, xhtml:body, content, content:encoded, title, subtitle, +# summary, info, tagline, and copyright; added support for pingback and +# trackback namespaces +#2.7 - 1/5/2004 - MAP - really added support for trackback and pingback +# namespaces, as opposed to 2.6 when I said I did but didn't really; +# sanitize HTML markup within some elements; added mxTidy support (if +# installed) to tidy HTML markup within some elements; fixed indentation +# bug in _parse_date (FazalM); use socket.setdefaulttimeout if available +# (FazalM); universal date parsing and normalization (FazalM): 'created', modified', +# 'issued' are parsed into 9-tuple date format and stored in 'created_parsed', +# 'modified_parsed', and 'issued_parsed'; 'date' is duplicated in 'modified' +# and vice-versa; 'date_parsed' is duplicated in 'modified_parsed' and vice-versa +#2.7.1 - 1/9/2004 - MAP - fixed bug handling " and '. fixed memory +# leak not closing url opener (JohnD); added dc:publisher support (MarekK); +# added admin:errorReportsTo support (MarekK); Python 2.1 dict support (MarekK) +#2.7.4 - 1/14/2004 - MAP - added workaround for improperly formed
tags in +# encoded HTML (skadz); fixed unicode handling in normalize_attrs (ChrisL); +# fixed relative URI processing for guid (skadz); added ICBM support; added +# base64 support +#2.7.5 - 1/15/2004 - MAP - added workaround for malformed DOCTYPE (seen on many +# blogspot.com sites); added _debug variable +#2.7.6 - 1/16/2004 - MAP - fixed bug with StringIO importing +#3.0b3 - 1/23/2004 - MAP - parse entire feed with real XML parser (if available); +# added several new supported namespaces; fixed bug tracking naked markup in +# description; added support for enclosure; added support for source; re-added +# support for cloud which got dropped somehow; added support for expirationDate +#3.0b4 - 1/26/2004 - MAP - fixed xml:lang inheritance; fixed multiple bugs tracking +# xml:base URI, one for documents that don't define one explicitly and one for +# documents that define an outer and an inner xml:base that goes out of scope +# before the end of the document +#3.0b5 - 1/26/2004 - MAP - fixed bug parsing multiple links at feed level +#3.0b6 - 1/27/2004 - MAP - added feed type and version detection, result["version"] +# will be one of SUPPORTED_VERSIONS.keys() or empty string if unrecognized; +# added support for creativeCommons:license and cc:license; added support for +# full Atom content model in title, tagline, info, copyright, summary; fixed bug +# with gzip encoding (not always telling server we support it when we do) +#3.0b7 - 1/28/2004 - MAP - support Atom-style author element in author_detail +# (dictionary of "name", "url", "email"); map author to author_detail if author +# contains name + email address +#3.0b8 - 1/28/2004 - MAP - added support for contributor +#3.0b9 - 1/29/2004 - MAP - fixed check for presence of dict function; added +# support for summary +#3.0b10 - 1/31/2004 - MAP - incorporated ISO-8601 date parsing routines from +# xml.util.iso8601 +#3.0b11 - 2/2/2004 - MAP - added 'rights' to list of elements that can contain +# dangerous markup; fiddled with decodeEntities (not right); liberalized +# date parsing even further +#3.0b12 - 2/6/2004 - MAP - fiddled with decodeEntities (still not right); +# added support to Atom 0.2 subtitle; added support for Atom content model +# in copyright; better sanitizing of dangerous HTML elements with end tags +# (script, frameset) +#3.0b13 - 2/8/2004 - MAP - better handling of empty HTML tags (br, hr, img, +# etc.) in embedded markup, in either HTML or XHTML form (
,
,
) +#3.0b14 - 2/8/2004 - MAP - fixed CDATA handling in non-wellformed feeds under +# Python 2.1 +#3.0b15 - 2/11/2004 - MAP - fixed bug resolving relative links in wfw:commentRSS; +# fixed bug capturing author and contributor URL; fixed bug resolving relative +# links in author and contributor URL; fixed bug resolvin relative links in +# generator URL; added support for recognizing RSS 1.0; passed Simon Fell's +# namespace tests, and included them permanently in the test suite with his +# permission; fixed namespace handling under Python 2.1 +#3.0b16 - 2/12/2004 - MAP - fixed support for RSS 0.90 (broken in b15) +#3.0b17 - 2/13/2004 - MAP - determine character encoding as per RFC 3023 +#3.0b18 - 2/17/2004 - MAP - always map description to summary_detail (Andrei); +# use libxml2 (if available) +#3.0b19 - 3/15/2004 - MAP - fixed bug exploding author information when author +# name was in parentheses; removed ultra-problematic mxTidy support; patch to +# workaround crash in PyXML/expat when encountering invalid entities +# (MarkMoraes); support for textinput/textInput +#3.0b20 - 4/7/2004 - MAP - added CDF support +#3.0b21 - 4/14/2004 - MAP - added Hot RSS support +#3.0b22 - 4/19/2004 - MAP - changed 'channel' to 'feed', 'item' to 'entries' in +# results dict; changed results dict to allow getting values with results.key +# as well as results[key]; work around embedded illformed HTML with half +# a DOCTYPE; work around malformed Content-Type header; if character encoding +# is wrong, try several common ones before falling back to regexes (if this +# works, bozo_exception is set to CharacterEncodingOverride); fixed character +# encoding issues in BaseHTMLProcessor by tracking encoding and converting +# from Unicode to raw strings before feeding data to sgmllib.SGMLParser; +# convert each value in results to Unicode (if possible), even if using +# regex-based parsing +#3.0b23 - 4/21/2004 - MAP - fixed UnicodeDecodeError for feeds that contain +# high-bit characters in attributes in embedded HTML in description (thanks +# Thijs van de Vossen); moved guid, date, and date_parsed to mapped keys in +# FeedParserDict; tweaked FeedParserDict.has_key to return True if asking +# about a mapped key +#3.0fc1 - 4/23/2004 - MAP - made results.entries[0].links[0] and +# results.entries[0].enclosures[0] into FeedParserDict; fixed typo that could +# cause the same encoding to be tried twice (even if it failed the first time); +# fixed DOCTYPE stripping when DOCTYPE contained entity declarations; +# better textinput and image tracking in illformed RSS 1.0 feeds +#3.0fc2 - 5/10/2004 - MAP - added and passed Sam's amp tests; added and passed +# my blink tag tests +#3.0fc3 - 6/18/2004 - MAP - fixed bug in _changeEncodingDeclaration that +# failed to parse utf-16 encoded feeds; made source into a FeedParserDict; +# duplicate admin:generatorAgent/@rdf:resource in generator_detail.url; +# added support for image; refactored parse() fallback logic to try other +# encodings if SAX parsing fails (previously it would only try other encodings +# if re-encoding failed); remove unichr madness in normalize_attrs now that +# we're properly tracking encoding in and out of BaseHTMLProcessor; set +# feed.language from root-level xml:lang; set entry.id from rdf:about; +# send Accept header +#3.0 - 6/21/2004 - MAP - don't try iso-8859-1 (can't distinguish between +# iso-8859-1 and windows-1252 anyway, and most incorrectly marked feeds are +# windows-1252); fixed regression that could cause the same encoding to be +# tried twice (even if it failed the first time) +#3.0.1 - 6/22/2004 - MAP - default to us-ascii for all text/* content types; +# recover from malformed content-type header parameter with no equals sign +# ("text/xml; charset:iso-8859-1") +#3.1 - 6/28/2004 - MAP - added and passed tests for converting HTML entities +# to Unicode equivalents in illformed feeds (aaronsw); added and +# passed tests for converting character entities to Unicode equivalents +# in illformed feeds (aaronsw); test for valid parsers when setting +# XML_AVAILABLE; make version and encoding available when server returns +# a 304; add handlers parameter to pass arbitrary urllib2 handlers (like +# digest auth or proxy support); add code to parse username/password +# out of url and send as basic authentication; expose downloading-related +# exceptions in bozo_exception (aaronsw); added __contains__ method to +# FeedParserDict (aaronsw); added publisher_detail (aaronsw) +#3.2 - 7/3/2004 - MAP - use cjkcodecs and iconv_codec if available; always +# convert feed to UTF-8 before passing to XML parser; completely revamped +# logic for determining character encoding and attempting XML parsing +# (much faster); increased default timeout to 20 seconds; test for presence +# of Location header on redirects; added tests for many alternate character +# encodings; support various EBCDIC encodings; support UTF-16BE and +# UTF16-LE with or without a BOM; support UTF-8 with a BOM; support +# UTF-32BE and UTF-32LE with or without a BOM; fixed crashing bug if no +# XML parsers are available; added support for "Content-encoding: deflate"; +# send blank "Accept-encoding: " header if neither gzip nor zlib modules +# are available +#3.3 - 7/15/2004 - MAP - optimize EBCDIC to ASCII conversion; fix obscure +# problem tracking xml:base and xml:lang if element declares it, child +# doesn't, first grandchild redeclares it, and second grandchild doesn't; +# refactored date parsing; defined public registerDateHandler so callers +# can add support for additional date formats at runtime; added support +# for OnBlog, Nate, MSSQL, Greek, and Hungarian dates (ytrewq1); added +# zopeCompatibilityHack() which turns FeedParserDict into a regular +# dictionary, required for Zope compatibility, and also makes command- +# line debugging easier because pprint module formats real dictionaries +# better than dictionary-like objects; added NonXMLContentType exception, +# which is stored in bozo_exception when a feed is served with a non-XML +# media type such as "text/plain"; respect Content-Language as default +# language if not xml:lang is present; cloud dict is now FeedParserDict; +# generator dict is now FeedParserDict; better tracking of xml:lang, +# including support for xml:lang="" to unset the current language; +# recognize RSS 1.0 feeds even when RSS 1.0 namespace is not the default +# namespace; don't overwrite final status on redirects (scenarios: +# redirecting to a URL that returns 304, redirecting to a URL that +# redirects to another URL with a different type of redirect); add +# support for HTTP 303 redirects +#3.3.1 - 11/23/2004 - RSlakinski - added support for podcast:enclosure +# to support the RSS 2.0 module for this element type +#3.3.2 - 07/13/2005 -RSlakinski - added the namespaces for Yahoo Media \ No newline at end of file diff --git a/iPXAgent.py b/iPXAgent.py new file mode 100755 index 0000000..bc658ed --- /dev/null +++ b/iPXAgent.py @@ -0,0 +1,177 @@ +#(c) 2004-2008 Thunderstone Media, LLC +#Creative Commons Attribution-Noncommercial 3.0 United States License +# +#Python Developyment By: +# +#Ray Slakinski +#August Trometer + +import iPXSettings +import iPXClass +from iPXTools import * + +def usage(): + printMSG('\r\n%s' % iPXSettings.USER_AGENT) + printMSG('-help\r\nPrints this help screen') + printMSG('\r\n-url==""\r\nGets just the specified feed URL (must exist in feeds.plist)') + printMSG('\r\n-id==""\r\nGets just the feed URL associated to the feed ID specified') + printMSG('\r\n-getEnc==";;;;"\r\nGets just the secified enclosure') + printMSG('\r\n-updateApps==";;;;"\r\nAdds the file into the appropriete application') + printMSG('\r\n-progName==""\r\nTells the engine where to find program files') + printMSG('\r\n-ui\r\nIf the GUI is running the command then it should specifiy this param') + printMSG('\r\n-initSmartSpace\r\nInitializes cache files for SmartSpace') + printMSG('\r\n-debug\r\nEnables printing of debug messages to the console') + printMSG('\r\n-superdebug\r\nEnables printing of debug messages and HTTP traffic information to the console\r\n') + +def firstInit(): + import os + + iPXSettings.initSettings() + checkDir(iPXSettings.tmpDownloadDir) + + if os.path.isdir(iPXSettings.historyFile): + logIt('History is a directory? - Resetting history') + delTree(iPXSettings.historyFile) + os.removedirs(iPXSettings.historyFile) + try: + #Resetting downloadBehavior + logIt('Resetting downloadBehavior to 3') + FeedListPrefs = plistlib.Plist.fromFile(file('%sfeeds.plist' % iPXSettings.rssPath)) + feedDetails = FeedListPrefs['iPodderXFeeds'] + + for feed in feedDetails: + feed['downloadBehavior'] = 3 + + FeedListPrefs.write('%sfeeds.plist' % iPXSettings.rssPath) + except Exception, msg: + logIt('ERRMSG: %s' % str(msg)) + + checkDir(iPXSettings.logPath) + checkDir(iPXSettings.downloadDirectory) + checkDir(iPXSettings.rssPath) + checkDir('%sfeedData/' % iPXSettings.rssPath) + trimLog() + iPXSettings.globalProxySetting = setProxy() + if len(iPXSettings.globalProxySetting) > 0: + logIt('Proxy Server Detected...') + +def main(): + import re, sys + + for arg in sys.argv: + if re.search('-help', arg, re.IGNORECASE): + gotFeedAlready = True + usage() + sys.exit() + + iPXSettings.progName = 'iPodderX' + for arg in sys.argv: + if re.search('-progName', arg, re.IGNORECASE): + progNameSplit = arg.split('==') + iPXSettings.progName = progNameSplit[len(progNameSplit)-1] + + firstInit() + for arg in sys.argv: + if arg == '-debug': + printMSG( '--- DEBUG ENABLED ---') + iPXSettings.DEBUG = 1 + elif arg == '-superdebug': + printMSG( '--- SUPER DEBUG ENABLED ---') + import httplib + httplib.HTTPConnection.debuglevel = 1 + iPXSettings.DEBUG = 1 + iPXSettings.SUPERDEBUG = 1 + + try: + import psyco + logIt('Enabling Psyco JIT Compiler...') + psyco.full() + print passed + except Exception, msg: + pass + + logIt('\r\n%s Feed Scan Started: %s' % (iPXSettings.USER_AGENT, strftime('%H:%M:%S -- %m/%d/%Y',localtime()))) + logIt('Platform: %s\r\n' % sys.platform) + if checkReg() == 0: + logIt('%s is UNREGISTERED' % iPXSettings.USER_AGENT) + printMSG('APPLICATION_UNREGISTERED\r\n') + sys.exit(0) + + logIt('Params used to launch:') + for arg in sys.argv: + if not arg == sys.argv[0]: + logIt(str(arg)) + + #Checking to see if the script was run from iPodderX.app or not... + for arg in sys.argv: + if re.search('-ui', arg, re.IGNORECASE): + iPXSettings.ranFromUI = True + logIt('Feed check being run from UI') + if iPXSettings.ranFromUI == False: + if checkForScript() == True: + sys.exit() + pass + + gotFeedAlready = False + feedsObj = iPXClass.Feeds() + if len(feedsObj.feedList) > 0: + for arg in sys.argv: + if re.search('-initSmartSpace', arg, re.IGNORECASE): + from iPXQuotaManager import getAllowedDelList + printMSG('Generating SmartSpace Data...') + delTree('%s/iPXCache/' % iPXSettings.tempDir) + checkDir('%s/iPXCache/' % iPXSettings.tempDir) + gotFeedAlready = True + x, y = getAllowedDelList() + break + if re.search('-url==', arg, re.IGNORECASE): + gotFeedAlready = True + argsSplit = arg.split('==') + feedsObj.retrFeed(argsSplit[1], 0) + if re.search('-id==', arg, re.IGNORECASE): + gotFeedAlready = True + argsSplit = arg.split('==') + feedsObj.retrFeed(argsSplit[1], 1) + if re.search('-getEnc==', arg, re.IGNORECASE): + gotFeedAlready = True + iPXSettings.torrentMinDownRate = 0 + argsSplit = arg.split('==') + temp = argsSplit[1] + params = temp.split(';;') + if iPXSettings.ranFromUI: + #strip quotes off the params... + param1 = params[0] + param2 = params[1] + param3 = params[2] + param3 = param3.replace('-progName', '') + param3 = param3.strip() + feedsObj.retrEnclosure(param1[1:], param2, param3[:len(param3)-1]) + else: + feedsObj.retrEnclosure(params[0], params[1], params[2]) + if re.search('-updateApps==', arg, re.IGNORECASE): + gotFeedAlready = True + argsSplit = arg.split('==') + temp = argsSplit[1] + params = temp.split(';;') + if iPXSettings.ranFromUI: + #strip quotes off the params... + param1 = params[0] + param2 = params[1] + param3 = params[2] + feedsObj.retrEnclosure(param1[1:], param2, param3[:len(param3)-1], True) + else: + feedsObj.retrEnclosure(params[0], params[1], params[2], True) + + if not gotFeedAlready: + feedsObj.retrFeeds() + else: + logIt('feeds.plist in use or empty...') + + if not iPXSettings.ranFromUI: + delTree(iPXSettings.tmpDownloadDir) + + printMSG('SUBSCRIPTION_SCAN_COMPLETE') + logIt('%s Feed Scan Completed: %s' % (iPXSettings.USER_AGENT, strftime('%H:%M:%S -- %m/%d/%Y',localtime()))) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/iPXClass.py b/iPXClass.py new file mode 100755 index 0000000..b7b7937 --- /dev/null +++ b/iPXClass.py @@ -0,0 +1,1334 @@ +#(c) 2004-2008 Thunderstone Media, LLC +#Creative Commons Attribution-Noncommercial 3.0 United States License +# +#Python Developyment By: +# +#Ray Slakinski +#August Trometer + +import iPXSettings +from iPXTools import * +from iPXDownloader import * +from time import * +from datetime import * + +class Feeds: + def __init__(self): + self.feedList = [] + self.__getEnabledFeeds(iPXSettings.FeedListPrefs['iPodderXFeeds']) + + def retrFeeds(self): + import re + + for feed in self.feedList: + if feed.has_key('feedURL'): + if len(feed['feedURL']) > 0: + if not feed.has_key('feedID'): + logIt('Feeds file could not provide feedID, generating new one') + feed['feedID'] = genHash(feed['feedURL']) + + if iPXSettings.ranFromUI == False and checkForUI() == True: + logIt('Shutting down script - UI has started...') + break + elif feed.has_key('feedURL'): + if re.search('opml$', feed['feedURL'], re.IGNORECASE): + opmlFeeds = getOpmlFeeds(feed['feedURL']) + + for entry in opmlFeeds: + feed['feedURL'] = opmlFeeds[entry] + feed['feedTitle'] = entry + feedData = FeedData(feed, None, False) + else: + if feed.has_key('ttl') and feed.has_key('lastChecked'): + currTime = mktime(gmtime()) + lastChecked = mktime(strptime(feed['lastChecked'], '%a, %d %b %Y %H:%M:%S GMT')) + if (lastChecked + (float(feed['ttl']) * 60)) - currTime <= 0: + FeedData(feed) + else: + logIt('Skipping feed(%s) for TTL reasons.' % feed['feedURL']) + logIt('TTL Value = %s' % str((lastChecked + (float(feed['ttl']) * 60)) - currTime) + ' seconds.') + else: + FeedData(feed) + + def retrFeed(self, feedID, retrType): + import re + + for feed in self.feedList: + if not feed.has_key('feedID'): + logIt('Feeds file could not provide feedID, generating new one') + feed['feedID'] = genHash(feed['feedURL']) + + if retrType > 0: + if feed['feedID'] == feedID: + if re.search('opml$', feed['feedURL'], re.IGNORECASE): + opmlFeeds = getOpmlFeeds(feed['feedURL']) + + for entry in opmlFeeds: + feed['feedURL'] = opmlFeeds[entry] + feed['feedTitle'] = entry + FeedData(feed, None, False) + else: + FeedData(feed, None, False) + else: + if feed['feedURL'] == feedID: + if re.search('opml$', feed['feedURL'], re.IGNORECASE): + opmlFeeds = getOpmlFeeds(feed['feedURL']) + + for entry in opmlFeeds: + feed['feedURL'] = opmlFeeds[entry] + feed['feedTitle'] = entry + FeedData(feed, None, False) + else: + FeedData(feed, None, False) + + def retrEnclosure(self, feedID, entryGUID, encURL, hasFile=False): + getEncURL = entryGUID + ';;' + encURL + #logIt('FeedID: %s, getEncURL: %s' % (feedID, getEncURL)) + for feed in self.feedList: + if feed['feedID'] == feedID: + FeedData(feed, getEncURL, False, hasFile) + + def getEnclosuresList(self): + import os + + encList = [] + for feed in self.feedList: + if feed.has_key('feedID'): + hashFile = iPXSettings.rssPath + 'feedData/' + feed['feedID'] + '.ipxd' + if os.path.isfile(hashFile): + try: + EntriesData = readplist(hashFile) + if EntriesData.has_key('entries'): + for entry in EntriesData['entries']: + if entry.has_key('read'): + if entry['read'] == True: + if entry.has_key('flagged'): + if entry['flagged'] == False: + if entry.has_key('enclosures'): + for enc in entry['enclosures']: + if enc.has_key('path'): + if len(enc['path']) > 0: + encList.append(enc) + else: + if entry.has_key('enclosures'): + for enc in entry['enclosures']: + if enc.has_key('path'): + if len(enc['path']) > 0: + encList.append(enc) + else: + if entry.has_key('enclosures'): + for enc in entry['enclosures']: + if enc.has_key('path'): + if len(enc['path']) > 0: + encList.append(enc) + except Exception, msg: + logIt('getEnclosuresList Faied: %s' % msg) + + return encList + + def createQMCacheBridge(self): + import iPXQuotaManager, os + + for feed in self.feedList: + if feed.has_key('feedID'): + hashFile = iPXSettings.rssPath + 'feedData/' + feed['feedID'] + '.ipxd' + if os.path.isfile(hashFile): + try: + EntriesData = readplist(hashFile) + if Entries.has_key('entries'): + for entry in EntriesData['entries']: + if entry.has_key('enclosures'): + for enc in entry['enclosures']: + if enc.has_key('path'): + encFile = os.path.join(iPXSettings.downloadDirectory + '/' + enc['path'] + '/' + enc['file']) + if os.path.isfile(encFile): + iPXQuotaManager.writeQuotaCache(feed['feedID'], entry['guid'], enc['path'] + '/' + enc['file'], enc['length']) + except Exception, msg: + logIt('getEnclosuresList Faied: %s' % msg) + + return #encList + + def __getEnabledFeeds(self, feedList): + newFeedList = [] + self.feedList = [] + + append = self.feedList.append + for feed in feedList: + if feed['enabled']: + append(feed) + + +class FeedData: + def __init__(self, feed, getEncURL=None, useEtag=True, hasFile=False): + import re + + self.feed = feed + self.status = 0 + self.explicit = False + self.entries = {} + self.parsedFeed = {} + self.entriesData = [] + + printMSG(' ') + try: + if feed.has_key('customFeedTitle'): + if len(feed['customFeedTitle']) > 0: + printMSG('%s;;%s' % (HTML2Text(feed['customFeedTitle']), feed['feedID'])) + else: + printMSG('%s;;%s' % (HTML2Text(feed['feedTitle']), feed['feedID'])) + else: + printMSG('%s;;%s' % (HTML2Text(feed['feedTitle']), feed['feedID'])) + except: + printMSG('%s;;%s' % (HTML2Text(feed['feedURL']), feed['feedID'])) + + status = 0 + + if not getEncURL == None: + if hasFile: + self.__getEntryEnclosure(getEncURL, hasFile) + else: + self.__getEntryEnclosure(getEncURL) + elif feed.has_key('etag') and iPXSettings.DEBUG == 0 and useEtag == True: + status = self.__getFeed(feed['feedURL'], feed['etag'], feed['feedID']) + elif feed.has_key('etag') and useEtag == False: + status = self.__getFeed(feed['feedURL'], 'None', feed['feedID']) + else: + status = self.__getFeed(feed['feedURL'], 'None', feed['feedID']) + + if status >= 0: + feed['error'] = False + if status == 200 or status == 301 or status == 302: + if self.parsedFeed.has_key('feed'): + #Check feed level, which overrides entry level + if self.parsedFeed.feed.has_key('itunes_explicit'): + if re.search('yes', self.parsedFeed.feed.itunes_explicit, re.IGNORECASE): + self.explicit = True + elif self.parsedFeed.feed.has_key('media_adult'): + if re.search('true', self.parsedFeed.feed.media_adult, re.IGNORECASE): + self.explicit = True + feed['explicit'] = self.explicit + self.__getEntries() + elif (status != 500) and (status != 304) and (status != 302) and (status != 301) and (status != 0): + feed['error'] = True + logIt('Feed recieved a status of %d, expected 200 or 304' % status) + + self.__saveFeedData(feed) + + def __getEntries(self): + from sets import Set + import sys, os, re + + newEntriesList = [] + encList = [] + tempList = [] + hashFile = '' + numDownloads = 0 + numDFiles = 0 + totalDSize = 0 + maxDownloads = 10000000 + totalDSize = 0 + + if self.feed.has_key('downloadBehavior'): + if int(self.feed['downloadBehavior']) == 3: + maxDownloads = 0 + elif int(self.feed['downloadBehavior']) == 2: + maxDownloads = 3 + elif int(self.feed['downloadBehavior']) == 1: + maxDownloads = 1 + self.feed['downloadBehavior'] = 0 + + hashFile = iPXSettings.rssPath + 'feedData/' + self.feed['feedID'] + '.ipxd' + + if os.path.isfile(hashFile): + try: + EntriesData = readplist(hashFile) + if EntriesData.has_key('entries'): + entryOrig = EntriesData['entries'] + else: + logIt('Hash file seems to be currupt... resetting file') + entryOrig = {} + except: + import plistlib + + logIt('Hash file seems to be currupt... resetting file') + EntriesData = plistlib.Plist() + entryOrig = {} + else: + if sys.platform == 'darwin': + EntriesData = NSMutableDictionary.dictionary() + else: + import plistlib + + EntriesData = plistlib.Plist() + entryOrig = {} + + append = newEntriesList.append + for entry in entryOrig: + if not entry.has_key('guid'): + entry['guid'] = '' + + if not entry.has_key('read'): + entry['read'] = True + + if not entry['guid'] in encList: + if len(entry['guid']) > 1: + encList.append(entry['guid']) + + append(entry) + + if self.parsedFeed.has_key('entries'): + for entry in self.parsedFeed.entries: + if entry.has_key('modified_parsed'): + if not entry.modified_parsed == None: + pubDate = entry.modified_parsed + else: + pubDate = gmtime() + else: + pubDate = gmtime() + + strCat = '' + catList = [] + if entry.has_key('categories'): + for dict in entry.categories: + + append = catList.append + for cat in dict: + if not type(cat) is NoneType: + if not cat == 'None': + try: + append(cat.encode('utf-8')) + except: + pass + categories = Set(catList) + for category in categories: + if not re.search('http://', category, re.IGNORECASE) or re.search('https://', category, re.IGNORECASE): + strCat = strCat + category + ', ' + if len(strCat) > 0: + if strCat[len(strCat)-2] == ',': + strCat = strCat[:-2] + + strAuthor = '' + if entry.has_key('author'): + strAuthor = entry.author + + strLink = self.feed['feedURL'] + if entry.has_key('link'): + strLink = entry.link + + strCommentsLink = '' + if entry.has_key('comments'): + strCommentsLink = entry.comments + + strSourceLink = '' + strSourceName = '' + if entry.has_key('source'): + if entry.source.has_key('url'): + strSourceLink = entry.source.url + if entry.source.has_key('value'): + strSourceName = entry.source.value + + explicit = False + #Check feed level, which overrides entry level + if self.parsedFeed.feed.has_key('itunes_explicit'): + if re.search('yes', self.parsedFeed.feed.itunes_explicit, re.IGNORECASE): + explicit = True + elif self.parsedFeed.feed.has_key('media_adult'): + if re.search('true', self.parsedFeed.feed.media_adult, re.IGNORECASE): + explicit = True + #Check entry level if not set by feed level + if explicit == False: + if entry.has_key('itunes_explicit'): + if re.search('yes', entry.itunes_explicit, re.IGNORECASE): + explicit = True + elif entry.has_key('media_adult'): + if re.search('true', entry.media_adult, re.IGNORECASE): + explicit = True + + uniDescription = unicode('No Entry Text Found In Feed', 'utf-8') + if entry.has_key('content'): + uniDescription = entry.content[0].value + elif entry.has_key('summary_detail'): + uniDescription = entry.summary_detail.value + elif entry.has_key('description'): + uniDescription = entry.description + try: + if len(uniDescription) == 0: + uniDescription = unicode('No Entry Text Found In Feed', 'utf-8') + except: + uniDescription = unicode('No Entry Text Found In Feed', 'utf-8') + + uniDescription = uniDescription.strip() + uniDescription = uniDescription.strip(chr(0)) + uniDescription = uniDescription.replace('\x00', '') + uniDescription = uniDescription.replace('\r', '') + + if type(uniDescription) == StringType: + uniDescription = HTML2Text(uniDescription) + + uniSummary = unicode('', 'utf-8') + if entry.has_key('summary_detail'): + uniDescription = entry.summary_detail.value + + uniSummary = uniSummary.strip() + uniSummary = uniSummary.strip(chr(0)) + uniSummary = uniSummary.replace('\x00', '') + uniSummary = uniSummary.replace('\r', '') + + if type(uniSummary) == StringType: + uniSummary = HTML2Text(uniSummary) + + if entry.has_key('guid'): + strGUID = entry.guid + elif entry.has_key('title'): + if len(entry.title) > 20: + strGUID = genHash(entry.title) + else: + strGUID = genHash(uniDescription) + else: + strGUID = genHash(uniDescription) + + uniTitle = unicode('', 'utf-8') + if entry.has_key('title'): + uniTitle = HTML2Text(entry.title) + try: + uniTitle = tmpTitle.encode('utf-8') + except Exception, msg: + pass + + strLink = self.feed['feedURL'] + if entry.has_key('link'): + strLink = entry.link + + encArray = [] + if entry.has_key('enclosures') or entry.has_key('links') or entry.has_key('apple-wallpapers_image'): + if iPXSettings.showExplicit == True: + if numDownloads < maxDownloads: + encArray, numDownloaded, sizeDownloaded = self.__getEntryEnclosures(entry, True, self.feed['baseHost']) + else: + encArray, numDownloaded, sizeDownloaded = self.__getEntryEnclosures(entry, False) + elif explicit == True: + encArray, numDownloaded, sizeDownloaded = self.__getEntryEnclosures(entry, False) + else: + if numDownloads < maxDownloads: + encArray, numDownloaded, sizeDownloaded = self.__getEntryEnclosures(entry, True, self.feed['baseHost']) + else: + encArray, numDownloaded, sizeDownloaded = self.__getEntryEnclosures(entry, False) + if numDownloaded > 0: + numDownloaded = 0 + numDownloads = numDownloads + 1 + numDFiles = numDFiles + numDownloads + totalDSize = totalDSize + long(sizeDownloaded) + + if self.feed.has_key('textToAudio'): + if not strGUID in encList: + if self.feed['textToAudio']: + tempEnc = self.downloadTextAsAudio(uniTitle, strftime('%A %B %d %Y', pubDate), uniDescription, strGUID) + + if not tempEnc == None: + encArray.append(tempEnc) + + newEntry = {'description': uniDescription, + 'summary': uniSummary, + 'link': strLink, + 'title': uniTitle, + 'read': False, + 'enclosures': encArray, + 'pubDate': strftime('%a, %d %b %Y %H:%M:%S GMT', pubDate), + #'datePublished' : strftime('%Y-%b-%dT%H:%M:%SZ', pubDate), + 'category': strCat, + 'commentsLink': strCommentsLink, + 'feedTitle': HTML2Text(self.feed['feedTitle']), + 'sourceTitle': strSourceName, + 'sourceLink': HTML2Text(strSourceLink), + 'explicit': explicit, + 'author': strAuthor, + 'guid': strGUID + } + + tempList.append(newEntry['guid']) + + if strGUID in encList: + for entry in newEntriesList: + if entry.has_key('guid'): + if entry['guid'] == newEntry['guid']: + if entry.has_key('origDescription'): + if not genHash(entry['origDescription']) == genHash(newEntry['description']): + entry['bakDescription'] = entry['origDescription'] + entry['origDescription'] = newEntry['description'] + entry['description'] = textDiff(entry['origDescription'], newEntry['description']) + entry['title'] = newEntry['title'] + if genHash(HTML2Text(newEntry['description'])) != genHash(HTML2Text(entry['origDescription'])): + entry['read'] = False + if len(entry['enclosures']) < len(newEntry['enclosures']): + entry['enclosures'] = newEntry['enclosures'] + entry['read'] = False + elif genHash(entry['description']) != genHash(newEntry['description']): + entry['bakDescription'] = entry['description'] + entry['origDescription'] = newEntry['description'] + entry['description'] = textDiff(entry['description'], newEntry['description']) + entry['title'] = newEntry['title'] + if genHash(HTML2Text(newEntry['description'])) != genHash(HTML2Text(entry['origDescription'])): + entry['read'] = False + if len(entry['enclosures']) < len(newEntry['enclosures']): + entry['enclosures'] = newEntry['enclosures'] + entry['read'] = False + elif genHash(entry['title']) != genHash(newEntry['title']): + if len(newEntry['title']) > 0: + entry['title'] = newEntry['title'] + if len(entry['enclosures']) < len(newEntry['enclosures']): + entry['enclosures'] = newEntry['enclosures'] + entry['read'] = False + elif len(entry['enclosures']) < len(newEntry['enclosures']): + entry['enclosures'] = newEntry['enclosures'] + entry['read'] = False + else: + encList.append(newEntry['guid']) + newEntriesList.append(newEntry) + + if numDFiles > 0: + self.__saveHashFile(EntriesData, newEntriesList, tempList, numDFiles, totalDSize, hashFile) + numDFiles = 0 + totalDSize = 0.0 + + self.__saveHashFile(EntriesData, newEntriesList, tempList, numDownloads, totalDSize, hashFile) + + def __saveHashFile(self, EntriesData, newEntriesList, tempList, numDownloads, totalDSize, hashFile, skipDelOld=False): + import os + + logIt('Saving to hashFile: %s' % hashFile) + dellist = [] + if skipDelOld == False: + #Lets delete old entries... + for entry in newEntriesList: + if not entry['guid'] in tempList: + flagged = False + if entry.has_key('flagged'): + flagged = entry['flagged'] + hasFile = False + if entry.has_key('enclosures'): + if len(entry['enclosures']) > 0: + for enclosure in entry['enclosures']: + path = enclosure['path'] + fullPath = iPXSettings.downloadDirectory + '/' + path + fileName = enclosure['file'] + if os.path.isfile(fullPath + '/' + fileName): + hasFile = True + break + + if hasFile == False: + if entry['read'] == True: + if flagged == False: + if len(entry['enclosures']) == 0: + try: + tmpEntryDate = strptime(entry['pubDate'], '%a, %d %b %Y %H:%M:%S %Z') + entryDate = date(tmpEntryDate[0], tmpEntryDate[1], tmpEntryDate[2]) + dateDelta = date.today() - entryDate + strDateDelta = str(dateDelta).split() + if len(strDateDelta) > 1: + if iPXSettings.maxEntryAge > 0: + if int(strDateDelta[0]) > iPXSettings.maxEntryAge: + dellist.append(entry) + except: + pass + if len(dellist) > 0: + remove = newEntriesList.remove + for entry in dellist: + remove(entry) + + if EntriesData.has_key('statistics'): + stats = EntriesData['statistics'] + numDFiles = numDownloads + if stats.has_key('numDFiles'): + numDFiles = numDFiles + long(stats['numDFiles']) + totalDSizeMB = float(totalDSize) / 1048576.0 + if stats.has_key('totalDSize'): + totalDSizeMB = float(totalDSizeMB) + float(stats['totalDSize']) + strTotalDSizeMB = '%.2f' % totalDSizeMB + firstCheck = strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()) + if stats.has_key('firstCheck'): + firstCheck = stats['firstCheck'] + stats = {'firstCheck': firstCheck, + 'lastCheck': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'numDFiles': str(numDFiles), + 'totalDSize': strTotalDSizeMB} + else: + totalDSizeMB = float(totalDSize) / 1048576.0 + strTotalDSizeMB = '%.2f' % totalDSizeMB + numDFiles = numDownloads + stats = {'firstCheck': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'lastCheck': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'numDFiles': str(numDFiles), + 'totalDSize': strTotalDSizeMB} + + EntriesData['statistics'] = stats + EntriesData['entries'] = newEntriesList + writeplist(EntriesData, hashFile) + + def __getEntryEnclosure(self, getEncURL, hasFile=False): + import sys, os, re + + logIt('getEncURL') + + origEntriesList = [] + hashFile = '' + totalDSize = 0 + numDFiles = 1 + + hashFile = iPXSettings.rssPath + 'feedData/' + self.feed['feedID'] + '.ipxd' + + if iPXSettings.ranHistCheck == False: + iPXSettings.histGUIDs = getHistory() + iPXSettings.ranHistCheck = True + + if os.path.isfile(hashFile): + try: + EntriesData = readplist(hashFile) + if EntriesData.has_key('entries'): + entryOrig = EntriesData['entries'] + else: + logIt('Hash file seems to be currupt... resetting file') + entryOrig = {} + except: + import plistlib + + logIt('Hash file seems to be currupt... resetting file') + EntriesData = plistlib.Plist() + entryOrig = {} + else: + if sys.platform == 'darwin': + EntriesData = NSMutableDictionary.dictionary() + else: + import plistlib + + EntriesData = plistlib.Plist() + entryOrig = {} + + append = origEntriesList.append + for entry in entryOrig: + append(entry) + + getEncURLSplit = getEncURL.split(';;') + guid = getEncURLSplit[0] + encURL = getEncURLSplit[1] + + for entry in origEntriesList: + if entry['guid'] == guid: + for enclosure in entry['enclosures']: + if enclosure['enclosureURL'] == encURL: + downloadError = False + url = encURL.strip() + length = '0' + if enclosure.has_key('length'): + if len(enclosure['length']) > 0: + length = enclosure['length'] + totalDSize = totalDSize + long(length) + fileType = enclosure['type'] + guid = enclosure['guid'] + feedTitle = HTML2Text(self.feed['feedTitle']) + feedTitle = feedTitle.replace('/', ' ') + if iPXSettings.organizeDownloads == 1: + customFolder = strftime('%m-%d-%Y',localtime()) + else: + customFolder = feedTitle + if self.feed.has_key('customFolder'): + if len(self.feed['customFolder']) > 0: + customFolder = self.feed['customFolder'] + customFolder = stringCleaning(customFolder) + + if hasFile: + iPXID = '' + importProg = '' + fileType = '' + customGenre = '' + downloadStatus = enclosure['downloadStatus'] + if self.feed.has_key('customGenre'): + customGenre = self.feed['customGenre'] + path = enclosure['path'] + fullPath = iPXSettings.downloadDirectory + '/' + path + fileName = enclosure['file'] + if os.path.isfile(fullPath + '/' + fileName): + fileType = detectFileType(fullPath + '/' + fileName) + + # Audio + if re.search('audio', fileType, re.IGNORECASE): + convertToAAC = False + if self.feed.has_key('convertToAAC'): + convertToAAC = self.feed['convertToAAC'] + makeBookmarkable = False + if self.feed.has_key('makeBookmarkable'): + makeBookmarkable = self.feed['makeBookmarkable'] + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(fullPath, fileName, customFolder, customGenre, convertToAAC, makeBookmarkable) + + # Image + elif re.search('image', fileType, re.IGNORECASE): + importProg = 'iPhoto' + iPXID, importProg = updateiPhoto(fullPath, fileName, customFolder, 0) + + # Video Files + elif re.search('video/quicktime', fileType, re.IGNORECASE): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(fullPath, fileName, customFolder, '', False, False) + + elif re.search('data', fileType, re.IGNORECASE): + if (re.search('mp3$', fileName, re.IGNORECASE)): + if (iPXSettings.moveAudio > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(fullPath, fileName, customFolder, customGenre, convertToAAC, makeBookmarkable) + elif (re.search('mov$', fileName, re.IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(fullPath, fileName, customFolder, customGenre, False, False) + + elif (re.search('aa$', fileName, re.IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(fullPath, fileName, customFolder, customGenre, False, False) + + else: + fileNameSplit = url.split('/') + fileName = fileNameSplit[len(fileNameSplit) - 1] + fileName = latin1_to_ascii(fileName) + fileName = stringCleaning(fileName) + + importProg = '' + fileLocation = '' + path = iPXSettings.downloadDirectory + '/' + customFolder + path = latin1_to_ascii(path) + + downloadStatus = 0 + fileName, iPXID, importProg, fileType, downloadStatus = self.iPXDownload(url, guid, path, fileName, length, fileType, True) + if downloadStatus == 1: + downloadError = False + if not guid in iPXSettings.histGUIDs: + saveHistory(guid) + iPXSettings.histGUIDs.append(guid) + else: + downloadError = True + + totalDSize = long(length) + tempEnc = {'enclosureURL': url, + 'length': length, + 'type': fileType, + 'file': fileName, + 'path': latin1_to_ascii(customFolder), + 'guid': guid, + 'import': importProg, + 'iPXID': iPXID, + 'textToAudio': False, + 'downloadStatus': downloadStatus, + 'downloadDate': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'downloadError': downloadError} + + enclosure.update(tempEnc) + + tempList = [] + self.__saveHashFile(EntriesData, origEntriesList, tempList, numDFiles, totalDSize, hashFile, True) + + def __getEntryEnclosures(self, entry, doDownload, host=None): + from sets import Set + import re + + returnEncList = [] + numDownloaded = 0 + sizeDownloaded = 0 + + keywords = [] + if self.feed.has_key('keywords'): + keywords = self.feed['keywords'].split(',') + + if iPXSettings.ranHistCheck == False: + iPXSettings.histGUIDs = getHistory() + iPXSettings.ranHistCheck = True + + + okDownload = True + + if entry.has_key('guid'): + if not entry['guid'] == None: + if entry['guid'] in iPXSettings.histGUIDs: + okDownload = False + elif not host == None: + if host + entry['guid'] in iPXSettings.histGUIDs: + okDownload = False + else: + okDownload = True + else: + okDownload = True + else: + okDownload = True + + strTitle = '' + uniDescription = unicode('', 'utf-8') + strCat = '' + if (len(keywords) > 0) and (doDownload == True): + if entry.has_key('title'): + strTitle = HTML2Text(entry.title) + if entry.has_key('summary_detail'): + uniDescription = entry.summary_detail.value + if len(uniDescription) == 0: + uniDescription = unicode('No Entry Text Found In Feed', 'utf-8') + if entry.has_key('content'): + uniDescription = entry.content[0].value + elif entry.has_key('content'): + uniDescription = entry.content[0].value + elif entry.has_key('description'): + uniDescription = entry.description + catList = [] + if entry.has_key('categories'): + for dict in entry.categories: + for cat in dict: + try: + if not type(cat) is NoneType: + if not cat == 'None': + try: + catList.append(cat.encode('utf-8')) + except: + pass + except Exception, msg: + logIt('Type error: %s' % msg) + categories = Set(catList) + for category in categories: + if not re.search('http://', category, re.IGNORECASE) or re.search('https://', category, re.IGNORECASE): + strCat = strCat + category + ', ' + if len(strCat) > 0: + if strCat[len(strCat)-2] == ',': + strCat = strCat[:-2] + + if re.search('rss', self.parsedFeed.version, re.IGNORECASE): + if entry.has_key('enclosures'): + for enclosure in entry.enclosures: + if enclosure.has_key('url'): + if len(enclosure.url) > 0: + url = enclosure.url + url = url.strip() + url = prepURL(url) + + fileNameSplit = url.split('/') + fileName = fileNameSplit[len(fileNameSplit) - 1] + fileName = latin1_to_ascii(fileName) + + fileType = 'Unknown' + if enclosure.has_key('type'): + fileType = enclosure.type + + length = '0' + if enclosure.has_key('length'): + if len(enclosure.length) > 0: + length = enclosure.length + try: + temp = long(length) + except: + length = '0' + + if entry.has_key('guid'): + guid = entry.guid + else: + guid = enclosure.url + + importProg = '' + fileLocation = '' + feedTitle = HTML2Text(self.feed['feedTitle']) + feedTitle = feedTitle.replace('/', '-') + if iPXSettings.organizeDownloads == 1: + customFolder = strftime('%m-%d-%Y',localtime()) + else: + customFolder = feedTitle + if self.feed.has_key('customFolder'): + if len(self.feed['customFolder']) > 0: + customFolder = self.feed['customFolder'] + customFolder = stringCleaning(customFolder) + path = iPXSettings.downloadDirectory + '/' + customFolder + path = latin1_to_ascii(path) + + downloadStatus = 0 + autoDownload = True + if self.feed.has_key('autoDownload'): + autoDownload = self.feed['autoDownload'] + + downloadError = False + if autoDownload: + encArray = [] + if entry.has_key('enclosures') or entry.has_key('links'): + didFind = True + if len(keywords) > 0: + for keyword in keywords: + keywordSplit = keyword.split(' ') + for word in keywordSplit: + if len(word) > 1: + if (re.search(word.strip(), url, re.IGNORECASE) or re.search(word.strip(), strTitle, re.IGNORECASE) or re.search(word.strip(), uniDescription, re.IGNORECASE)or re.search(word.strip(), strCat, re.IGNORECASE)): + didFind = True + else: + didFind = False + break + + if url in iPXSettings.histGUIDs: + doDownload = False + + if didFind and okDownload and doDownload: + + fileName, fileLocation, importProg, fileType, downloadStatus = self.iPXDownload(url, guid, path, fileName, length, fileType, doDownload) + if downloadStatus == 1: + numDownloaded = numDownloaded + 1 + sizeDownloaded = long(sizeDownloaded) + long(length) + elif downloadStatus == 0: + downloadError = True + elif didFind and okDownload and not doDownload: + fileName, fileLocation, importProg, fileType, downloadStatus = self.iPXDownload(url, guid, path, fileName, length, fileType, doDownload) + + tempEnc = {'enclosureURL': url, + 'length': length, + 'type': fileType, + 'file': fileName, + 'path': latin1_to_ascii(customFolder), + 'guid': guid, + 'import': importProg, + 'iPXID': fileLocation, + 'textToAudio': False, + 'downloadError': downloadError, + 'downloadDate': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'downloadStatus': downloadStatus} + + returnEncList.append(tempEnc) + elif entry.has_key('apple-wallpapers_image'): + if len(entry['apple-wallpapers_image']) > 0: + url = entry['apple-wallpapers_image'] + url = url.strip() + url = prepURL(url) + + fileNameSplit = url.split('/') + fileName = fileNameSplit[len(fileNameSplit) - 1] + fileName = latin1_to_ascii(fileName) + + fileType = 'image' + length = '0' + + if entry.has_key('guid'): + guid = entry.guid + else: + guid = url + + importProg = '' + fileLocation = '' + feedTitle = HTML2Text(self.feed['feedTitle']) + feedTitle = feedTitle.replace('/', '-') + if iPXSettings.organizeDownloads == 1: + customFolder = strftime('%m-%d-%Y',localtime()) + else: + customFolder = feedTitle + if self.feed.has_key('customFolder'): + if len(self.feed['customFolder']) > 0: + customFolder = self.feed['customFolder'] + customFolder = stringCleaning(customFolder) + path = iPXSettings.downloadDirectory + '/' + customFolder + path = latin1_to_ascii(path) + + downloadStatus = 0 + autoDownload = True + if self.feed.has_key('autoDownload'): + autoDownload = self.feed['autoDownload'] + + downloadError = False + if autoDownload: + encArray = [] + if entry.has_key('enclosures') or entry.has_key('links') or entry.has_key('apple-wallpapers_image'): + didFind = True + if len(keywords) > 0: + for keyword in keywords: + keywordSplit = keyword.split(' ') + for word in keywordSplit: + if len(word) > 1: + if (re.search(word.strip(), url, re.IGNORECASE) or re.search(word.strip(), strTitle, re.IGNORECASE) or re.search(word.strip(), uniDescription, re.IGNORECASE)or re.search(word.strip(), strCat, re.IGNORECASE)): + didFind = True + else: + didFind = False + break + + if url in iPXSettings.histGUIDs: + doDownload = False + + if didFind and okDownload and doDownload: + fileName, fileLocation, importProg, fileType, downloadStatus = self.iPXDownload(url, guid, path, fileName, length, fileType, doDownload) + if downloadStatus == 1: + numDownloaded = numDownloaded + 1 + sizeDownloaded = long(sizeDownloaded) + long(length) + elif downloadStatus == 0: + downloadError = True + elif didFind and okDownload and not doDownload: + fileName, fileLocation, importProg, fileType, downloadStatus = self.iPXDownload(url, guid, path, fileName, length, fileType, doDownload) + + tempEnc = {'enclosureURL': url, + 'length': length, + 'type': fileType, + 'file': fileName, + 'path': latin1_to_ascii(customFolder), + 'guid': guid, + 'import': importProg, + 'iPXID': fileLocation, + 'textToAudio': False, + 'downloadError': downloadError, + 'downloadDate': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'downloadStatus': downloadStatus} + + returnEncList.append(tempEnc) + elif re.search('atom', self.parsedFeed.version, re.IGNORECASE): + if entry.has_key('links'): + for link in entry.links: + if link.rel == 'enclosure': + if link.has_key('href'): + if len(link.href) > 0: + url = link.href + url = url.strip() + url = prepURL(url) + + fileNameSplit = url.split('/') + fileName = fileNameSplit[len(fileNameSplit) - 1] + fileName = latin1_to_ascii(fileName) + + fileType = '' + if link.has_key('type'): + fileType = link.type + + length = '0' + if link.has_key('length'): + if len(link['length']) > 0: + length = link['length'] + + if entry.has_key('guid'): + guid = entry.guid + else: + guid = link.href + + importProg = '' + fileLocation = '' + downloadError = False + feedTitle = HTML2Text(self.feed['feedTitle']) + feedTitle = feedTitle.replace('/', '-') + if iPXSettings.organizeDownloads == 1: + customFolder = strftime('%m-%d-%Y',localtime()) + else: + customFolder = feedTitle + if self.feed.has_key('customFolder'): + if len(self.feed['customFolder']) > 0: + customFolder = self.feed['customFolder'] + customFolder = stringCleaning(customFolder) + path = iPXSettings.downloadDirectory + '/' + customFolder + path = latin1_to_ascii(path) + + if self.feed.has_key('autoDownload'): + if self.feed['autoDownload'] == True: + didFind = True + if len(keywords) > 0: + for keyword in keywords: + keywordSplit = keyword.split(' ') + for word in keywordSplit: + if len(word) > 1: + if (re.search(word, url, re.IGNORECASE) or re.search(word, strTitle, re.IGNORECASE) or re.search(word, uniDescription, re.IGNORECASE) or re.search(word, strCat, re.IGNORECASE)): + didFind = True + break + else: + didFind = False + + if url in iPXSettings.histGUIDs: + doDownload = False + + if didFind and okDownload: + fileName, fileLocation, importProg, fileType, downloadStatus = self.iPXDownload(url, guid, path, fileName,length, fileType, doDownload) + if downloadStatus == 1: + numDownloaded = numDownloaded + 1 + sizeDownloaded = long(sizeDownloaded) + long(length) + elif downloadStatus == 0: + downloadError = True + + tempEnc = {'enclosureURL': url, + 'length': length, + 'type': fileType, + 'file': fileName, + 'path': latin1_to_ascii(customFolder), + 'guid': guid, + 'import': importProg, + 'textToAudio': False, + 'downloadError': downloadError, + 'downloadDate': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'iPXID': fileLocation} + + returnEncList.append(tempEnc) + + return returnEncList, numDownloaded, sizeDownloaded + + def __saveFeedData(self, newFeed): + import sys + + logIt('Saving feeds.plist') + try: + FeedListPrefs = readplist(iPXSettings.feedFile) + feedDetails = FeedListPrefs['iPodderXFeeds'] + for feed in feedDetails: + if feed.has_key('feedURL'): + if feed['feedURL'] == newFeed['feedURL']: + feed.update(newFeed) + FeedListPrefs['iPodderXFeeds'] = feedDetails + #FeedListPrefs.write(iPXSettings.feedFile) + writeplist(FeedListPrefs, iPXSettings.feedFile) + except Exception, msg: + logIt(msg) + sys.exit(5) + + def __getFeed(self, url, etagInfo, feedID): + import feedparser, urllib, urllib2, urlparse + + parsedFeed = {} + etag = '' + + self.feed['lastChecked'] = strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()) + self.feed['baseHost'] = 'http:/' + for part in urlparse.urlparse(url): + if not part == urlparse.urlparse(url)[0]: + if len(part) > 0: + if '/' in part: + splitPart = part.split('/') + for newPart in splitPart: + if newPart == splitPart[len(splitPart)-1]: + break + if len(newPart) > 0: + self.feed['baseHost'] = self.feed['baseHost'] + '/' + newPart + else: + self.feed['baseHost'] = self.feed['baseHost'] + '/' + part + self.feed['baseHost'] = self.feed['baseHost'] + '/' + logIt('etagInfo: %s' % etagInfo) + + userName = None + if self.feed.has_key('username'): + userName = self.feed['username'] + password = '' + if self.feed.has_key('password'): + password = decrypt(self.feed['password']) + + if iPXSettings.useProxyServer and userName != None: + status, url, x = getFileViaProxySSL(url, userName, password, True, False) + status, feedData, r = getFileViaProxySSL(url, userName, password, False, False) + if status == 200: + parsedFeed = feedparser.parse(feedData) + if parsedFeed.has_key('entries'): + if len(parsedFeed.entries) > 0: + self.parsedFeed = parsedFeed + self.feed['etag'] = '' + if parsedFeed.feed.has_key('ttl'): + self.feed['ttl'] = parsedFeed.feed.ttl + else: + self.feed['ttl'] + self.feed['feedTitle'] = HTML2Text(parsedFeed.feed.title) + if self.feed.has_key('customFeedTitle'): + if len(self.feed['customFeedTitle']) > 0: + self.feed['feedTitle'] = self.feed['customFeedTitle'] + self.feed['siteURL'] = parsedFeed.feed.link + return 200 + else: + return 0 + else: + req = urllib2.Request(url) + req.add_header('Accept-encoding', 'gzip') + + if not etagInfo == 'None': + req.add_header('If-None-Match', etagInfo) + if not userName == None: + setOpener(url, userName, password) + else: + setOpener() + + try: + h = urllib2.urlopen(req) + except urllib2.HTTPError, e: + logIt('Feed recieved a status of %s' % e.code) + if e.code == 401: + printMSG('AUTHENTICATION_FAILED;;%s' % feedID) + if e.code == 407: + printMSG('PROXY_AUTHENTICATION_FAILED') + return -1 + except Exception, msg: + logIt('Feed failed to connect %s' % msg) + return -1 + + try: + etag = h.info()['etag'] + except: + etag = '' + + try: + if h.info().has_key('Content-Encoding'): + if h.info()['Content-Encoding'] == 'gzip': + import gzip + from StringIO import StringIO + + tempData = h.read() + + feedData = gzip.GzipFile(fileobj=StringIO(tempData)).read() + else: + try: + feedData = h.read() + except Exception, msg: + logIt('FeedData ERRMSG: %s' % msg) + feedData = '' + if iPXSettings.SUPERDEBUG: + print feedData + parsedFeed = feedparser.parse(feedData) + if parsedFeed.has_key('entries'): + if len(parsedFeed.entries) > 0: + self.parsedFeed = parsedFeed + self.feed['etag'] = etag + if parsedFeed.feed.has_key('ttl'): + self.feed['ttl'] = parsedFeed.feed.ttl + else: + self.feed['ttl'] = 0 + self.feed['feedTitle'] = HTML2Text(parsedFeed.feed.title) + if self.feed.has_key('customFeedTitle'): + if len(self.feed['customFeedTitle']) > 0: + self.feed['feedTitle'] = self.feed['customFeedTitle'] + self.feed['siteURL'] = parsedFeed.feed.link + parsedFeed.status = 200 + + return int(parsedFeed.status) + except: + return -1 + + def iPXDownload(self, encURL, encGUID, downloadPath, fileName, size, fileType, doDownload): + logIt('Downloading: %s' % encURL) + status = 1 + fileLocation = '' + importProg = '' + head = None + + userName = None + password = '' + if self.feed.has_key('username'): + userName = self.feed['username'] + if self.feed.has_key('password'): + password = decrypt(self.feed['password']) + + #head = HTTPHead(encURL, userName, password) + if head != None: + if len(head.getName()) > 0: + fileName = head.getName() + + if head.getType() != None: + fileType = head.getType() + + if head.getLength() != None: + size = long(head.getLength()) + + if iPXSettings.quotaEnabled > 0 and doDownload == True: + import iPXQuotaManager + if iPXSettings.ranQuotaTest == False: + printMSG('Compiling SmartSpace Information...') + iPXSettings.delList, iPXSettings.quotaSizeTaken = iPXQuotaManager.getAllowedDelList() + iPXSettings.ranQuotaTest = True + iPXQuotaManager.getToQuota(size) + + convertToAAC = False + if self.feed.has_key('convertToAAC'): + convertToAAC = self.feed['convertToAAC'] + makeBookmarkable = False + if self.feed.has_key('makeBookmarkable'): + makeBookmarkable = self.feed['makeBookmarkable'] + + if doDownload: + customGenre = '' + if self.feed.has_key('customGenre'): + customGenre = self.feed['customGenre'] + if iPXSettings.organizeDownloads == 1: + customFolder = strftime('%m-%d-%Y',localtime()) + else: + customFolder = self.feed['feedTitle'] + if self.feed.has_key('customFolder'): + if len(self.feed['customFolder']) > 0: + customFolder = self.feed['customFolder'] + customFolder = latin1_to_ascii(customFolder) + fileName, fileLocation, importProg, fileType, status = downloadFile(encURL,fileType,downloadPath,fileName,customFolder,customGenre,convertToAAC,makeBookmarkable,userName,password) + if not encGUID in iPXSettings.histGUIDs and status == 1: + saveHistory(encGUID) + if iPXSettings.anonFeedback and status == 1: + doPing(encURL, self.feed['feedURL']) + elif not encGUID in iPXSettings.histGUIDs: + saveHistory(encGUID) + + return fileName, fileLocation, importProg, fileType, status + + def downloadTextAsAudio(self, strTitle, pubDate, text, strGUID): + import sys, os + + customFolder = self.feed['feedTitle'] + feedTitle = customFolder + + if len(strTitle) == 0: + strTitle = customFolder + ': ' + x = 0 + textSplit = text.split(' ') + for word in textSplit: + tmpWord = word + ' ' + strTitle = strTitle + tmpWord + if x == 5: + break + else: + x = x + 1 + strTitle = strTitle.strip() + + text = 'From ' + feedTitle + ', posted on ' + pubDate + '. '+ text + + if self.feed.has_key('customFolder'): + if len(self.feed['customFolder']) > 0: + customFolder = self.feed['customFolder'] + customFolder = stringCleaning(customFolder) + + if sys.platform == 'darwin': + saveDir = iPXSettings.downloadDirectory + '/' + customFolder + elif sys.platform == 'win32': + saveDir = iPXSettings.downloadDirectory + '\\' + customFolder + checkDir(saveDir) + + saveName = HTML2Text(strTitle) + saveName = pubDate + ' - ' + saveName + saveName = stringCleaning(saveName) + if sys.platform == 'darwin': + saveName = saveName + '.aiff' + elif sys.platform == 'win32': + saveName = saveName + '.wav' + + if text2Audio(text, saveDir, saveName) == True: + length = 0 + if os.path.isfile(saveDir + '/' + saveName): + length = os.path.getsize(saveDir + '/' + saveName) + + if iPXSettings.quotaEnabled > 0: + import iPXQuotaManager + iPXQuotaManager.getToQuota(length) + importProg = '' + fileLocation = '' + if (iPXSettings.moveAudio > 0): + customGenre = 'iPodderX NewsCaster' + if self.feed.has_key('customGenre'): + customGenre = self.feed['customGenre'] + convertToAAC = True + if self.feed.has_key('convertToAAC'): + convertToAAC = self.feed['convertToAAC'] + makeBookmarkable = False + if self.feed.has_key('makeBookmarkable'): + makeBookmarkable = self.feed['makeBookmarkable'] + + fileLocation, importProg = updatePlaylist(saveDir, saveName, customFolder, customGenre, convertToAAC, makeBookmarkable) + + tempEnc = {'length': str(length), + 'type': 'audio', + 'file': saveName, + 'path': saveDir, + 'guid': strGUID, + 'import': importProg, + 'iPXID': fileLocation, + 'textToAudio': True, + 'downloadError': False, + 'downloadDate': strftime('%a, %d %b %Y %H:%M:%S GMT',gmtime()), + 'downloadStatus': '1'} + + return tempEnc + else: + return None + \ No newline at end of file diff --git a/iPXDownloader.py b/iPXDownloader.py new file mode 100755 index 0000000..f6174e1 --- /dev/null +++ b/iPXDownloader.py @@ -0,0 +1,662 @@ +#(c) 2004-2008 Thunderstone Media, LLC +#Creative Commons Attribution-Noncommercial 3.0 United States License +# +#Python Developyment By: +# +#Ray Slakinski +#August Trometer + +from __future__ import division +from time import * +import iPXSettings +from iPXTools import * + +import gettext +gettext.install('bittorrent', 'btlocale') + + +def getTorrent(feedName, torrent, maxUploadRate, saveLocation, saveName): + from BitTorrent.download import Feedback, Multitorrent + from BitTorrent.defaultargs import get_defaults + from BitTorrent.parseargs import printHelp + from BitTorrent.zurllib import urlopen + from BitTorrent.bencode import bdecode + from BitTorrent.ConvertedMetainfo import ConvertedMetainfo + from BitTorrent import configfile + from BitTorrent import BTFailure + from BitTorrent import version + import re, threading + + uiname = 'bittorrent-console' + defaults = get_defaults(uiname) + config, args = configfile.parse_configuration_and_args(defaults,uiname, '', 0, 1) + + def fmtsize(n): + return float(n) + + class DL(Feedback): + def __init__(self, metainfo, config): + + + self.doneflag = threading.Event() + self.metainfo = metainfo + self.config = config + + logIt('BT url: %s' % self.config['url']) + logIt('BT save_as: %s' % self.config['save_as']) + if self.config['max_upload_rate'] > 0: + logIt('BT max_upload_rate: %s' % str(self.config['max_upload_rate'])) + + def run(self): + import os + + try: + config = self.config + self.d = HeadlessDisplayer(self.doneflag) + self.multitorrent = Multitorrent(self.config, self.doneflag, + self.global_error) + # raises BTFailure if bad + metainfo = ConvertedMetainfo(bdecode(self.metainfo)) + torrent_name = metainfo.name_fs + + if config['save_as']: + if config['save_in']: + raise BTFailure('You cannot specify both --save_as and ' + '--save_in') + saveas = config['save_as'] + elif config['save_in']: + saveas = os.path.join(config['save_in'], torrent_name) + else: + saveas = torrent_namef + + self.d.set_torrent_values(metainfo.name, os.path.abspath(saveas), + metainfo.total_bytes, len(metainfo.hashes)) + self.torrent = self.multitorrent.start_torrent(metainfo, + self.config, self, saveas) + except BTFailure, e: + globals()['torrentStatus'] = 0 + logIt(str(e)) + return + self.get_status() + self.multitorrent.rawserver.listen_forever() + self.d.display({'activity':'shutting down', 'fractionDone':0}) + self.torrent.shutdown() + + def reread_config(self): + try: + newvalues = configfile.get_config(self.config, 'btdownloadcurses') + except Exception, e: + globals()['torrentStatus'] = 0 + self.d.error('Error reading config: ' + str(e)) + return + self.config.update(newvalues) + # The set_option call can potentially trigger something that kills + # the torrent (when writing this the only possibility is a change in + # max_files_open causing an IOError while closing files), and so + # the self.failed() callback can run during this loop. + for option, value in newvalues.iteritems(): + self.multitorrent.set_option(option, value) + for option, value in newvalues.iteritems(): + self.torrent.set_option(option, value) + + def get_status(self): + self.multitorrent.rawserver.add_task(self.get_status, self.config['display_interval']) + + status = self.torrent.get_status(self.config['spew']) + if iPXSettings.DEBUG: + #logIt(str(status)) + #logIt(str(status['activity'])) + logIt('lastTorrentBeat: %s' % str(globals()['lastTorrentBeat'])) + + if str(status['activity']) == 'shut down': + self.doneflag.set() + self.d.finished() + elif str(status['activity']) == 'seeding': + self.d.display({'activity':_("shutting down"), 'fractionDone':0}) + self.torrent.shutdown() + elif globals()['torrentStatus'] == 0: + logIt(str(status)) + self.d.display({'activity':_("shutting down"), 'fractionDone':0}) + self.torrent.shutdown() + elif globals()['lastTorrentBeat'] > iPXSettings.torrentMaxBeatTime: + globals()['torrentStatus'] = 0 + logIt(str(status)) + logIt('Bittorrent is taking too long to download, aborting...') + logIt('lastTorrentBeat: %s' % str(globals()['lastTorrentBeat'])) + self.d.display({'activity':_("shutting down"), 'fractionDone':0}) + self.torrent.shutdown() + elif str(status['activity']) == 'downloading': + globals()['torrentStatus'] = 1 + self.d.display(status) + elif str(status['activity']) == 'Initial startup': + globals()['torrentStatus'] = 1 + else: + globals()['torrentStatus'] = 0 + self.d.display({'activity':_("shutting down"), 'fractionDone':0}) + self.torrent.shutdown() + + def global_error(self, level, text): + self.d.error(text) + + def error(self, torrent, level, text): + self.d.error(text) + + def failed(self, torrent, is_external): + self.doneflag.set() + + def finished(self, torrent): + self.d.finished() + + class HeadlessDisplayer(object): + def __init__(self, doneflag): + self.doneflag = doneflag + + self.done = False + self.percentDone = '' + self.timeEst = '' + self.downRate = '---' + self.upRate = '---' + self.shareRating = '' + self.seedStatus = '' + self.peerStatus = '' + self.errors = [] + self.file = '' + self.downloadTo = '' + self.fileSize = '' + self.numpieces = 0 + + def set_torrent_values(self, name, path, size, numpieces): + self.file = name + self.downloadTo = path + self.fileSize = fmtsize(size) + self.numpieces = numpieces + + def finished(self): + self.done = True + self.downRate = '---' + self.display({'activity':'download succeeded', 'fractionDone':1}) + + def error(self, errormsg): + logIt(str(errormsg)) + + def display(self, dict): + from cStringIO import StringIO + if dict.has_key('downRate'): + if iPXSettings.DEBUG: + logIt('downRate: %s' % str(dict['downRate'] / 1024)) + logIt('upRate: %s' % str(dict['upRate'] / 1024)) + logIt('lastDLSize: %s' % str(globals()['lastDLSize'])) + logIt('fractionDone: %s / %s' % (str(dict['fractionDone'] * 100), str(dict['fractionDone']))) + logIt('numSeeds: %s' % str(dict['numSeeds'])) + logIt('numPeers: %s' % str(dict['numPeers'])) + if (long(dict['numSeeds'] > 2)) or (dict['downRate'] > iPXSettings.torrentMinDownRate and globals()['lastTorrentBeat'] <= iPXSettings.torrentMaxBeatTime): + globals()['lastTorrentBeat'] = 0 + if globals()['lastDLSize'] < dict['fractionDone'] * 100: + if iPXSettings.DEBUG: + printMSG(';;1;;1;;%.2f;;%.2f;;%.2f' % (100.0, dict['fractionDone'] * 100, dict['downRate'] / 1024)) + else: + printMSG(';;1;;1;;%.2f;;%.2f' % (100.0, dict['fractionDone'] * 100)) + globals()['lastDLSize'] = (dict['fractionDone'] * 100) + 1.0 + else: + globals()['lastTorrentBeat'] += 1 + + def print_spew(self, spew): + s = StringIO() + s.write('\n\n\n') + for c in spew: + s.write('%20s ' % c['ip']) + if c['initiation'] == 'L': + s.write('l') + else: + s.write('r') + total, rate, interested, choked = c['upload'] + s.write(' %10s %10s ' % (str(int(total/10485.76)/100), + str(int(rate)))) + if c['is_optimistic_unchoke']: + s.write('*') + else: + s.write(' ') + if interested: + s.write('i') + else: + s.write(' ') + if choked: + s.write('c') + else: + s.write(' ') + + total, rate, interested, choked, snubbed = c['download'] + s.write(' %10s %10s ' % (str(int(total/10485.76)/100), + str(int(rate)))) + if interested: + s.write('i') + else: + s.write(' ') + if choked: + s.write('c') + else: + s.write(' ') + if snubbed: + s.write('s') + else: + s.write(' ') + s.write('\n') + print s.getvalue() + + status = 0 + if re.search('=', saveName, re.IGNORECASE): + saveNameSplit = saveName.split('=') + if len(saveNameSplit[(len(saveNameSplit)-1)]) > 1: + saveName = saveNameSplit[(len(saveNameSplit)-1)] + + saveName = stringCleaning(saveName) + + logIt('%s: %s [Torrent]' % (feedName, saveName)) + printMSG('%s: %s [Torrent]' % (feedName, saveName)) + + try: + checkDir(saveLocation) + params = ['--url', torrent, '--max_upload_rate', maxUploadRate, '--minport', iPXSettings.torrentMinPort, '--maxport', iPXSettings.torrentMinPort, '--save_as', saveLocation + '/' + saveName] + config, args = configfile.parse_configuration_and_args(defaults,uiname, params, 0, 1) + + if config['url']: + h = urlopen(config['url']) + metainfo = h.read() + h.close() + except Exception, msg: + logIt('Torrent Download Failed') + logIt('ERRORMSG: %s' % str(msg)) + status = 0 + + try: + dl = DL(metainfo, config) + dl.run() + if globals()['torrentStatus'] == 1: + logIt('Completed Download: %s' % saveName) + status = 1 + else: + logIt('Torrent Download Failed') + status = 0 + except Exception, msg: + logIt('Torrent Download Failed') + logIt('ERRORMSG: %s' % str(msg)) + status = 0 + + return status, saveName + +def displayProgress(block_count, block_size, total_size): + + if globals()['lastDLSize'] < (float(block_count*block_size)/1024): + printMSG(";;1;;1;;%.2f;;%.2f" % (float(total_size)/1024, float(block_count*block_size)/1024)) + globals()['lastDLSize'] = float(block_count*block_size)/1024 + iPXSettings.lastDLStepSize + + +def getFile(feedName, url, saveLocation, saveName, userName=None, password=''): + import tempfile, shutil, re, urllib2, os + + saveName = stringCleaning(saveName) + if not userName == None: + import urlparse + setOpener(urlparse.urlparse(url)[1], userName, password) + else: + setOpener() + + status = 1 + if iPXSettings.useProxyServer and userName != None: + try: + status, url, saveName = getFileViaProxySSL(url, userName, password, True, False) + printMSG('%s: %s' % (feedName, saveName)) + status, tmpFileName, r = getFileViaProxySSL(url, userName, password, False, True) + + if not status == 200: + status = 0 + return 0, saveName + except Exception, msg: + logIt('Download Failed') + logIt (str(msg)) + return 0, saveName + + if os.path.isfile(tmpFileName): + if not r.getheader('Content-Disposition') == None: + if re.search('filename=', r.getheader('Content-Disposition'), re.IGNORECASE): + textSplit = r.getheader('Content-Disposition') + textSplit = textSplit.split(';') + for text in textSplit: + if re.search('filename=', text, re.IGNORECASE): + logIt('Detected New Filename To Use:') + newSaveNameSplit = text.split('=') + newSaveName = newSaveNameSplit[len(newSaveNameSplit) -1] + newSaveName = newSaveName.replace('"', '') + logIt(str(newSaveName)) + shutil.copy(tmpFileName, saveLocation + '/' + newSaveName) + saveName = newSaveName + elif re.search('=', saveName, re.IGNORECASE): + saveNameSplit = saveName.split('=') + if len(saveNameSplit[(len(saveNameSplit)-1)]) > 1: + newSaveName = saveNameSplit[(len(saveNameSplit)-1)] + shutil.move(tmpFileName, saveLocation + '/' + newSaveName) + saveName = newSaveName + else: + shutil.move(tmpFileName, saveLocation + '/' + saveName) + else: + shutil.move(tmpFileName, saveLocation + '/' + saveName) + else: + logIt('%s: %s' % (feedName, url)) + logIt('Saving to: %s/' % saveLocation) + + checkDir(saveLocation) + saveNameParts = saveName.split('?') + if len(saveNameParts) > 1: + for part in saveNameParts: + if part.find('.') > 0: + if len(part[part.find('.'):])-1 == 3: + saveName = part + saveName = stringCleaning(saveName) + printMSG('%s: %s' % (feedName, saveName)) + + try: + url = url.strip() + url = url.replace(' ', '%20') + logIt(url) + req = urllib2.Request(url) + try: + h = urllib2.urlopen(req) + except IOError, e: + logIt(str(e)) + return 0, saveName + + #page = '' + count = 0 + n = 1024 # number of bytes to read at a time + fileSize = 0 + if h.info().has_key('Content-Length'): + fileSize = float(h.info()['Content-Length']) / 1024 + printMSG(';;1;;1;;100.00;;0.00') + tmpFile = tempfile.mkstemp() + tmpFileName = tmpFile[1] + f = open(tmpFileName, 'ab') + while True: + a = h.read(n) + f.write(a) + if not a: break + count += len(a) # len(a) may not be same as n for final read + try: + percentDone = ((float(count) /1024) / fileSize) * 100 + except: + percentDone = fileSize + if percentDone >= globals()['lastDLSize'] + 1: + globals()['lastDLSize'] = percentDone + printMSG(';;1;;1;;100.00;;%.2f' % (percentDone)) + + printMSG(';;1;;1;;100.00;;100.00') + f.close() + os.close(tmpFile[0]) + + except Exception, msg: + logIt('Download Failed') + logIt (str(msg)) + status = 0 + + try: + if h.info().has_key('Content-Disposition'): + if re.search('filename=', h.info()['Content-Disposition'], re.IGNORECASE): + textSplit = h.info()['Content-Disposition'].split(';') + for text in textSplit: + if re.search('filename=', text, re.IGNORECASE): + logIt('Detected New Filename To Use:') + newSaveNameSplit = text.split('=') + newSaveName = newSaveNameSplit[len(newSaveNameSplit) -1] + newSaveName = newSaveName.replace('"', '') + logIt(str(newSaveName)) + shutil.copy(tmpFileName, saveLocation + '/' + newSaveName) + saveName = newSaveName + elif re.search('=', saveName, re.IGNORECASE): + saveNameSplit = saveName.split('=') + if len(saveNameSplit[(len(saveNameSplit)-1)]) > 1: + newSaveName = saveNameSplit[(len(saveNameSplit)-1)] + shutil.move(tmpFileName, saveLocation + '/' + newSaveName) + saveName = newSaveName + else: + shutil.move(tmpFileName, saveLocation + '/' + saveName) + else: + shutil.move(tmpFileName, saveLocation + '/' + saveName) + except Exception, msg: + logIt('Filename/Move Error: %s' % str(msg)) + logIt('Retrying move with no filename detection...') + try: + shutil.move(tmpFileName, saveLocation + '/' + saveName) + except Exception, msg: + logIt('Retry Error: %s' % str(msg)) + + if os.path.isfile(saveLocation + '/' + saveName): + logIt('Completed Download: %s' % saveName) + status = 1 + else: + logIt('Download Failed') + status = 0 + + return status, saveName + +def downloadFile(url,fileType,saveDir,saveName,folderName,customGenre,convertToAAC,makeBookmarkable,userName=None,password=''): + import shutil, re, os, sys + + iPXID = '' + location = '' + status = 1 + importProg = '' + feedName = folderName + globals()['lastDLSize'] = 0.0 + globals()['lastTorrentBeat'] = 0 + globals()['torrentStatus'] = 1 + + if re.search('torrent', fileType, re.IGNORECASE): + newSaveName = saveName[0:len(saveName) - 8] + status, newSaveName = getTorrent(feedName, url, iPXSettings.torrentMaxUpRate, iPXSettings.tmpDownloadDir, newSaveName) + + if status == 1: + checkDir(saveDir) + tmpSize = os.path.getsize(iPXSettings.tmpDownloadDir + '/' + newSaveName) + shutil.copy(iPXSettings.tmpDownloadDir + '/' + newSaveName, saveDir + '/' + newSaveName) + os.unlink(iPXSettings.tmpDownloadDir + '/' + newSaveName) + fileType = detectFileType(saveDir + '/' + newSaveName) + + # Audio Files + if re.search('audio', fileType, re.IGNORECASE): + if (iPXSettings.moveAudio > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, convertToAAC, makeBookmarkable) + + # Image Files + elif re.search('image', fileType, re.IGNORECASE): + if (iPXSettings.moveImages > 0): + importProg = 'iPhoto' + iPXID, importProg = updateiPhoto(saveDir, newSaveName, folderName, 0) + + # Video Files + if (iPXSettings.moveVideo > 0): + if sys.platform == 'darwin': + if re.search('video/quicktime', fileType, re.IGNORECASE) or re.search('video/mpeg', fileType, re.IGNORECASE): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + elif sys.platform == 'win32': + if iPXSettings.Prefs['exportApp'] == 1: + if re.search('video', fileType, re.IGNORECASE): + if not re.search('video/quicktime', fileType, re.IGNORECASE): + importProg = 'WMP' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + else: + if re.search('video/quicktime', fileType, re.IGNORECASE) or re.search('video/mpeg', fileType, re.IGNORECASE): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + + # HTML Files are bad! + elif re.search('html', fileType, re.IGNORECASE): + if os.path.isfile(saveDir + '/' + newSaveName): + os.unlink(saveDir + '/' + newSaveName) + return newSaveName, '', '', '', 0 + + elif re.search('data', fileType, re.IGNORECASE): + if (re.search('mp3$', newSaveName, re.IGNORECASE)): + if (iPXSettings.moveAudio > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, convertToAAC, makeBookmarkable) + elif (re.search('mov$', newSaveName, re.IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + elif (re.search('aa$', newSaveName, + IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + + # All Other Data Types + else: + pass + + saveName = newSaveName + + if len(iPXID) > 0: + logIt('Returning with iPXID: %s' % str(iPXID)) + return saveName, iPXID, importProg, fileType, status + else: + status, saveName = getFile(feedName, url, iPXSettings.tmpDownloadDir, saveName, userName, password) + if status == 1: + if len(fileType) <= 0 or re.search('text', fileType, re.IGNORECASE) or re.search('octet', fileType, re.IGNORECASE) or re.search('html', fileType, re.IGNORECASE) or re.search('data', fileType, re.IGNORECASE): + fileType = detectFileType(iPXSettings.tmpDownloadDir + '/' + saveName) + if not re.search('torrent', fileType, re.IGNORECASE): + try: + checkDir(saveDir) + shutil.copy(iPXSettings.tmpDownloadDir + '/' + saveName, saveDir + '/' + saveName) + os.unlink(iPXSettings.tmpDownloadDir + '/' + saveName) + except Exception, msg: + LogIt('ERRMSG: %s', msg) + # Torrent Files + if re.search('torrent', fileType, re.IGNORECASE): + if os.path.isfile(saveDir + '/' + saveName): + os.unlink(saveDir + '/' + saveName) + # get rid of torrent extension + if re.search('.torrent$', saveName, re.IGNORECASE): + newSaveName = saveName[0:len(saveName) - 8] + else: + newSaveName = saveName + + status, newSaveName = getTorrent(feedName, url, 0, iPXSettings.tmpDownloadDir, newSaveName) + + if status == 1: + checkDir(saveDir) + shutil.copy(iPXSettings.tmpDownloadDir + '/' + newSaveName, saveDir + '/' + newSaveName) + os.unlink(iPXSettings.tmpDownloadDir + '/' + newSaveName) + fileType = detectFileType(saveDir + '/' + newSaveName) + + # Audio Files + if re.search('audio', fileType, re.IGNORECASE): + if (iPXSettings.moveAudio > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, convertToAAC, makeBookmarkable) + + # Image Files + elif re.search('image', fileType, re.IGNORECASE): + if (iPXSettings.moveImages > 0): + importProg = 'iPhoto' + iPXID, importProg = updateiPhoto(saveDir, newSaveName, folderName, 0) + + # Video Files + if (iPXSettings.moveVideo > 0): + if sys.platform == 'darwin': + if re.search('video/quicktime', fileType, re.IGNORECASE) or re.search('video/mpeg', fileType, re.IGNORECASE): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + elif sys.platform == 'win32': + if iPXSettings.Prefs['exportApp'] == 1: + if re.search('video', fileType, re.IGNORECASE): + if not re.search('video/quicktime', fileType, re.IGNORECASE): + importProg = 'WMP' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + else: + if re.search('video/quicktime', fileType, re.IGNORECASE) or re.search('video/mpeg', fileType, re.IGNORECASE): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + + # HTML Files are bad! + elif re.search('html', fileType, re.IGNORECASE): + if os.path.isfile(saveDir + '/' + newSaveName): + os.unlink(saveDir + '/' + newSaveName) + return newSaveName, '', '', '', 0 + + elif re.search('data', fileType, re.IGNORECASE): + if (re.search('mp3$', newSaveName, re.IGNORECASE)): + if (iPXSettings.moveAudio > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, convertToAAC, makeBookmarkable) + elif (re.search('mov$', newSaveName, re.IGNORECASE)) or (re.search('wmv$', newSaveName, re.IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + + elif (re.search('aa$', newSaveName, re.IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, newSaveName, folderName, customGenre, False, False) + + # All Other Data Types + else: + pass + + # Audio Files + elif re.search('audio', fileType, re.IGNORECASE): + if (iPXSettings.moveAudio > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, saveName, folderName, customGenre, convertToAAC, makeBookmarkable) + + # Image Files + elif re.search('image', fileType, re.IGNORECASE): + if (iPXSettings.moveImages > 0): + importProg = 'iPhoto' + iPXID, importProg = updateiPhoto(saveDir, saveName, folderName, 0) + + # Video Files + if (iPXSettings.moveVideo > 0): + if sys.platform == 'darwin': + if re.search('video/quicktime', fileType, re.IGNORECASE) or re.search('video/mpeg', fileType, re.IGNORECASE): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, saveName, folderName, customGenre, False, False) + elif sys.platform == 'win32': + if iPXSettings.Prefs['exportApp'] == 1: + if re.search('video', fileType, re.IGNORECASE): + if not re.search('video/quicktime', fileType, re.IGNORECASE): + importProg = 'WMP' + iPXID, importProg = updatePlaylist(saveDir, saveName, folderName, customGenre, False, False) + else: + if re.search('video/quicktime', fileType, re.IGNORECASE): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, saveName, folderName, customGenre, False, False) + + # HTML Files are bad! + elif re.search('html', fileType, re.IGNORECASE): + if os.path.isfile(saveDir + '/' + saveName): + os.unlink(saveDir + '/' + saveName) + return saveName, '', '', '', 0 + + elif re.search('data', fileType, re.IGNORECASE): + if (re.search('mp3$', saveName, re.IGNORECASE)): + if (iPXSettings.moveAudio > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, saveName, folderName, customGenre, convertToAAC, makeBookmarkable) + elif (re.search('mov$', saveName, re.IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, saveName, folderName, customGenre, False, False) + + elif (re.search('aa$', saveName, re.IGNORECASE)): + if (iPXSettings.moveVideo > 0): + importProg = 'iTunes' + iPXID, importProg = updatePlaylist(saveDir, saveName, folderName, customGenre, False, False) + + + # All Other Data Types + else: + pass + + logIt('Returning with iPXID: %s' % str(iPXID)) + return saveName, iPXID, importProg, fileType, status \ No newline at end of file diff --git a/iPXFileSwap.py b/iPXFileSwap.py new file mode 100755 index 0000000..9d17907 --- /dev/null +++ b/iPXFileSwap.py @@ -0,0 +1,32 @@ +#(c) 2004-2008 Thunderstone Media, LLC +#Creative Commons Attribution-Noncommercial 3.0 United States License +# +#Python Developyment By: +# +#Ray Slakinski +#August Trometer + +import iPXSettings +from iPXTools import * + +iPXSettings.progName = 'iPodderX' +for arg in sys.argv: + if re.search('-progName', arg, re.IGNORECASE): + progNameSplit = arg.split('==') + iPXSettings.progName = progNameSplit[len(progNameSplit)-1] +iPXSettings.initSettings() + +def usage(): + print '\r\nUsage: none really... It just swaps two files' + #print '\r\nUsage:\r\n%s -d \r\n%s -e \r\n' % (sys.argv[0],sys.argv[0]) + +try: + if sys.argv[1] == '-d': + print decrypt(sys.argv[2].strip()) + elif sys.argv[1] == '-e': + print encrypt(sys.argv[2].strip()) + else: + usage() +except Exception, msg: + print msg + usage() \ No newline at end of file diff --git a/iPXQuotaManager.py b/iPXQuotaManager.py new file mode 100755 index 0000000..860bf6e --- /dev/null +++ b/iPXQuotaManager.py @@ -0,0 +1,218 @@ +#(c) 2004-2008 Thunderstone Media, LLC +#Creative Commons Attribution-Noncommercial 3.0 United States License +# +#Python Developyment By: +# +#Ray Slakinski +#August Trometer + +import iPXSettings +from iPXTools import * +from types import * + +class iPXError(Exception): pass +class OutOfRangeError(iPXError): pass +class NotIntegerError(iPXError): pass + +def qmCacheCreate(): + import iPXClass + + printMSG('Creating SmartSpace Cache File...') + try: + feedsObj = iPXClass.Feeds() + feedsObj.createQMCacheBridge() + except Exception, msg: + logIt('Create qmcache.dat failed...') + logIt('ERRMSG: ' + str(msg)) + +def writeQuotaCache(feedID, guid, enc, encSize): + import os, pickle + + rec = [feedID, guid, enc, encSize] + cacheFile = iPXSettings.rssPath + 'qmcache.dat' + cacheData = [] + + if os.path.isfile(cacheFile): + cacheData = pickle.load(open(cacheFile)) + cacheData.append(rec) + pickle.dump(cacheData, open(cacheFile,'w')) + else: + cacheData = [rec] + pickle.dump(cacheData, open(cacheFile,'w')) + +def remCacheItem(enc): + import os, pickle + + cacheFile = iPXSettings.rssPath + 'qmcache.dat' + checkDir(iPXSettings.tempDir + '/iPXCache/') + dailyCacheFile = iPXSettings.tempDir + '/iPXCache/qmcache-' + strftime('%m%d%Y',localtime()) + '.dat' + + if os.path.isfile(cacheFile): + cacheData = pickle.load(open(cacheFile)) + delList = [] + enc = enc.replace(iPXSettings.downloadDirectory + '/', '') + for rec in cacheData: + if enc in rec[2]: + delList.append(rec) + logIt('Removing qmcache.dat record: ' + str(rec)) + + for rec in delList: + cacheData.remove(rec) + pickle.dump(cacheData, open(cacheFile,'w')) + + if os.path.isfile(dailyCacheFile): + delList = [] + dailyCacheItems = pickle.load(open(dailyCacheFile)) + for item in dailyCacheItems: + if enc in item: + delList.append(item) + + for rec in delList: + dailyCacheItems.remove(rec) + pickle.dump(dailyCacheItems, open(dailyCacheFile,'w')) + +def readQuotaCache(): + import os, pickle + + cacheFile = iPXSettings.rssPath + 'qmcache.dat' + cacheData = [] + + if os.path.isfile(cacheFile): + cacheData = pickle.load(open(cacheFile)) + + return cacheData + +def getAllowedDelList(): + import os, iPXClass, pickle + + sizeTaken = 0 + allowList = [] + tempAllowList = {} + finalAllowList = [] + checkDir(iPXSettings.tempDir + '/iPXCache/') + dailyCacheFie = iPXSettings.tempDir + '/iPXCache/qmcache-' + strftime('%m%d%Y',localtime()) + '.dat' + + if not os.path.isfile(iPXSettings.rssPath + 'qmcache.dat'): + qmCacheCreate() + if not os.path.isfile(dailyCacheFie): + cacheList = readQuotaCache() + logIt('Number of items in qmcache.dat file: ' + str(len(cacheList))) + + feedsObj = iPXClass.Feeds() + for cacheItem in cacheList: + sizeTaken = sizeTaken + int(cacheItem[3]) + hashFile = iPXSettings.rssPath + 'feedData/' + cacheItem[0] + '.ipxd' + if os.path.isfile(hashFile): + try: + EntriesData = plistlib.Plist.fromFile(file(hashFile)) + if EntreiesData.has_key('entries'): + for entry in EntriesData['entries']: + if entry.guid == cacheItem[1]: + if entry.has_key('read'): + if entry['read'] == True: + if entry.has_key('flagged'): + if entry['flagged'] == False: + allowList.append(cacheItem[2]) + else: + allowList.append(cacheItem[2]) + else: + allowList.append(cacheItem[2]) + except Exception, msg: + logIt('getAllowedDelList failed...') + logIt('ERRMSG: ' + str(msg)) + else: + allowList.append(cacheItem[2]) + pickle.dump(allowList, open(dailyCacheFie,'w')) + else: + allowList = pickle.load(open(dailyCacheFie)) + + counter = 0 + for enc in allowList: + encFile = os.path.join(iPXSettings.downloadDirectory + '/' + enc) + if os.path.isfile(encFile): + fileCreateTime = os.path.getmtime(encFile) + tempAllowList[fileCreateTime + counter] = encFile + sizeTaken = sizeTaken + os.path.getsize(encFile) + counter = counter + 1 + else: + remCacheItem(enc) + + keys = tempAllowList.keys() + keys.sort() + for key in keys: + finalAllowList.append(tempAllowList[key]) + + logIt('Number of items in final del allow list: ' + str(len(finalAllowList))) + + return finalAllowList, sizeTaken + +def getToQuota(size): + import os, shutil, sys + + if size == '': + size = 0 + elif size == None: + size = 0 + elif type(size) == str: + try: + size = long(size) + except Exception, msg: + logIt('getToQuota size error: ' + str(msg)) + logIt('Size = ' + str(size)) + size = 0 + elif size < 0: + raise OutOfRangeError, 'number out of range (must be positive whole number)' + + if len(iPXSettings.delList) > 0: + plusSize = 1048576 * 50 + size = long(size) + plusSize + + logIt('QM: ' + str(iPXSettings.quotaSize)) + logIt('QM: ' + str(size)) + logIt('QM: =============') + logIt('QM: ' + str(iPXSettings.quotaSize - (iPXSettings.quotaSizeTaken + size))) + + if (iPXSettings.quotaSize - (iPXSettings.quotaSizeTaken + size)) <= 0: + for enc in iPXSettings.delList: + if os.path.isfile(enc): + logIt('QM: Removing "' + enc + '"') + remCacheItem(enc) + iPXSettings.quotaSizeTaken = iPXSettings.quotaSizeTaken - long(os.path.getsize(enc)) + logIt('quotaSizeTaken: ' + str(iPXSettings.quotaSizeTaken)) + if sys.platform == 'darwin': + encNameSplit = enc.split('/') + encName = encNameSplit[len(encNameSplit)-1] + shutil.move(enc, iPXSettings.userPath + '/.Trash/' + encName) + elif sys.platform == 'win32': + os.unlink(enc) + if (iPXSettings.quotaSize - (iPXSettings.quotaSizeTaken + size)) > 0: + iPXSettings.quotaSizeTaken = iPXSettings.quotaSizeTaken + size + break + else: + logIt('QM: delList holds ' + str(len(iPXSettings.delList)) + ' files, no action taken') + +def main(): + import sys + + iPXSettings.initSettings() + iPXSettings.DEBUG = 1 + iPXSettings.delList, iPXSettings.sizeTaken = getAllowedDelList() + + size = 0 + + try: + size = sys.argv[1] + except: + printMSG('Please secify a whole number ') + sys.exit(0) + + try: + size = long(size) + except Exception, msg: + printMSG('Invalid param "' + str(size) + '", please use a whole number') + sys.exit(0) + + getToQuota(size) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/iPXSettings.py b/iPXSettings.py new file mode 100755 index 0000000..dd53210 --- /dev/null +++ b/iPXSettings.py @@ -0,0 +1,241 @@ +#(c) 2004-2008 Thunderstone Media, LLC +#Creative Commons Attribution-Noncommercial 3.0 United States License +# +#Python Developyment By: +# +#Ray Slakinski +#August Trometer + +import os, sys +from iPXTools import * +from time import * + +LITE = 0 + +progName = 'iPodderX' + +#defaults +VERSION = 'Version 3.1 Build: 35 [%s] ' % sys.platform +USER_AGENT = '' +environs = os.environ +userPath = '' +#pList = '' +logPath = '' +logFile = '' +rssPath = '' +__timeBombFile = '' +defaultDir = '' +tempDir = '' +tmpDownloadDir = '' +historyFile = '' +newHistoryFile = '' +__userName = '' +pList = '' +feedDetails = [] +totalBTFileSize = 0.0 +ranFromUI = False +Prefs = [] +ranQuotaTest = False +histGUIDs = [] +ranHistCheck = False +feedFile = '' +FeedListPrefs = {'iPodderXFeeds':{}} +historyURLs = [] +encGUIDs = [] +DEBUG = 0 +SUPERDEBUG = 0 +lastDLStepSize = 5 +showExplicit = True +anonFeedback = True +onlyAudio = 0 +moveAudio = 1 +moveVideo = 1 +moveImages = 1 +deleteAudio = 0 +deleteVideo = 0 +deleteImages = 0 +torrentFiles = 1 +torrentMinDownRate = 3000 +torrentMaxBeatTime = 1000 +torrentMaxUpRate = 80 +torrentMinPort = 6881 +torrentMaxPort = 6889 +maxEntryAge = 3 +organizeDownloads = 0 +quotaEnabled = 0 +quotaSizeTaken = 0 +quotaSize = 0 +d = defaultDir +downloadDirectory = d +proxyServer = '' +proxyPort = '' +proxyUsername = '' +proxyPassword = '' +useProxyServer = 0 +useProxyIE = 0 +useProxyAuth = 0 +globalProxySetting = '' + + +delList =[] + +#set default +progName = 'iPodderX' + +def initSettings(): + globals()['USER_AGENT'] = '%s/%s (http://slakinski.com)' % (progName, VERSION) + + globals()['userPath'] = os.path.expanduser("~") + if sys.platform == 'darwin': + globals()['pList'] = '%s/Library/Preferences/com.thunderstonemedia.%s.plist' % (userPath, progName) + globals()['logPath'] = '%s/Library/Logs/' % userPath + globals()['logFile'] = '%s%s.log' % (logPath, progName) + globals()['rssPath'] = '%s/Library/Application Support/%s/' % (userPath, progName) + globals()['__timeBombFile'] = '%s/Library/foo.txt' % userPath + globals()['defaultDir'] = '%s/Documents/%s' % (userPath, progName) + globals()['tempDir'] = '/tmp/' + globals()['tmpDownloadDir'] = '%s/%sDownloads/' % (tempDir, progName) + globals()['historyFile'] = '%shistory.plist' % rssPath + globals()['newHistoryFile'] = '%shistory.dat' % rssPath + globals()['__userName'] = globals()['userPath'].split('/')[len(globals()['userPath'].split('\\'))-1] + elif sys.platform == 'win32': + globals()['logPath'] = '%s\\Application Data\\%s\\' % (userPath, progName) + globals()['logFile'] = '%s%s.log' % (logPath, progName) + globals()['rssPath'] = '%s\\Application Data\\%s\\' % (userPath, progName) + globals()['pList'] = '%siPXSettings.plist' % rssPath + globals()['__timeBombFile'] = '%s\\System32\\foo.txt' % environs['WINDIR'] + globals()['defaultDir'] = '%s\\My Documents\\%s Downloads\\' % (userPath, progName) + globals()['tempDir'] = '%s\\' % environs['TEMP'] + globals()['tmpDownloadDir'] = '%s\\%sDownloads\\' % (tempDir, progName) + globals()['historyFile'] = '%s\\history.plist' % rssPath + globals()['newHistoryFile'] = '%s\\history.dat' % rssPath + globals()['__userName'] = globals()['userPath'].split('\\')[len(globals()['userPath'].split('\\'))-1] + + globals()['pList'] = '%siPXSettings.plist' % rssPath + + globals()['__userKey'] = __userName.encode('rot-13') + if len(__userKey) < 8: + counter = 8 - len(__userKey) + for x in range(counter): + globals()['__userKey'] = '%s!' % __userKey + + globals()['__DESKey'] = '%s3sE6$!&4' % __userKey[:8] + + globals()['Prefs'] = readplist(pList) + + globals()['feedFile'] = '%sfeeds.plist' % rssPath + + for i in range(10): + if os.path.isfile(feedFile): + if len(FeedListPrefs['iPodderXFeeds']) <= 0: + globals()['FeedListPrefs'] = readplist(feedFile) + else: + break + + if Prefs.has_key('pyDebug'): + globals()['DEBUG'] = int(Prefs['pyDebug']) + + if Prefs.has_key('lastDLStepSize'): + globals()['lastDLStepSize'] = int(Prefs['lastDLStepSize']) + + if Prefs.has_key('showExplict'): + globals()['showExplicit'] = Prefs['showExplicit'] + + if Prefs.has_key('anonFeedback'): + globals()['anonFeedback'] = int(Prefs['anonFeedback']) + + if Prefs.has_key('onlyAudio'): + globals()['onlyAudio'] = int(Prefs['onlyAudio']) + + if Prefs.has_key('moveAudio'): + globals()['moveAudio'] = int(Prefs['moveAudio']) + + if Prefs.has_key('moveVideo'): + globals()['moveVideo'] = int(Prefs['moveVideo']) + + if Prefs.has_key('moveImages'): + globals()['moveImages'] = int(Prefs['moveImages']) + + if Prefs.has_key('deleteAudio'): + globals()['deleteAudio'] = int(Prefs['deleteAudio']) + + if Prefs.has_key('deleteVideo'): + globals()['deleteVideo'] = int(Prefs['deleteVideo']) + + if Prefs.has_key('deleteImages'): + globals()['deleteImages'] = int(Prefs['deleteImages']) + + if Prefs.has_key('torrentFiles'): + globals()['torrentFiles'] = int(Prefs['torrentFiles']) + + if Prefs.has_key('torrentMinDownRate'): + globals()['torrentMinDownRate'] = Prefs['torrentMinDownRate'] + + if Prefs.has_key('torrentMaxBeatTime'): + globals()['torrentMaxBeatTime'] = Prefs['torrentMaxBeatTime'] + + if Prefs.has_key('torrentMaxBeatTime'): + globals()['torrentMaxBeatTime'] = Prefs['torrentMaxBeatTime'] + + if Prefs.has_key('torrentMinPort'): + globals()['torrentMinPort'] = Prefs['torrentMinPort'] + + if Prefs.has_key('torrentMaxPort'): + globals()['torrentMaxPort'] = Prefs['torrentMaxPort'] + + if Prefs.has_key('maxEntryAge'): + globals()['maxEntryAge'] = Prefs['maxEntryAge'] + + if Prefs.has_key('organizeDownloads'): + globals()['organizeDownloads'] = int(Prefs['organizeDownloads']) + + if Prefs.has_key('quotaEnabled'): + globals()['quotaEnabled'] = int(Prefs['quotaEnabled']) + + if Prefs.has_key('useProxyServer'): + globals()['useProxyServer'] = int(Prefs['useProxyServer']) + + if Prefs.has_key('useProxyIE'): + globals()['useProxyIE'] = int(Prefs['useProxyIE']) + + if Prefs.has_key('useProxyAuth'): + globals()['useProxyAuth'] = int(Prefs['useProxyAuth']) + + if Prefs.has_key('proxyServer'): + globals()['proxyServer'] = Prefs['proxyServer'] + + if Prefs.has_key('proxyPort'): + globals()['proxyPort'] = Prefs['proxyPort'] + + if Prefs.has_key('proxyUsername'): + globals()['proxyUsername'] = Prefs['proxyUsername'] + + if Prefs.has_key('proxyPassword'): + globals()['proxyPassword'] = Prefs['proxyPassword'] + + if Prefs.has_key('quotaSize'): + globals()['quotaSize'] = float(Prefs['quotaSize']) + #convert quotaSize to bytes + globals()['quotaSize'] = quotaSize * 1073741824 + + if Prefs.has_key('downloadDirectory'): + globals()['d'] = Prefs['downloadDirectory'] + if (globals()['d'] == ''): + globals()['d'] = defaultDir + globals()['d'] = d.replace('~', userPath) + globals()['downloadDirectory'] = globals()['d'] + + globals()['delList'] =[] + +def checkDir(dir): + if not os.path.isdir(dir): + os.mkdir(dir) + +def getVar(var): + if var == '3DESKey': + return __DESKey + elif var == 'timeBomb': + return __timeBombFile + +def setVar(var): + return \ No newline at end of file diff --git a/iPXTools.py b/iPXTools.py new file mode 100755 index 0000000..5d60409 --- /dev/null +++ b/iPXTools.py @@ -0,0 +1,1206 @@ +#(c) 2004-2008 Thunderstone Media, LLC +#Creative Commons Attribution-Noncommercial 3.0 United States License +# +#Python Developyment By: +# +#Ray Slakinski +#August Trometer + +import iPXSettings +import sys, difflib +from types import * +from time import * + +if sys.platform == 'darwin': + from objc import * + from Foundation import * + +class SM (difflib.SequenceMatcher): + def __helper(self, alo, ahi, blo, bhi, answer): + # slightly modified from difflib to ignore blocks of one elt + # this prevents weird ones like WheOcasionally + i, j, k = x = self.find_longest_match(alo, ahi, blo, bhi) + # a[alo:i] vs b[blo:j] unknown + # a[i:i+k] same as b[j:j+k] + # a[i+k:ahi] vs b[j+k:bhi] unknown + if k: + if alo < i and blo < j: + self.__helper(alo, i, blo, j, answer) + if k > 1: answer.append(x) + if i+k < ahi and j+k < bhi: + self.__helper(i+k, ahi, j+k, bhi, answer) + + _SequenceMatcher__helper = _SM__helper # python name mangling funniness + + +class HTTPHead: + import urllib2, iPXSettings + def __init__(self, url, username=None, password=None): + self.reply = 302 + self.headers = [] + self.msg = '' + setOpener() + url = url.strip() + url = url.replace(' ', '%20') + req = urllib2.Request(url) + req.add_header('User-Agent', iPXSettings.USER_AGENT) + + try: + h = urllib2.urlopen(req) + self.headers = h.info() + except Exception, e: + logIt(e) + + def getType(self): + if self.headers.has_key('Content-Type') and self.reply == 200: + return self.headers['Content-Type'] + else: + return None + + def getLength(self): + if self.headers.has_key('Content-Length') and self.reply == 200: + return self.headers['Content-Length'] + else: + return None + + def getName(self): + import re + from string import split + + newName = '' + if self.headers.has_key('Content-Disposition') and self.reply == 200: + if re.search('filename=', self.headers['Content-Disposition'], re.IGNORECASE): + textSplit = self.headers['Content-Disposition'].split(';') + for text in textSplit: + if re.search('filename=', text, re.IGNORECASE): + newNameSplit = text.split('=') + newName = newNameSplit[len(newNameSplit) -1] + newName = newName.replace('"', '') + + return newName + +def stringCleaning(text): + import re + + text = re.sub('[\\\\/?*:<>|;"\']','', text) + text = text.strip() + + return text + +def isTag(x): return x[0] == "<" and x[-1] == ">" + +def stringDiff(a, b): + from string import join + """@@@""" + out = '' + chars = 0 + a, b = ' '.join(html2list(a)), ' '.join(html2list(b)) + s = SM(None, a, b) + a = ' '.join(html2list(a, b=1)) + for e in s.get_opcodes(): + if e[0] == "replace": + out += "" + a[e[1]:e[2]] + "" + out += "" + b[e[3]:e[4]] + "" + elif e[0] == "delete": + out += ""+ a[e[1]:e[2]] +"" + elif e[0] == "insert": + out += ""+b[e[3]:e[4]] +"" + elif e[0] == "equal": + chunk = b[e[3]:e[4]] + if len(chunk) > chars: chars = len(chunk) + out += chunk + else: + raise "Um, something's broken. I didn't expect a '" + `e[0]` + "'." + return out + +def textDiff(a, b): + """Takes in strings a and b and returns a human-readable HTML diff.""" + from string import join + + out = [] + a, b = html2list(a), html2list(b) + s = difflib.SequenceMatcher(isTag, a, b) + for e in s.get_opcodes(): + if e[0] == "replace": + # @@ need to do something more complicated here + # call textDiff but not for html, but for some html... ugh + # gonna cop-out for now + out.append(""+' '.join(b[e[3]:e[4]])+"") + elif e[0] == "delete": + out.append(""+ ' '.join(a[e[1]:e[2]]) + "") + elif e[0] == "insert": + out.append(""+' '.join(b[e[3]:e[4]]) + "") + elif e[0] == "equal": + out.append(' '.join(b[e[3]:e[4]])) + else: + raise "Um, something's broken. I didn't expect a '" + `e[0]` + "'." + return ' '.join(out) + +def html2list(x, b=0): + import string + + mode = 'char' + cur = '' + out = [] + for c in x: + if mode == 'tag': + if c == '>': + if b: cur += ']' + else: cur += c + out.append(cur); cur = ''; mode = 'char' + else: cur += c + elif mode == 'char': + if c == '<': + out.append(cur) + if b: cur = '[' + else: cur = c + mode = 'tag' + elif c in string.whitespace: out.append(cur); cur = '' + else: cur += c + out.append(cur) + return filter(lambda x: x is not '', out) + +def htmlDiff(a, b): + f1, f2 = a.find(''), a.find('') + ca = a[f1+len(''):f2] + + f1, f2 = b.find(''), b.find('') + cb = b[f1+len(''):f2] + + r = textDiff(ca, cb) + hdr = '' + return b[:f1] + hdr + r + b[f2:] + +def getDirSize(dir): + import os + + sizes = [] + os.path.walk(dir, calcDirSize, sizes) + total = 0 + for size in sizes: + total = total + size + + return (total) + +def calcDirSize(arg, dir, files): + import os + + for file in files: + stats = os.stat(os.path.join(dir, file)) + size = stats[6] + arg.append(size) + +def HTML2Text(text): + import htmlentitydefs + flag = [1] + cleanText = '' + + def stripfunc(c): + if not flag[0]: + if c == '>': + flag[0] = 1 + return 0 + elif c == '<': + flag[0] = 0 + return flag[0] + + cleanText = filter(stripfunc,text) + + # 039 isn't in the defs table for some reason. + htmlentitydefs.codepoint2name[39] = 'quot' + + for key in htmlentitydefs.name2codepoint: + if ('&%s;' % key) in cleanText: + try: + cleanText = cleanText.replace('&%s;' % key, unichr(htmlentitydefs.name2codepoint[key])) + except: + pass + + + for key in htmlentitydefs.codepoint2name: + if key < 100: + if ('�%d;' % key) in cleanText: + try: + cleanText = cleanText.replace('�%d;' % key, unichr(key)) + except: + pass + if ('&#%d;' % key) in cleanText: + try: + cleanText = cleanText.replace('&#%d;' % key, unichr(key)) + except: + pass + + cleanText = cleanText.strip() + return cleanText + +def text2Audio(text, saveDir, saveName): + import os + + printMSG('Converting Text Entry To Audio...') + logIt('Converting Text Entry To Audio...') + cleanText = HTML2Text(text) + cleanText = cleanText.replace('"', '') + if sys.platform == 'darwin': + try: + f = open('/tmp/iPX-textToAudio.applescript', 'w') + + f.write('set theText to "%s"\r\n' % cleanText) + f.write('set theFile to POSIX file "%s/%s\r\n' % (saveDir,saveName)) + f.write('say theText saving to theFile') + f.close() + + os.popen('/usr/bin/osascript /tmp/iPX-textToAudio.applescript') + return True + except Exception, msg: + logIt('text2Audio Error: %s' % msg) + return False + elif sys.platform == 'win32': + try: + import win32com.client + import shutil + + speech = win32com.client.Dispatch('SAPI.SpVoice') + file_stream = win32com.client.Dispatch('SAPI.SpFileStream') + except Exception, msg: + logIt('text2Audio Error: %s' % msg) + return False + + logIt('Speech Modules Loaded...') + + try: + file_stream.Format.Type = 6 + file_stream.Open(saveName, 3, True) + speech.AudioOutputStream = file_stream + if not speech.Speak(cleanText) == 1: + return False + file_stream.Close() + if os.path.isfile('.\\%s' % saveName): + shutil.move('.\\' + saveName, saveDir + '\\' + saveName) + else: + logIt('text2Audio Error: File was not properly created') + return False + except Exception, msg: + logIt('text2Audio Error: %s' % msg) + return False + + return True + +def prepURL(url): + url = url.replace('%3A', ':') + url = url.replace('%2F', '/') + + if (url[:8] != 'https://'): + if (url[:7] != 'http://'): + url = 'http://%s' % url + return url + +def trimLog(): + import os, iPXSettings + + if os.path.isfile(iPXSettings.logFile): + os.unlink(iPXSettings.logFile) + +def genHash(data): + import md5 + + try: + msg = data.encode('utf8') + except: + from binascii import hexlify + + msg = hexlify(data) + msg = msg.encode('utf8') + + item = md5.new() + item.update(msg) + + return item.hexdigest() + +def logIt(incomingMsg): + import os, iPXSettings + + try: + if type(incomingMsg) is UnicodeType: + incomingMsg = incomingMsg.encode('utf8') + else: + incomingMsg = str(incomingMsg) + + msg = '%s %s' % (strftime('[%H:%M:%S]',localtime()), incomingMsg) + + if iPXSettings.DEBUG: + printMSG(msg) + + if os.path.isfile(iPXSettings.logFile): + f = open(iPXSettings.logFile, 'a') + f.write(msg + '\r\n') + f.close() + else: + f = open(iPXSettings.logFile, 'w') + f.write(msg + '\r\n') + f.close() + except Exception, msg: + if iPXSettings.DEBUG: + printMSG('Error Saving Log: %s' % msg) + if os.path.isfile(iPXSettings.logFile): + if iPXSettings.DEBUG: + printMSG('Attempting to deleting old log file...') + try: + os.unlink(iPXSettings.logFile) + except Exception, msg: + if iPXSettings.DEBUG: + printMSG('Error Deleting Log: ' + msg) + +def latin1_to_ascii(unicrap): + """This takes a UNICODE string and replaces Latin-1 characters with + something equivalent in 7-bit ASCII. It returns a plain ASCII string. + This function makes a best effort to convert Latin-1 characters into + ASCII equivalents. It does not just strip out the Latin-1 characters. + All characters in the standard 7-bit ASCII range are preserved. + In the 8th bit range all the Latin-1 accented letters are converted + to unaccented equivalents. Most symbol characters are converted to + something meaningful. Anything not converted is deleted. + """ + xlate={0xc0:'A', 0xc1:'A', 0xc2:'A', 0xc3:'A', 0xc4:'A', 0xc5:'A', + 0xc6:'Ae', 0xc7:'C', + 0xc8:'E', 0xc9:'E', 0xca:'E', 0xcb:'E', + 0xcc:'I', 0xcd:'I', 0xce:'I', 0xcf:'I', + 0xd0:'Th', 0xd1:'N', + 0xd2:'O', 0xd3:'O', 0xd4:'O', 0xd5:'O', 0xd6:'O', 0xd8:'O', + 0xd9:'U', 0xda:'U', 0xdb:'U', 0xdc:'U', + 0xdd:'Y', 0xde:'th', 0xdf:'ss', + 0xe0:'a', 0xe1:'a', 0xe2:'a', 0xe3:'a', 0xe4:'a', 0xe5:'a', + 0xe6:'ae', 0xe7:'c', + 0xe8:'e', 0xe9:'e', 0xea:'e', 0xeb:'e', + 0xec:'i', 0xed:'i', 0xee:'i', 0xef:'i', + 0xf0:'th', 0xf1:'n', + 0xf2:'o', 0xf3:'o', 0xf4:'o', 0xf5:'o', 0xf6:'o', 0xf8:'o', + 0xf9:'u', 0xfa:'u', 0xfb:'u', 0xfc:'u', + 0xfd:'y', 0xfe:'th', 0xff:'y', + 0xa1:'!', 0xa2:'{cent}', 0xa3:'{pound}', 0xa4:'{currency}', + 0xa5:'{yen}', 0xa6:'|', 0xa7:'{section}', 0xa8:'{umlaut}', + 0xa9:'{C}', 0xaa:'{^a}', 0xab:'<<', 0xac:'{not}', + 0xad:'-', 0xae:'{R}', 0xaf:'_', 0xb0:'{degrees}', + 0xb1:'{+/-}', 0xb2:'{^2}', 0xb3:'{^3}', 0xb4:"'", + 0xb5:'{micro}', 0xb6:'{paragraph}', 0xb7:'*', 0xb8:'{cedilla}', + 0xb9:'{^1}', 0xba:'{^o}', 0xbb:'>>', + 0xbc:'{1/4}', 0xbd:'{1/2}', 0xbe:'{3/4}', 0xbf:'?', + 0xd7:'*', 0xf7:'/' + } + + r = '' + for i in unicrap: + if xlate.has_key(ord(i)): + r += xlate[ord(i)] + elif ord(i) >= 0x80: + pass + else: + r += str(i) + return r + +def updatePlaylist(saveLocation, saveName, playList, customGenre, convertToAAC, makeBookmarkable): + import os, iPXSettings, random + + location = '' + iPXID = '' + + if sys.platform == 'darwin': + if (convertToAAC): + printMSG('Exporting to iTunes and converting to AAC...') + logIt('Exporting to iTunes and converting to AAC...') + else: + printMSG('Exporting to iTunes...') + logIt('Exporting to iTunes...') + trackID = 0 + fullPath = saveLocation + '/' + saveName + song = os.path.abspath(fullPath) + while True: + scriptName = '/tmp/iPX-iTunes-%d.scpt' % random.randint(1,90000) + + if not os.path.isfile(scriptName): + break + + f = open(scriptName, 'w') + + # initial settings + f.write('set thePlaylist to "%s"\r\n' % playList) + f.write('set theFile to "%s"\r\n' % song) + f.write('set theGenre to "%s"\r\n' % customGenre) + f.write('set theTrackID to 0\r\n') + f.write('property required_version : "4.0"\r\n') + + # if iTunes isn't open, open it in the background + f.write('tell application "System Events"\r\n') + f.write('if (not (exists process "iTunes")) then\r\n') + f.write('tell application "iTunes"\r\n') + f.write('set visible of front window to false\r\n') + f.write('end tell\r\n') + f.write('end if\r\n') + f.write('end tell\r\n') + + f.write('set theFile to the POSIX file theFile\r\n') + + f.write('tell application "iTunes"\r\n') + + # + # IMPORT TO ITUNES LIBRARY + # + f.write('with timeout of 1800 seconds\r\n') + + # move track to Library and get track object + f.write('try\r\n') + f.write('set theTrack to add theFile to library playlist 1 of source 1\r\n') + f.write('on error theError\r\n') + f.write('set theTrack to add theFile to library playlist 1\r\n') + f.write('end try\r\n') + f.write('end timeout\r\n') + + # + # SET CUSTOM GENRE + # + if len(customGenre) > 0: + f.write('try\r\n') + f.write('set genre of theTrack to theGenre\r\n') + f.write('end try\r\n') + + # + # SET IPXID IN THE COMMENTS FIELD + # + iPXID = strftime('%M%Y%m%H%d%S',gmtime()) + + f.write('set theComment to the comment of theTrack\r\n') + + f.write('set theCharacters to every character in theComment\r\n') + f.write('set commentString to ""\r\n') + f.write('repeat with aCharacter in theCharacters\r\n') + f.write('if (count commentString) is less than 160 then\r\n') + f.write('set commentString to commentString & aCharacter\r\n') + f.write('end if\r\n') + f.write('end repeat\r\n') + f.write('set the comment of theTrack to commentString & "\r\r" & "[iPXID:%s]"\r\n' % iPXID) + + # + # MAKE BOOKMARKABLE + # + f.write('with timeout of 1800 seconds\r\n') + f.write('try\r\n') + f.write('set this_version to the version as string\r\n') + f.write('if this_version is greater than or equal to the required_version then\r\n') + f.write('set bookmarkable of theTrack to true\r\n') + f.write('end if\r\n') + f.write('end try\r\n') + f.write('end timeout\r\n') + + # + # MOVE TO PLAYLIST + # + # Create playlist if it doesn't exist + f.write('try\r\n') + f.write('if (not (exists user playlist thePlaylist)) then\r\n') + f.write('make new playlist with properties {name:thePlaylist}\r\n') + f.write('end if\r\n') + + # move to the playlist + f.write('duplicate theTrack to the playlist thePlaylist\r\n') + f.write('end try\r\n') + + """ + # update connected iPod + f.write('try\r\n') + f.write('set myPod to (name of some source whose kind is iPod)\r\n') + f.write('update myPod\r\n') + f.write('end try\r\n') + """ + + f.write('return theTrack\r\n') + f.write('end tell\r\n') + + f.close() + + ret_pipe = os.popen('/usr/bin/osascript %s' % scriptName) + returnValue = '' + returnValue = ret_pipe.readline() + if len(returnValue) > 0: + location = "iTunes" + + if (iPXSettings.deleteAudio > 0): + logIt('Deleting: %s...' % fullPath) + if os.path.isfile(fullPath): + os.unlink(fullPath) + else: + printMSG('iTunes failed to update. Track left in Library') + logIt('iTunes failed to update. Track left in Library') + iPXID = '' + if not iPXSettings.DEBUG: + if os.path.isfile(scriptName): + os.unlink(scriptName) + else: + logIt('Keeping script: %s' % scriptName) + elif sys.platform == 'win32': + import win32com.client + import shutil + if iPXSettings.Prefs['exportApp'] == 1: + try: + printMSG('Exporting to Windows Media Player...') + logIt('Exporting to Windows Media Player...') + + wmp = win32com.client.Dispatch('WMPlayer.OCX.7') + playlists = wmp.playlistCollection.getByName(playList) + if playlists.count == 0: + pl = wmp.playlistCollection.newPlaylist(playList) + else: + pl = playlists.item(0) + media = wmp.newMedia('%s\\%s' % (saveLocation, saveName)) + if len(customGenre) > 0: + # Can not set Genre on some media files + try: + media.setItemInfo('WM/Genre', customGenre) + except: + pass + logIt('Adding Media File...') + pl.appendItem(media) + wmp.close() + location = "WMP" + except Exception, msg: + logIt('Failed to export to Windows Media Player') + logIt('ERRMSG: %s' % msg) + else: + try: + if (convertToAAC): + printMSG('Exporting to iTunes and converting to AAC...') + logIt('Exporting to iTunes and converting to AAC...') + else: + printMSG('Exporting to iTunes...') + logIt('Exporting to iTunes...') + + itunes = win32com.client.Dispatch('iTunes.Application') + playlists = itunes.LibrarySource.Playlists + pl = playlists.ItemByName(playList) + if not pl: + pl = itunes.CreatePlaylist(playList) + + if (convertToAAC): + oldEncoder = itunes.CurrentEncoder + itunes.CurrentEncoder = itunes.Encoders.ItemByName('AAC Encoder') + handle = itunes.ConvertFile2('%s\\%s' % (saveLocation, saveName)) + while handle.InProgress: + sleep(3) + itunes.CurrentEncoder = oldEncoder + for track in handle.Tracks: + aacLocation = str(track.Location) + if os.path.isfile(aacLocation): + newAacLocation = aacLocation.replace('.m4a', '.m4b') + shutil.copy(aacLocation, newAacLocation) + track.Delete() + os.unlink(aacLocation) + handle = pl.AddFile(newAacLocation) + try: + while handle.InProgress: + sleep(3) + except: + pass + else: + handle = pl.AddFile('%s\\%s' % (saveLocation, saveName)) + try: + while handle.InProgress: + sleep(3) + except: + pass + for track in handle.Tracks: + # + # SET IPXID IN THE COMMENTS FIELD + # + iPXID = strftime('\r\n[iPXID:%M%Y%m%H%d%S]\r\n',gmtime()) + track.Comment = track.Comment + iPXID + if len(customGenre) > 0: + track.Genre = customGenre + + location = 'iTunes' + except Exception, msg: + logIt('Failed to export to iTunes') + logIt('ERRMSG: %s' % msg) + + return iPXID, location + + +def updateiPhoto(saveLocation, saveName, photoAlbum, type): + import os, iPXSettings, random + + printMSG( 'Exporting to iPhoto...') + + location = '' + iPhotoID = 0 + iPXID = '' + + if sys.platform == 'darwin': + fullPath = saveLocation + '/' + saveName + + while True: + scriptName = '/tmp/iPX-iPhoto-%d.scpt' % random.randint(1,90000) + + if not os.path.isfile(scriptName): + break + + f = open(scriptName, 'w') + + # base values + f.write('set theAlbum to "%s"\r\n' % photoAlbum) + f.write('set thePath to "%s"\r\n' % fullPath) + + f.write('tell application "iPhoto"\r\n') + + #create album if it doesn't exist + f.write('if not (exists album theAlbum) then\r\n') + f.write('new album name theAlbum\r\n') + f.write('end if\r\n') + + #import the photo + f.write('set thePhoto to thePath\r\n') + f.write('import from thePhoto to album theAlbum\r\n') + + #get the photo location + f.write('set importedPhoto to the last item in (every photo in the last import album)\r\n') + + # + # SET IPXID IN THE COMMENTS FIELD + # + iPXID = strftime('%m%M%Y%H%d%S',gmtime()) + + f.write('set theComment to the comment of importedPhoto\r\n') + f.write('set the comment of importedPhoto to theComment & "\r\r" & "[iPXID:%s]"\r\n' % iPXID) + + # return the final Track Location + f.write('return the (id of importedPhoto) mod (8 ^ 8) as integer\r\n') + f.write('end tell\r\n') + + f.close() + + try: + ret_pipe = os.popen('/usr/bin/osascript %s' % scriptName) + iPhotoID = int(ret_pipe.readline()) + except: + pass + + if (iPhotoID > 3): + location = "iPhoto" + + if type == 0: + if (iPXSettings.deleteImages > 0): + logIt('Deleting: %s...' % fullPath) + if os.path.isfile(fullPath): + os.unlink(fullPath) + elif type == 1: + if (iPXSettings.deleteVideo > 0): + logIt('Deleting: %s...' % fullPath) + if os.path.isfile(fullPath): + os.unlink(fullPath) + + else: + printMSG('iPhoto failed to update. Image left in iPodderX Library') + iPXID = '' + if not iPXSettings.DEBUG: + if os.path.isfile(scriptName): + os.unlink(scriptName) + + # return the photoID of the file just added + return iPXID, location + +def detectFileType(fileName): + import typeFile, re + + logIt('Detecting file type...') + try: + fileType = typeFile.file(fileName) + except Exception, msg: + logIt('Failed to detect type, using data') + logIt(msg) + fileType = 'data' + + if re.search('ascii', fileType, re.IGNORECASE): + f = open(fileName, 'r') + for line in f.readlines(): + if re.search('', line, re.IGNORECASE): + type = 'html' + break + if re.search('xml', fileType, re.IGNORECASE): + f = open(fileName, 'r') + for line in f.readlines(): + if re.search(' 0): + for historyItem in tempHist['downloadHistory']: + if historyItem.has_key('encGUID'): + guids.append(historyItem['encGUID']) + + try: + os.unlink(iPXSettings.historyFile) + except: + pass + + for guid in guids: + saveHistory(guid) + except Exception, msg: + logIt('ERRMSG: %s' % msg) + else: + import pickle + + try: + if os.path.isfile(iPXSettings.newHistoryFile): + guids = pickle.load(open(iPXSettings.newHistoryFile)) + except: + pass + + return guids + +def saveHistory(encGUID): + import pickle, iPXSettings + + if iPXSettings.ranHistCheck == False: + iPXSettings.histGUIDs = getHistory() + iPXSettings.ranHistCheck = True + + if not encGUID in iPXSettings.histGUIDs: + logIt('Adding to history.dat: %s' % encGUID) + iPXSettings.histGUIDs.append(encGUID) + pickle.dump(iPXSettings.histGUIDs, open(iPXSettings.newHistoryFile,'w')) + else: + logIt('Entry already found in history.dat: %s' % encGUID) + +def doPing(encURL, feedURL): + import urllib, iPXSettings + + logIt('Sending Anonymous download feedback...') + pingURL = 'http://directory.iPodderX.com/feedData/survey/files?url=%s&feed=%s' % (encURL, feedURL) + + try: + class AppURLopener(urllib.FancyURLopener): + version = iPXSettings.USER_AGENT + + urllib._urlopener = AppURLopener() + handle = urllib.urlopen(pingURL) + except Exception, msg: + logIt('ERRMSG: %s' % msg) + +def printMSG(msg): + import os + try: + print msg.encode('utf8') + sys.stdout.flush() + except Exception, msg: + logIt('Failed to print console message') + logIt('ERRMSG: %s' % msg) + +def checkForScript(): + import iPXSettings, os + + if sys.platform == 'darwin': + if not iPXSettings.progName == 'iPodderX': + if (int(os.popen('ps auxww | grep -i iPodderX.py | grep -i "progName==' + iPXSettings.progName +'" |grep -v /bin/sh | grep -w -v ps | wc -l','r').readline().strip()) > 1): + printMSG('CHECK_ALREADY_RUNNING') + for line in os.popen('ps auxww | grep -i iPodderX.py | grep -v /bin/sh | grep -w -v ps','r').readlines(): + logIt(line) + return True + else: + return False + else: + if (int(os.popen('ps auxww | grep -i iPodderX.py |grep -v /bin/sh | grep -w -v ps | wc -l','r').readline().strip()) > 2): + printMSG('CHECK_ALREADY_RUNNING') + for line in os.popen('ps auxww | grep -i iPodderX.py | grep -v /bin/sh | grep -w -v ps','r').readlines(): + logIt(line) + return True + else: + return False + + elif sys.platform == 'win32': + pass + +def getOpmlFeeds(url): + import opmlparser, urllib, re + + ompl_parser = opmlparser.OPMLParser() + + try: + data = urllib.urlopen(url).read() + ompl_parser.feed(data) + except Exception, msg: + logIt('OPML Connect Error: %s' % msg) + + opmlFeeds = {} + + for node in ompl_parser: + try: + if re.search('rss', str(node.get('type')), re.IGNORECASE) or re.search('atom', str(node.get('type')), re.IGNORECASE): + title = 'Unknown' + if not str(node.get('title')) == 'None': + title = str(node.get('title')) + elif not str(node.get('text')) == 'None': + title = str(node.get('text')) + + if not str(node.get('xmlUrl')) == 'None': + opmlFeeds[title] = str(node.get('xmlUrl')) + elif not str(node.get('url')) == 'None': + opmlFeeds[title] = str(node.get('url')) + + except Exception, msg: + logIt('OPML Error: %s' % msg) + + return opmlFeeds + +def checkForUI(): + import os, iPXSettings + + if sys.platform == 'darwin': + if (int(os.popen('ps auxww | grep -i /Contents/MacOS/%s | grep -w -v ps | wc -l' % iPXSettings.progName,'r').readline().strip()) > 1): + return True + else: + return False + + elif sys.platform == 'win32': + pass + +def encrypt(plain): + import pyDes, iPXSettings + from binascii import hexlify + + key = iPXSettings.getVar('3DESKey') + key = key.decode('rot-13') + + k = pyDes.triple_des(key) + d = k.encrypt(plain.strip(), ' ') + + return hexlify(d) + +def decrypt(ciph): + import pyDes, iPXSettings + from binascii import unhexlify + + ciph = unhexlify(ciph) + key = iPXSettings.getVar('3DESKey') + key = key.decode('rot-13') + + k = pyDes.triple_des(key) + d = k.decrypt(ciph, ' ') + + return d + +def isWhole(x): + return x == math.floor(x) + +def setProxy(): + import os, iPXSettings + from string import split + + proxy = '' + if sys.platform == 'darwin': + import ic + try: + inetConfig = ic.IC() + if 'UseHTTPProxy' in inetConfig and inetConfig['UseHTTPProxy']: + if inetConfig.has_key('HTTPProxyHost'): + proxy = 'http://%s' % inetConfig['HTTPProxyHost'] + iPXSettings.useProxyServer = inetConfig['HTTPProxyHost'] + except Exception, msg: + logIt('Failed to detect OSX Proxy: %s' % msg) + elif sys.platform == 'win32': + if iPXSettings.useProxyServer: + if iPXSettings.useProxyIE: + try: + import _winreg as winreg + + host_port = None + + # Try to grab current proxy settings from the registry + regkey = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + 'Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings') + regval = winreg.QueryValueEx(regkey, 'ProxyServer') + proxyEnabled = winreg.QueryValueEx(regkey, 'ProxyEnable') + regkey.Close() + regval = str(regval[0]) + proxyEnabled = proxyEnabled[0] + if proxyEnabled: + # Regval can be of two types: + # - 'myproxy:3128' if one proxy for all protocols + # - 'ftp=myftpproxy:3128;http=myhttpproxy:3128;...' if several different proxies + values = regval.split(';') + if len(values) > 1: + for s in values: + scheme, p = s.split('=') + if scheme == 'http': + host_port = p + break + else: + host_port = values[0] + + # Split host and port + if host_port is not None: + t = host_port.split(':') + host = t[0].strip() + if host: + try: + port = int(t[1]) + except: + port = 80 + + proxy = '%s:%d' % (host, port) + iPXSettings.proxyServer = host + iPXSettings.proxyPort = str(port) + + except Exception, e: + logIt('Proxy Detection Error: %s' % e) + else: + if iPXSettings.useProxyAuth: + proxy = iPXSettings.proxyUsername + ':' + decrypt(iPXSettings.proxyPassword) + '@' + iPXSettings.proxyServer + + if len(iPXSettings.proxyPort) > 0: + proxy = proxy + ':' + iPXSettings.proxyPort + else: + proxy = iPXSettings.proxyServer + if len(iPXSettings.proxyPort) > 0: + proxy = proxy + ':' + iPXSettings.proxyPort + if len(proxy) > 0: + proxy = 'http://' + proxy + + if len(proxy) > 0: + os.environ["http_proxy"] = proxy + os.environ["https_proxy"] = proxy + else: + iPXSettings.proxyServer = '' + iPXSettings.proxyPort = '' + + return proxy + +def setOpener(url='', uName=None, pWord=''): + import urlparse, base64, socket, urllib2, iPXSettings + + socket.setdefaulttimeout(30) + + headers = [] + host = urlparse.urlparse(url)[1] + path = urlparse.urlparse(url)[2] + + headers.append(('User-Agent', iPXSettings.USER_AGENT)) + if iPXSettings.useProxyServer: + if iPXSettings.useProxyAuth: + user_pass = base64.encodestring('%s:%s' %(iPXSettings.proxyUsername,decrypt(iPXSettings.proxyPassword))) + headers.append(('Proxy-authorization', 'Basic %s' % user_pass)) + + opener = urllib2.build_opener() + + if not uName == None: + webAuth = base64.encodestring('%s:%s' % (uName, pWord)) + headers.append(('Authorization', 'Basic ' + webAuth)) + + opener.addheaders = headers + urllib2.install_opener(opener) + + return opener + +def getFileViaProxySSL(url, uName, pWord, justHead=False, dlProgress=False): + import urlparse, base64, socket, httplib, urllib, os, iPXSettings, re + from string import split + + host = urlparse.urlparse(url)[1] + port=443 + filePath = urlparse.urlparse(url)[2] + + phost=iPXSettings.proxyServer + pport=int(iPXSettings.proxyPort) + + if iPXSettings.SUPERDEBUG: + logIt('Using Proxy: %s:%d' % (phost, pport)) + + webAuth = base64.encodestring('%s:%s' % (uName, pWord)) + + proxy_authorization = '' + if iPXSettings.useProxyAuth: + user=iPXSettings.proxyUsername + passwd=decrypt(iPXSettings.proxyPassword) + user_pass=base64.encodestring(user + ':' + passwd) + proxy_authorization='Proxy-authorization: Basic '+user_pass+'\r\n' + + proxy_connect='CONNECT %s:%s HTTP/1.0\r\n'%(host,port) + proxy_pieces=proxy_connect+proxy_authorization+'\r\n' + if iPXSettings.SUPERDEBUG: + print proxy_pieces + + try: + #now connect, very simple recv and error checking + proxy=socket.socket(socket.AF_INET,socket.SOCK_STREAM) + proxy.settimeout(60) + proxy.connect((phost,pport)) + proxy.sendall(proxy_pieces+'\r\n') + response=proxy.recv(8192) + status=response.split()[1] + if status!='200': raise Exception, 'Recieved HTTP Status Code: %d' % status + + #trivial setup for ssl socket + ssl = socket.ssl(proxy, None, None) + sock = httplib.FakeSocket(proxy, ssl) + + #initalize httplib and replace with your socket + params = urllib.urlencode({}) + headers = {'Authorization':'Basic ' + webAuth, 'User-Agent':iPXSettings.USER_AGENT} + h=httplib.HTTPConnection('localhost') + h.sock=sock + + if justHead: + saveName = None + h.request("HEAD", url,headers=headers) + respObj = h.getresponse() + url = urlparse.urljoin(url, respObj.getheader('location', '')) + saveName = url.split('/')[len(url.split('/'))-1] + logIt(saveName) + if respObj.status in (301,302,): + url = urlparse.urljoin(url, respObj.getheader('location', '')) + #filePath = urlparse.urlparse(url)[2] + logIt('Redirecting to url: %s' % url) + try: + if not respObj.getheader('Content-Disposition') == None: + if re.search('filename=', respObj.getheader('Content-Disposition'), re.IGNORECASE): + textSplit = respObj.getheader('Content-Disposition') + textSplit = textSplit.split(';') + for text in textSplit: + if re.search('filename=', text, re.IGNORECASE): + logIt('Detected New Filename To Use:') + newSaveNameSplit = text.split('=') + newSaveName = newSaveNameSplit[len(newSaveNameSplit) -1] + newSaveName = newSaveName.replace('"', '') + logIt(newSaveName) + saveName = newSaveName + except Exception, msg: + logIt('Content-Disposition Error: %s' % msg) + + return respObj.status, url, saveName + else: + h.request('GET', url, headers=headers) + except Exception, msg: + logIt('Connection Failed') + logIt('ERRMSG: %s' % msg) + return 0, None, None + + if dlProgress: + import tempfile + try: + count = 0 + lastPercentDone = 0 + n = 1024 # number of bytes to read at a time + fileSize = 0 + r=h.getresponse() + if r.status == 200: + fileSize = float(r.getheader('Content-Length', 0.00)) / 1024 + printMSG(';;1;;1;;100.00;;0.00') + tmpFile = tempfile.mkstemp() + tmpFileName = tmpFile[1] + f = open(tmpFileName, 'ab') + while True: + a = r.read(n) + f.write(a) + if not a: break + count += len(a) # len(a) may not be same as n for final read + + percentDone = ((float(count) /1024) / fileSize) * 100 + if percentDone >= lastPercentDone + 1: + lastPercentDone = percentDone + printMSG(';;1;;1;;100.00;;%.2f' % percentDone) + + printMSG(';;1;;1;;100.00;;100.00') + f.close() + os.close(tmpFile[0]) + + return 200, tmpFileName, r + else: + logIt('Recieved HTTP Code: %s' % r.status) + return 0, None, None + + except Exception, msg: + logIt('Connection Failed') + logIt('ERRMSG: %s' % msg) + return 0, None, None + else: + try: + r=h.getresponse() + data = r.read() + if iPXSettings.SUPERDEBUG: + print data + return 200, data, None + except Exception, msg: + logIt('Connection Failed') + logIt('ERRMSG: %s' % msg) + return 0, '', None \ No newline at end of file diff --git a/khashmir/KRateLimiter.py b/khashmir/KRateLimiter.py new file mode 100755 index 0000000..a9a9cdc --- /dev/null +++ b/khashmir/KRateLimiter.py @@ -0,0 +1,75 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from BitTorrent.platform import bttime as time +from BitTorrent.CurrentRateMeasure import Measure +from const import * +from random import randrange, shuffle +from traceback import print_exc + +class KRateLimiter: + # special rate limiter that drops entries that have been sitting in the queue for longer than self.age seconds + # by default we toss anything that has less than 5 seconds to live + def __init__(self, transport, rate, call_later, rlcount, rate_period, age=(KRPC_TIMEOUT - 5)): + self.q = [] + self.transport = transport + self.rate = rate + self.curr = 0 + self.running = False + self.age = age + self.last = 0 + self.call_later = call_later + self.rlcount = rlcount + self.measure = Measure(rate_period) + self.sent=self.dropped=0 + if self.rate == 0: + self.rate = 1e10 + + def sendto(self, s, i, addr): + self.q.append((time(), (s, i, addr))) + if not self.running: + self.run(check=True) + + def run(self, check=False): + t = time() + self.expire(t) + self.curr -= (t - self.last) * self.rate + self.last = t + if check: + self.curr = max(self.curr, 0 - self.rate) + + shuffle(self.q) + while self.q and self.curr <= 0: + x, tup = self.q.pop() + size = len(tup[0]) + self.curr += size + try: + self.transport.sendto(*tup) + self.sent+=1 + self.rlcount(size) + self.measure.update_rate(size) + except: + if tup[2][1] != 0: + print ">>> sendto exception", tup + print_exc() + self.q.sort() + if self.q or self.curr > 0: + self.running = True + # sleep for at least a half second + self.call_later(self.run, max(self.curr / self.rate, 0.5)) + else: + self.running = False + + def expire(self, t=time()): + if self.q: + expire_time = t - self.age + while self.q and self.q[0][0] < expire_time: + self.q.pop(0) + self.dropped+=1 diff --git a/khashmir/__init__.py b/khashmir/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/khashmir/actions.py b/khashmir/actions.py new file mode 100755 index 0000000..2bbe94b --- /dev/null +++ b/khashmir/actions.py @@ -0,0 +1,349 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from BitTorrent.platform import bttime as time + +import const + +from khash import intify +from ktable import KTable, K +from util import unpackNodes +from krpc import KRPCProtocolError, KRPCSelfNodeError +from bisect import insort + +class NodeWrap(object): + def __init__(self, node, target): + self.num = target + self.node = node + + def __cmp__(self, o): + """ this function is for sorting nodes relative to the ID we are looking for """ + x, y = self.num ^ o.num, self.num ^ self.node.num + if x > y: + return 1 + elif x < y: + return -1 + return 0 + +class ActionBase(object): + """ base class for some long running asynchronous proccesses like finding nodes or values """ + def __init__(self, table, target, callback, callLater): + self.table = table + self.target = target + self.callLater = callLater + self.num = intify(target) + self.found = {} + self.foundq = [] + self.queried = {} + self.queriedip = {} + self.answered = {} + self.callback = callback + self.outstanding = 0 + self.finished = 0 + + def sort(self, a, b): + """ this function is for sorting nodes relative to the ID we are looking for """ + x, y = self.num ^ a.num, self.num ^ b.num + if x > y: + return 1 + elif x < y: + return -1 + return 0 + + def shouldQuery(self, node): + if node.id == self.table.node.id: + return False + elif (node.host, node.port) not in self.queriedip and node.id not in self.queried: + self.queriedip[(node.host, node.port)] = 1 + self.queried[node.id] = 1 + return True + return False + + def _cleanup(self): + self.foundq = None + self.found = None + self.queried = None + self.queriedip = None + + def goWithNodes(self, t): + pass + + + +FIND_NODE_TIMEOUT = 15 + +class FindNode(ActionBase): + """ find node action merits it's own class as it is a long running stateful process """ + def handleGotNodes(self, dict): + _krpc_sender = dict['_krpc_sender'] + dict = dict['rsp'] + sender = {'id' : dict["id"]} + sender['port'] = _krpc_sender[1] + sender['host'] = _krpc_sender[0] + sender = self.table.Node().initWithDict(sender) + try: + l = unpackNodes(dict.get("nodes", [])) + if not self.answered.has_key(sender.id): + self.answered[sender.id] = sender + except: + l = [] + self.table.invalidateNode(sender) + + if self.finished: + # a day late and a dollar short + return + self.outstanding = self.outstanding - 1 + for node in l: + n = self.table.Node().initWithDict(node) + if not self.found.has_key(n.id): + self.found[n.id] = n + insort(self.foundq, NodeWrap(n, self.num)) + self.table.insertNode(n, contacted=0) + self.schedule() + + def schedule(self): + """ + send messages to new peers, if necessary + """ + if self.finished: + return + l = [wrapper.node for wrapper in self.foundq[:K]] + for node in l: + if node.id == self.target: + self.finished=1 + return self.callback([node]) + if self.shouldQuery(node): + #xxxx t.timeout = time.time() + FIND_NODE_TIMEOUT + try: + df = node.findNode(self.target, self.table.node.id) + except KRPCSelfNodeError: + pass + else: + df.addCallbacks(self.handleGotNodes, self.makeMsgFailed(node)) + self.outstanding = self.outstanding + 1 + if self.outstanding >= const.CONCURRENT_REQS: + break + assert(self.outstanding) >=0 + if self.outstanding == 0: + ## all done!! + self.finished=1 + self._cleanup() + self.callLater(self.callback, 0, (l[:K],)) + + def makeMsgFailed(self, node): + return self._defaultGotNodes + + def _defaultGotNodes(self, err): + self.outstanding = self.outstanding - 1 + self.schedule() + + def goWithNodes(self, nodes): + """ + this starts the process, our argument is a transaction with t.extras being our list of nodes + it's a transaction since we got called from the dispatcher + """ + for node in nodes: + if node.id == self.table.node.id: + continue + else: + self.found[node.id] = node + insort(self.foundq, NodeWrap(node, self.num)) + self.schedule() + + +get_value_timeout = 15 +class GetValue(FindNode): + def __init__(self, table, target, callback, callLater, find="findValue"): + FindNode.__init__(self, table, target, callback, callLater) + self.findValue = find + + """ get value task """ + def handleGotNodes(self, dict): + _krpc_sender = dict['_krpc_sender'] + dict = dict['rsp'] + sender = {'id' : dict["id"]} + sender['port'] = _krpc_sender[1] + sender['host'] = _krpc_sender[0] + sender = self.table.Node().initWithDict(sender) + + if self.finished or self.answered.has_key(sender.id): + # a day late and a dollar short + return + self.outstanding = self.outstanding - 1 + + self.answered[sender.id] = sender + # go through nodes + # if we have any closer than what we already got, query them + if dict.has_key('nodes'): + try: + l = unpackNodes(dict.get('nodes',[])) + except: + l = [] + del(self.answered[sender.id]) + + for node in l: + n = self.table.Node().initWithDict(node) + if not self.found.has_key(n.id): + self.table.insertNode(n) + self.found[n.id] = n + insort(self.foundq, NodeWrap(n, self.num)) + elif dict.has_key('values'): + def x(y, z=self.results): + if not z.has_key(y): + z[y] = 1 + return y + else: + return None + z = len(dict.get('values', [])) + v = filter(None, map(x, dict.get('values',[]))) + if(len(v)): + self.callLater(self.callback, 0, (v,)) + self.schedule() + + ## get value + def schedule(self): + if self.finished: + return + for node in [wrapper.node for wrapper in self.foundq[:K]]: + if self.shouldQuery(node): + #xxx t.timeout = time.time() + GET_VALUE_TIMEOUT + try: + f = getattr(node, self.findValue) + except AttributeError: + print ">>> findValue %s doesn't have a %s method!" % (node, self.findValue) + else: + try: + df = f(self.target, self.table.node.id) + df.addCallback(self.handleGotNodes) + df.addErrback(self.makeMsgFailed(node)) + self.outstanding = self.outstanding + 1 + self.queried[node.id] = 1 + except KRPCSelfNodeError: + pass + if self.outstanding >= const.CONCURRENT_REQS: + break + assert(self.outstanding) >=0 + if self.outstanding == 0: + ## all done, didn't find it!! + self.finished=1 + self._cleanup() + self.callLater(self.callback,0, ([],)) + + ## get value + def goWithNodes(self, nodes, found=None): + self.results = {} + if found: + for n in found: + self.results[n] = 1 + for node in nodes: + if node.id == self.table.node.id: + continue + else: + self.found[node.id] = node + insort(self.foundq, NodeWrap(node, self.num)) + self.schedule() + + +class StoreValue(ActionBase): + def __init__(self, table, target, value, callback, callLater, store="storeValue"): + ActionBase.__init__(self, table, target, callback, callLater) + self.value = value + self.stored = [] + self.store = store + + def storedValue(self, t, node): + self.outstanding -= 1 + if self.finished: + return + self.stored.append(t) + if len(self.stored) >= const.STORE_REDUNDANCY: + self.finished=1 + self.callback(self.stored) + else: + if not len(self.stored) + self.outstanding >= const.STORE_REDUNDANCY: + self.schedule() + return t + + def storeFailed(self, t, node): + self.outstanding -= 1 + if self.finished: + return t + self.schedule() + return t + + def schedule(self): + if self.finished: + return + num = const.CONCURRENT_REQS - self.outstanding + if num > const.STORE_REDUNDANCY - len(self.stored): + num = const.STORE_REDUNDANCY - len(self.stored) + if num == 0 and not self.finished: + self.finished=1 + self.callback(self.stored) + while num > 0: + try: + node = self.nodes.pop() + except IndexError: + if self.outstanding == 0: + self.finished = 1 + self._cleanup() + self.callback(self.stored) + return + else: + if not node.id == self.table.node.id: + try: + f = getattr(node, self.store) + except AttributeError: + print ">>> %s doesn't have a %s method!" % (node, self.store) + else: + try: + df = f(self.target, self.value, self.table.node.id) + except KRPCProtocolError: + self.table.table.invalidateNode(node) + except KRPCSelfNodeError: + pass + else: + df.addCallback(self.storedValue,(),{'node':node}) + df.addErrback(self.storeFailed, (), {'node':node}) + self.outstanding += 1 + num -= 1 + + def goWithNodes(self, nodes): + self.nodes = nodes + self.nodes.sort(self.sort) + self.schedule() + + +class GetAndStore(GetValue): + def __init__(self, table, target, value, callback, storecallback, callLater, find="findValue", store="storeValue"): + self.store = store + self.value = value + self.cb2 = callback + self.storecallback = storecallback + def cb(res): + self.cb2(res) + if not(res): + n = StoreValue(self.table, self.target, self.value, self.doneStored, self.callLater, self.store) + n.goWithNodes(self.answered.values()) + GetValue.__init__(self, table, target, cb, callLater, find) + + def doneStored(self, dict): + self.storecallback(dict) + +class KeyExpirer: + def __init__(self, store, callLater): + self.store = store + self.callLater = callLater + self.callLater(self.doExpire, const.KEINITIAL_DELAY) + + def doExpire(self): + self.cut = time() - const.KE_AGE + self.store.expire(self.cut) + self.callLater(self.doExpire, const.KE_DELAY) diff --git a/khashmir/cache.py b/khashmir/cache.py new file mode 100755 index 0000000..ab4df30 --- /dev/null +++ b/khashmir/cache.py @@ -0,0 +1,52 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from BitTorrent.platform import bttime as time + +class Cache: + def __init__(self, touch_on_access = False): + self.data = {} + self.q = [] + self.touch = touch_on_access + + def __getitem__(self, key): + if self.touch: + v = self.data[key][1] + self[key] = v + return self.data[key][1] + + def __setitem__(self, key, value): + t = time() + self.data[key] = (t, value) + self.q.insert(0, (t, key, value)) + + def __delitem__(self, key): + del(self.data[key]) + + def has_key(self, key): + return self.data.has_key(key) + + def keys(self): + return self.data.keys() + + def expire(self, expire_time): + try: + while self.q[-1][0] < expire_time: + x = self.q.pop() + assert(x[0] < expire_time) + try: + t, v = self.data[x[1]] + if v == x[2] and t == x[0]: + del(self.data[x[1]]) + except KeyError: + pass + except IndexError: + pass + diff --git a/khashmir/const.py b/khashmir/const.py new file mode 100755 index 0000000..db8e4ff --- /dev/null +++ b/khashmir/const.py @@ -0,0 +1,65 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# magic id to use before we know a peer's id +NULL_ID = 20 * '\0' + +# Kademlia "K" constant, this should be an even number +K = 8 + +# SHA1 is 160 bits long +HASH_LENGTH = 160 + +# checkpoint every this many seconds +CHECKPOINT_INTERVAL = 60 * 5 # five minutes + +# how often to find our own nodes +FIND_CLOSE_INTERVAL = 60 * 15 # fifteen minutes + +### SEARCHING/STORING +# concurrent krpc calls per find node/value request! +CONCURRENT_REQS = K + +# how many hosts to post to +STORE_REDUNDANCY = 3 + + +### ROUTING TABLE STUFF +# how many times in a row a node can fail to respond before it's booted from the routing table +MAX_FAILURES = 3 + +# never ping a node more often than this +MIN_PING_INTERVAL = 60 * 15 # fifteen minutes + +# refresh buckets that haven't been touched in this long +BUCKET_STALENESS = 60 * 15 # fifteen minutes + + +### KEY EXPIRER +# time before expirer starts running +KEINITIAL_DELAY = 15 # 15 seconds - to clean out old stuff in persistent db + +# time between expirer runs +KE_DELAY = 60 * 5 # 5 minutes + +# expire entries older than this +KE_AGE = 60 * 30 # 30 minutes + + +## krpc +KRPC_TIMEOUT = 20 + +KRPC_ERROR = 1 +KRPC_ERROR_METHOD_UNKNOWN = 2 +KRPC_ERROR_RECEIVED_UNKNOWN = 3 +KRPC_ERROR_TIMEOUT = 4 +KRPC_SOCKET_ERROR = 5 + +KRPC_CONNECTION_CACHE_TIME = KRPC_TIMEOUT * 2 diff --git a/khashmir/hammerlock.py b/khashmir/hammerlock.py new file mode 100755 index 0000000..dd4b5a1 --- /dev/null +++ b/khashmir/hammerlock.py @@ -0,0 +1,37 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +INTERVAL = 60 +PERIODS = 5 + +class Hammerlock: + def __init__(self, rate, call_later): + self.rate = rate + self.call_later = call_later + self.curr = 0 + self.buckets = [{} for x in range(PERIODS)] + self.call_later(self._cycle, INTERVAL) + + def _cycle(self): + self.curr = (self.curr + 1) % PERIODS + self.buckets[self.curr] = {} + self.call_later(self._cycle, INTERVAL) + + def check(self, addr): + x = self.buckets[self.curr].get(addr, 0) + 1 + self.buckets[self.curr][addr] = x + x = 0 + for bucket in self.buckets: + x += bucket.get(addr, 0) + if x >= self.rate: + return False + else: + return True + diff --git a/khashmir/inserter.py b/khashmir/inserter.py new file mode 100755 index 0000000..d45ff04 --- /dev/null +++ b/khashmir/inserter.py @@ -0,0 +1,49 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +### generate a bunch of nodes that use a single contact point +usage = "usage: inserter.py " + +from utkhashmir import UTKhashmir +from BitTorrent.RawServer_magic import RawServer +from BitTorrent.defaultargs import common_options, rare_options +from khashmir.khash import newID +from random import randrange +from threading import Event +import sys, os + +from khashmir.krpc import KRPC +KRPC.noisy = 1 +global done +done = 0 +def d(n): + global done + done = done+1 + +if __name__=="__main__": + global done + host, port = sys.argv[1:] + x = UTKhashmir("", 22038, "/tmp/cgcgcgc") + x.addContact(host, int(port)) + x.rawserver.listen_once() + x.findCloseNodes(d) + while not done: + x.rawserver.listen_once() + l = [] + for i in range(10): + k = newID() + v = randrange(10000,20000) + l.append((k, v)) + x.announcePeer(k, v, d) + done = 1 + while done < 10: + x.rawserver.listen_once(1) + for k,v in l: + print ">>>", `k`, v diff --git a/khashmir/khash.py b/khashmir/khash.py new file mode 100755 index 0000000..2750a7d --- /dev/null +++ b/khashmir/khash.py @@ -0,0 +1,120 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from sha import sha +from random import randint + +#this is ugly, hopefully os.entropy will be in 2.4 +try: + from entropy import entropy +except ImportError: + def entropy(n): + s = '' + for i in range(n): + s += chr(randint(0,255)) + return s + +def intify(hstr): + """20 bit hash, big-endian -> long python integer""" + assert len(hstr) == 20 + return long(hstr.encode('hex'), 16) + +def stringify(num): + """long int -> 20-character string""" + str = hex(num)[2:] + if str[-1] == 'L': + str = str[:-1] + if len(str) % 2 != 0: + str = '0' + str + str = str.decode('hex') + return (20 - len(str)) *'\x00' + str + +def distance(a, b): + """distance between two 160-bit hashes expressed as 20-character strings""" + return intify(a) ^ intify(b) + + +def newID(): + """returns a new pseudorandom globally unique ID string""" + h = sha() + h.update(entropy(20)) + return h.digest() + +def newIDInRange(min, max): + return stringify(randRange(min,max)) + +def randRange(min, max): + return min + intify(newID()) % (max - min) + +def newTID(): + return randRange(-2**30, 2**30) + +### Test Cases ### +import unittest + +class NewID(unittest.TestCase): + def testLength(self): + self.assertEqual(len(newID()), 20) + def testHundreds(self): + for x in xrange(100): + self.testLength + +class Intify(unittest.TestCase): + known = [('\0' * 20, 0), + ('\xff' * 20, 2L**160 - 1), + ] + def testKnown(self): + for str, value in self.known: + self.assertEqual(intify(str), value) + def testEndianessOnce(self): + h = newID() + while h[-1] == '\xff': + h = newID() + k = h[:-1] + chr(ord(h[-1]) + 1) + self.assertEqual(intify(k) - intify(h), 1) + def testEndianessLots(self): + for x in xrange(100): + self.testEndianessOnce() + +class Disantance(unittest.TestCase): + known = [ + (("\0" * 20, "\xff" * 20), 2**160L -1), + ((sha("foo").digest(), sha("foo").digest()), 0), + ((sha("bar").digest(), sha("bar").digest()), 0) + ] + def testKnown(self): + for pair, dist in self.known: + self.assertEqual(distance(pair[0], pair[1]), dist) + def testCommutitive(self): + for i in xrange(100): + x, y, z = newID(), newID(), newID() + self.assertEqual(distance(x,y) ^ distance(y, z), distance(x, z)) + +class RandRange(unittest.TestCase): + def testOnce(self): + a = intify(newID()) + b = intify(newID()) + if a < b: + c = randRange(a, b) + self.assertEqual(a <= c < b, 1, "output out of range %d %d %d" % (b, c, a)) + else: + c = randRange(b, a) + assert b <= c < a, "output out of range %d %d %d" % (b, c, a) + + def testOneHundredTimes(self): + for i in xrange(100): + self.testOnce() + + + +if __name__ == '__main__': + unittest.main() + + diff --git a/khashmir/khashmir.py b/khashmir/khashmir.py new file mode 100755 index 0000000..7006d21 --- /dev/null +++ b/khashmir/khashmir.py @@ -0,0 +1,442 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +import const +from socket import gethostbyname + +from BitTorrent.platform import bttime as time + +from sha import sha +import re +from BitTorrent.defaultargs import common_options, rare_options +from BitTorrent.RawServer_magic import RawServer + +from ktable import KTable, K +from knode import * +from kstore import KStore +from khash import newID, newIDInRange + +from util import packNodes +from actions import FindNode, GetValue, KeyExpirer, StoreValue +import krpc + +import sys +import os +import traceback + +from BitTorrent.bencode import bencode, bdecode + +from BitTorrent.defer import Deferred +from random import randrange +from kstore import sample + +from threading import Event, Thread + +ip_pat = re.compile('[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') + +class KhashmirDBExcept(Exception): + pass + +def foo(bytes): + pass + +# this is the base class, has base functionality and find node, no key-value mappings +class KhashmirBase: + _Node = KNodeBase + def __init__(self, host, port, data_dir, rawserver=None, max_ul_rate=1024, checkpoint=True, errfunc=None, rlcount=foo, config={'pause':False, 'max_rate_period':20}): + if rawserver: + self.rawserver = rawserver + else: + self.flag = Event() + d = dict([(x[0],x[1]) for x in common_options + rare_options]) + self.rawserver = RawServer(self.flag, d) + self.max_ul_rate = max_ul_rate + self.socket = None + self.config = config + self.setup(host, port, data_dir, rlcount, checkpoint) + + def setup(self, host, port, data_dir, rlcount, checkpoint=True): + self.host = host + self.port = port + self.ddir = data_dir + self.store = KStore() + self.pingcache = {} + self.socket = self.rawserver.create_udpsocket(self.port, self.host, False) + self.udp = krpc.hostbroker(self, (self.host, self.port), self.socket, self.rawserver.add_task, self.max_ul_rate, self.config, rlcount) + self._load() + self.rawserver.start_listening_udp(self.socket, self.udp) + self.last = time() + KeyExpirer(self.store, self.rawserver.add_task) + self.refreshTable(force=1) + if checkpoint: + self.rawserver.add_task(self.findCloseNodes, 30, (lambda a: a, True)) + self.rawserver.add_task(self.checkpoint, 60, (1,)) + + def Node(self): + n = self._Node(self.udp.connectionForAddr) + n.table = self + return n + + def __del__(self): + if self.socket is not None: + self.rawserver.stop_listening_udp(self.socket) + self.socket.close() + + def _load(self): + do_load = False + try: + s = open(os.path.join(self.ddir, "routing_table"), 'r').read() + dict = bdecode(s) + except: + id = newID() + else: + id = dict['id'] + do_load = True + + self.node = self._Node(self.udp.connectionForAddr).init(id, self.host, self.port) + self.table = KTable(self.node) + if do_load: + self._loadRoutingTable(dict['rt']) + + + def checkpoint(self, auto=0): + d = {} + d['id'] = self.node.id + d['rt'] = self._dumpRoutingTable() + try: + f = open(os.path.join(self.ddir, "routing_table"), 'wb') + f.write(bencode(d)) + f.close() + except: + #XXX real error here + print ">>> unable to dump routing table!", str(e) + pass + + + if auto: + self.rawserver.add_task(self.checkpoint, + randrange(int(const.CHECKPOINT_INTERVAL * .9), + int(const.CHECKPOINT_INTERVAL * 1.1)), + (1,)) + + def _loadRoutingTable(self, nodes): + """ + load routing table nodes from database + it's usually a good idea to call refreshTable(force=1) after loading the table + """ + for rec in nodes: + n = self.Node().initWithDict(rec) + self.table.insertNode(n, contacted=0, nocheck=True) + + def _dumpRoutingTable(self): + """ + save routing table nodes to the database + """ + l = [] + for bucket in self.table.buckets: + for node in bucket.l: + l.append({'id':node.id, 'host':node.host, 'port':node.port, 'age':int(node.age)}) + return l + + + def _addContact(self, host, port, callback=None): + """ + ping this node and add the contact info to the table on pong! + """ + n =self.Node().init(const.NULL_ID, host, port) + try: + self.sendPing(n, callback=callback) + except krpc.KRPCSelfNodeError: + # our own node + pass + + + ####### + ####### LOCAL INTERFACE - use these methods! + def addContact(self, ip, port, callback=None): + """ + ping this node and add the contact info to the table on pong! + """ + if ip_pat.match(ip): + self._addContact(ip, port) + else: + def go(ip=ip, port=port): + ip = gethostbyname(ip) + self.rawserver.external_add_task(self._addContact, 0, (ip, port)) + t = Thread(target=go) + t.start() + + + ## this call is async! + def findNode(self, id, callback, errback=None): + """ returns the contact info for node, or the k closest nodes, from the global table """ + # get K nodes out of local table/cache, or the node we want + nodes = self.table.findNodes(id, invalid=True) + l = [x for x in nodes if x.invalid] + if len(l) > 4: + nodes = sample(l , 4) + self.table.findNodes(id, invalid=False)[:4] + + d = Deferred() + if errback: + d.addCallbacks(callback, errback) + else: + d.addCallback(callback) + if len(nodes) == 1 and nodes[0].id == id : + d.callback(nodes) + else: + # create our search state + state = FindNode(self, id, d.callback, self.rawserver.add_task) + self.rawserver.external_add_task(state.goWithNodes, 0, (nodes,)) + + def insertNode(self, n, contacted=1): + """ + insert a node in our local table, pinging oldest contact in bucket, if necessary + + If all you have is a host/port, then use addContact, which calls this method after + receiving the PONG from the remote node. The reason for the seperation is we can't insert + a node into the table without it's peer-ID. That means of course the node passed into this + method needs to be a properly formed Node object with a valid ID. + """ + old = self.table.insertNode(n, contacted=contacted) + if old and old != n: + if not old.inPing(): + self.checkOldNode(old, n, contacted) + else: + l = self.pingcache.get(old.id, []) + if len(l) < 10 or contacted: + l.append((n, contacted)) + self.pingcache[old.id] = l + + + + def checkOldNode(self, old, new, contacted=False): + ## these are the callbacks used when we ping the oldest node in a bucket + + def cmp(a, b): + if a[1] == 1 and b[1] == 0: + return -1 + elif b[1] == 1 and a[1] == 0: + return 1 + else: + return 0 + + def _staleNodeHandler(dict, old=old, new=new, contacted=contacted): + """ called if the pinged node never responds """ + if old.fails >= 2: + l = self.pingcache.get(old.id, []) + l.sort(cmp) + if l: + n, nc = l[0] + if (not contacted) and nc: + l = l[1:] + [(new, contacted)] + new = n + contacted = nc + o = self.table.replaceStaleNode(old, new) + if o and o != new: + self.checkOldNode(o, new) + try: + self.pingcache[o.id] = self.pingcache[old.id] + del(self.pingcache[old.id]) + except KeyError: + pass + else: + if l: + del(self.pingcache[old.id]) + l.sort(cmp) + for node in l: + self.insertNode(node[0], node[1]) + else: + l = self.pingcache.get(old.id, []) + if l: + del(self.pingcache[old.id]) + self.insertNode(new, contacted) + for node in l: + self.insertNode(node[0], node[1]) + + def _notStaleNodeHandler(dict, old=old, new=new, contacted=contacted): + """ called when we get a pong from the old node """ + self.table.insertNode(old, True) + self.insertNode(new, contacted) + l = self.pingcache.get(old.id, []) + l.sort(cmp) + for node in l: + self.insertNode(node[0], node[1]) + try: + del(self.pingcache[old.id]) + except KeyError: + pass + try: + df = old.ping(self.node.id) + except krpc.KRPCSelfNodeError: + pass + df.addCallbacks(_notStaleNodeHandler, _staleNodeHandler) + + def sendPing(self, node, callback=None): + """ + ping a node + """ + try: + df = node.ping(self.node.id) + except krpc.KRPCSelfNodeError: + pass + else: + ## these are the callbacks we use when we issue a PING + def _pongHandler(dict, node=node, table=self.table, callback=callback): + _krpc_sender = dict['_krpc_sender'] + dict = dict['rsp'] + sender = {'id' : dict['id']} + sender['host'] = _krpc_sender[0] + sender['port'] = _krpc_sender[1] + n = self.Node().initWithDict(sender) + table.insertNode(n) + if callback: + callback() + def _defaultPong(err, node=node, table=self.table, callback=callback): + if callback: + callback() + + df.addCallbacks(_pongHandler,_defaultPong) + + def findCloseNodes(self, callback=lambda a: a, auto=False): + """ + This does a findNode on the ID one away from our own. + This will allow us to populate our table with nodes on our network closest to our own. + This is called as soon as we start up with an empty table + """ + if not self.config['pause']: + id = self.node.id[:-1] + chr((ord(self.node.id[-1]) + 1) % 256) + self.findNode(id, callback) + if auto: + if not self.config['pause']: + self.refreshTable() + self.rawserver.external_add_task(self.findCloseNodes, randrange(int(const.FIND_CLOSE_INTERVAL *0.9), + int(const.FIND_CLOSE_INTERVAL *1.1)), (lambda a: True, True)) + + def refreshTable(self, force=0): + """ + force=1 will refresh table regardless of last bucket access time + """ + def callback(nodes): + pass + + refresh = [bucket for bucket in self.table.buckets if force or (len(bucket.l) < K) or len(filter(lambda a: a.invalid, bucket.l)) or (time() - bucket.lastAccessed > const.BUCKET_STALENESS)] + for bucket in refresh: + id = newIDInRange(bucket.min, bucket.max) + self.findNode(id, callback) + + def stats(self): + """ + Returns (num_contacts, num_nodes) + num_contacts: number contacts in our routing table + num_nodes: number of nodes estimated in the entire dht + """ + num_contacts = reduce(lambda a, b: a + len(b.l), self.table.buckets, 0) + num_nodes = const.K * (2**(len(self.table.buckets) - 1)) + return {'num_contacts':num_contacts, 'num_nodes':num_nodes} + + def krpc_ping(self, id, _krpc_sender): + sender = {'id' : id} + sender['host'] = _krpc_sender[0] + sender['port'] = _krpc_sender[1] + n = self.Node().initWithDict(sender) + self.insertNode(n, contacted=0) + return {"id" : self.node.id} + + def krpc_find_node(self, target, id, _krpc_sender): + nodes = self.table.findNodes(target, invalid=False) + nodes = map(lambda node: node.senderDict(), nodes) + sender = {'id' : id} + sender['host'] = _krpc_sender[0] + sender['port'] = _krpc_sender[1] + n = self.Node().initWithDict(sender) + self.insertNode(n, contacted=0) + return {"nodes" : packNodes(nodes), "id" : self.node.id} + + +## This class provides read-only access to the DHT, valueForKey +## you probably want to use this mixin and provide your own write methods +class KhashmirRead(KhashmirBase): + _Node = KNodeRead + def retrieveValues(self, key): + try: + l = self.store[key] + except KeyError: + l = [] + return l + ## also async + def valueForKey(self, key, callback, searchlocal = 1): + """ returns the values found for key in global table + callback will be called with a list of values for each peer that returns unique values + final callback will be an empty list - probably should change to 'more coming' arg + """ + nodes = self.table.findNodes(key) + + # get locals + if searchlocal: + l = self.retrieveValues(key) + if len(l) > 0: + self.rawserver.external_add_task(callback, 0, (l,)) + else: + l = [] + + # create our search state + state = GetValue(self, key, callback, self.rawserver.add_task) + self.rawserver.external_add_task(state.goWithNodes, 0, (nodes, l)) + + def krpc_find_value(self, key, id, _krpc_sender): + sender = {'id' : id} + sender['host'] = _krpc_sender[0] + sender['port'] = _krpc_sender[1] + n = self.Node().initWithDict(sender) + self.insertNode(n, contacted=0) + + l = self.retrieveValues(key) + if len(l) > 0: + return {'values' : l, "id": self.node.id} + else: + nodes = self.table.findNodes(key, invalid=False) + nodes = map(lambda node: node.senderDict(), nodes) + return {'nodes' : packNodes(nodes), "id": self.node.id} + +### provides a generic write method, you probably don't want to deploy something that allows +### arbitrary value storage +class KhashmirWrite(KhashmirRead): + _Node = KNodeWrite + ## async, callback indicates nodes we got a response from (but no guarantee they didn't drop it on the floor) + def storeValueForKey(self, key, value, callback=None): + """ stores the value for key in the global table, returns immediately, no status + in this implementation, peers respond but don't indicate status to storing values + a key can have many values + """ + def _storeValueForKey(nodes, key=key, value=value, response=callback , table=self.table): + if not response: + # default callback + def _storedValueHandler(sender): + pass + response=_storedValueHandler + action = StoreValue(self, key, value, response, self.rawserver.add_task) + self.rawserver.external_add_task(action.goWithNodes, 0, (nodes,)) + + # this call is asynch + self.findNode(key, _storeValueForKey) + + def krpc_store_value(self, key, value, id, _krpc_sender): + t = "%0.6f" % time() + self.store[key] = value + sender = {'id' : id} + sender['host'] = _krpc_sender[0] + sender['port'] = _krpc_sender[1] + n = self.Node().initWithDict(sender) + self.insertNode(n, contacted=0) + return {"id" : self.node.id} + +# the whole shebang, for testing +class Khashmir(KhashmirWrite): + _Node = KNodeWrite diff --git a/khashmir/knet.py b/khashmir/knet.py new file mode 100755 index 0000000..3baf1e9 --- /dev/null +++ b/khashmir/knet.py @@ -0,0 +1,76 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# +# knet.py +# create a network of khashmir nodes +# usage: knet.py + +from khashmir import Khashmir +from random import randrange +import sys, os + +class Network: + def __init__(self, size=0, startport=5555, localip='127.0.0.1'): + self.num = size + self.startport = startport + self.localip = localip + + def _done(self, val): + self.done = 1 + + def setUp(self): + self.kfiles() + self.l = [] + for i in range(self.num): + self.l.append(Khashmir('', self.startport + i, '/tmp/kh%s.db' % (self.startport + i))) + reactor.iterate() + reactor.iterate() + + for i in self.l: + i.addContact(self.localip, self.l[randrange(0,self.num)].port) + i.addContact(self.localip, self.l[randrange(0,self.num)].port) + i.addContact(self.localip, self.l[randrange(0,self.num)].port) + reactor.iterate() + reactor.iterate() + reactor.iterate() + + for i in self.l: + self.done = 0 + i.findCloseNodes(self._done) + while not self.done: + reactor.iterate() + for i in self.l: + self.done = 0 + i.findCloseNodes(self._done) + while not self.done: + reactor.iterate() + + def tearDown(self): + for i in self.l: + i.listenport.stopListening() + self.kfiles() + + def kfiles(self): + for i in range(self.startport, self.startport+self.num): + try: + os.unlink('/tmp/kh%s.db' % i) + except: + pass + + reactor.iterate() + +if __name__ == "__main__": + n = Network(int(sys.argv[1]), int(sys.argv[2]), sys.argv[3]) + n.setUp() + try: + reactor.run() + finally: + n.tearDown() diff --git a/khashmir/knode.py b/khashmir/knode.py new file mode 100755 index 0000000..a86a384 --- /dev/null +++ b/khashmir/knode.py @@ -0,0 +1,82 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from node import Node +from BitTorrent.defer import Deferred +from const import NULL_ID +from krpc import KRPCProtocolError + +class IDChecker: + def __init__(self, id): + self.id = id + +class KNodeBase(Node): + def __init__(self, cfa): + Node.__init__(self) + self.cfa = cfa + + def conn(self): + return self.cfa((self.host, self.port)) + + def checkSender(self, dict): + try: + senderid = dict['rsp']['id'] + except KeyError: + raise KRPCProtocolError, "No peer id in response." + else: + if self.id != NULL_ID and senderid != self.id: + self.table.table.invalidateNode(self) + else: + if self.id == NULL_ID: + self.id = senderid + self.table.insertNode(self, contacted=1) + return dict + + def errBack(self, err): + self.table.table.nodeFailed(self) + return err + + def ping(self, id): + df = self.conn().sendRequest('ping', {"id":id}) + self.conn().pinging = True + def endping(x): + self.conn().pinging = False + return x + df.addCallbacks(endping, endping) + df.addCallbacks(self.checkSender, self.errBack) + return df + + def findNode(self, target, id): + df = self.conn().sendRequest('find_node', {"target" : target, "id": id}) + df.addErrback(self.errBack) + df.addCallback(self.checkSender) + return df + + def inPing(self): + return self.conn().pinging + +class KNodeRead(KNodeBase): + def findValue(self, key, id): + df = self.conn().sendRequest('find_value', {"key" : key, "id" : id}) + df.addErrback(self.errBack) + df.addCallback(self.checkSender) + return df + +class KNodeWrite(KNodeRead): + def storeValue(self, key, value, id): + df = self.conn().sendRequest('store_value', {"key" : key, "value" : value, "id": id}) + df.addErrback(self.errBack) + df.addCallback(self.checkSender) + return df + def storeValues(self, key, value, id): + df = self.conn().sendRequest('store_values', {"key" : key, "values" : value, "id": id}) + df.addErrback(self.errBack) + df.addCallback(self.checkSender) + return df diff --git a/khashmir/krpc.py b/khashmir/krpc.py new file mode 100755 index 0000000..3a5ffe0 --- /dev/null +++ b/khashmir/krpc.py @@ -0,0 +1,243 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from BitTorrent.defer import Deferred +from BitTorrent.bencode import bencode, bdecode +import socket +from BitTorrent.RawServer_magic import Handler +from BitTorrent.platform import bttime +import time +from math import log10 + +import sys +from traceback import print_exc + +from khash import distance +from cache import Cache +from KRateLimiter import KRateLimiter +from hammerlock import Hammerlock + +from const import * + +# commands +TID = 't' +REQ = 'q' +RSP = 'r' +TYP = 'y' +ARG = 'a' +ERR = 'e' + +class KRPCFailSilently(Exception): + pass + +class KRPCProtocolError(Exception): + pass + +class KRPCServerError(Exception): + pass + +class KRPCSelfNodeError(Exception): + pass + +class hostbroker(Handler): + def __init__(self, server, addr, transport, call_later, max_ul_rate, config, rlcount): + self.server = server + self.addr = addr + self.transport = transport + self.rltransport = KRateLimiter(transport, max_ul_rate, call_later, rlcount, config['max_rate_period']) + self.call_later = call_later + self.connections = Cache(touch_on_access=True) + self.hammerlock = Hammerlock(100, call_later) + self.expire_connections(loop=True) + self.config = config + if not self.config.has_key('pause'): + self.config['pause'] = False + + def expire_connections(self, loop=False): + self.connections.expire(bttime() - KRPC_CONNECTION_CACHE_TIME) + if loop: + self.call_later(self.expire_connections, KRPC_CONNECTION_CACHE_TIME, (True,)) + + def data_came_in(self, addr, datagram): + #if addr != self.addr: + if not self.config['pause'] and self.hammerlock.check(addr): + c = self.connectionForAddr(addr) + c.datagramReceived(datagram, addr) + + def connection_lost(self, socket): + ## this is like, bad + print ">>> connection lost!", socket + + def connectionForAddr(self, addr): + if addr == self.addr: + raise KRPCSelfNodeError() + if not self.connections.has_key(addr): + conn = KRPC(addr, self.server, self.transport, self.rltransport, self.call_later) + self.connections[addr] = conn + else: + conn = self.connections[addr] + return conn + + +## connection +class KRPC: + noisy = 0 + def __init__(self, addr, server, transport, rltransport, call_later): + self.call_later = call_later + self.transport = transport + self.rltransport = rltransport + self.factory = server + self.addr = addr + self.tids = {} + self.mtid = 0 + self.pinging = False + + def sendErr(self, addr, tid, msg): + ## send error + out = bencode({TID:tid, TYP:ERR, ERR :msg}) + olen = len(out) + self.rltransport.sendto(out, 0, addr) + return olen + + def datagramReceived(self, str, addr): + # bdecode + try: + msg = bdecode(str) + except Exception, e: + if self.noisy: + print "response decode error: " + `e`, `str` + else: + #if self.noisy: + # print msg + # look at msg type + if msg[TYP] == REQ: + ilen = len(str) + # if request + # tell factory to handle + f = getattr(self.factory ,"krpc_" + msg[REQ], None) + msg[ARG]['_krpc_sender'] = self.addr + if f and callable(f): + try: + ret = apply(f, (), msg[ARG]) + except KRPCFailSilently: + pass + except KRPCServerError, e: + olen = self.sendErr(addr, msg[TID], "Server Error: %s" % e.args[0]) + except KRPCProtocolError, e: + olen = self.sendErr(addr, msg[TID], "Protocol Error: %s" % e.args[0]) + except Exception, e: + print_exc(20) + olen = self.sendErr(addr, msg[TID], "Server Error") + else: + if ret: + # make response + out = bencode({TID : msg[TID], TYP : RSP, RSP : ret}) + else: + out = bencode({TID : msg[TID], TYP : RSP, RSP : {}}) + # send response + olen = len(out) + self.rltransport.sendto(out, 0, addr) + + else: + if self.noisy: + #print "don't know about method %s" % msg[REQ] + pass + # unknown method + out = bencode({TID:msg[TID], TYP:ERR, ERR : KRPC_ERROR_METHOD_UNKNOWN}) + olen = len(out) + self.rltransport.sendto(out, 0, addr) + if self.noisy: + try: + ndist = 10 * log10(2**160 * 1.0 / distance(self.factory.node.id, msg[ARG]['id'])) + ndist = int(ndist) + except OverflowError: + ndist = 999 + + h = None + if msg[ARG].has_key('target'): + h = msg[ARG]['target'] + elif msg[ARG].has_key('info_hash'): + h = msg[ARG]['info_hash'] + else: + tdist = '-' + + if h != None: + try: + tdist = 10 * log10(2**160 * 1.0 / distance(self.factory.node.id, h)) + tdist = int(tdist) + except OverflowError: + tdist = 999 + + t = time.localtime() + t = "%2d-%2d-%2d %2d:%2d:%2d" % (t[0], t[1], t[2], t[3], t[4], t[5]) + print "%s %s %s >>> %s - %s %s %s - %s %s" % (t, + msg[ARG]['id'].encode('base64')[:4], + addr, + self.factory.node.port, + ilen, + msg[REQ], + olen, + ndist, + tdist) + elif msg[TYP] == RSP: + # if response + # lookup tid + if self.tids.has_key(msg[TID]): + df = self.tids[msg[TID]] + # callback + del(self.tids[msg[TID]]) + df.callback({'rsp' : msg[RSP], '_krpc_sender': addr}) + else: + # no tid, this transaction timed out already... + pass + + elif msg[TYP] == ERR: + # if error + # lookup tid + if self.tids.has_key(msg[TID]): + df = self.tids[msg[TID]] + # callback + df.errback(msg[ERR]) + del(self.tids[msg[TID]]) + else: + # day late and dollar short + pass + else: + print "unknown message type " + `msg` + # unknown message type + df = self.tids[msg[TID]] + # callback + df.errback(KRPC_ERROR_RECEIVED_UNKNOWN) + del(self.tids[msg[TID]]) + + def sendRequest(self, method, args): + # make message + # send it + msg = {TID : chr(self.mtid), TYP : REQ, REQ : method, ARG : args} + self.mtid = (self.mtid + 1) % 256 + s = bencode(msg) + d = Deferred() + self.tids[msg[TID]] = d + self.call_later(self.timeOut, KRPC_TIMEOUT, (msg[TID],)) + self.call_later(self._send, 0, (s, d)) + return d + + def timeOut(self, id): + if self.tids.has_key(id): + df = self.tids[id] + del(self.tids[id]) + df.errback(KRPC_ERROR_TIMEOUT) + + def _send(self, s, d): + try: + self.transport.sendto(s, 0, self.addr) + except socket.error: + d.errback(KRPC_SOCKET_ERROR) + diff --git a/khashmir/kstore.py b/khashmir/kstore.py new file mode 100755 index 0000000..5c01200 --- /dev/null +++ b/khashmir/kstore.py @@ -0,0 +1,119 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +try: + from random import sample +except ImportError: + from random import choice + def sample(l, n): + if len(l) <= n: + return l + d = {} + while len(d) < n: + d[choice(l)] = 1 + return d.keys() + +from BitTorrent.platform import bttime as time + +class KItem: + def __init__(self, key, value): + self.t = time() + self.k = key + self.v = value + def __cmp__(self, a): + # same value = same item, only used to keep dupes out of db + if self.v == a.v: + return 0 + + # compare by time + if self.t < a.t: + return -1 + elif self.t > a.t: + return 1 + else: + return 0 + + def __hash__(self): + return self.v.__hash__() + + def __repr__(self): + return `(self.k, self.v, time() - self.t)` + +## in memory data store for distributed tracker +## keeps a list of values per key in dictionary +## keeps expiration for each key in a queue +## can efficiently expire all values older than a given time +## can insert one val at a time, or a list: ks['key'] = 'value' or ks['key'] = ['v1', 'v2', 'v3'] +class KStore: + def __init__(self): + self.d = {} + self.q = [] + + def __getitem__(self, key): + return [x.v for x in self.d[key]] + + def __setitem__(self, key, value): + if type(value) == type([]): + [self.__setitem__(key, v) for v in value] + return + x = KItem(key, value) + try: + l = self.d[key] + except KeyError: + self.d[key] = [x] + else: + # this is slow + try: + i = l.index(x) + del(l[i]) + except ValueError: + pass + l.insert(0, x) + self.q.append(x) + + def __delitem__(self, key): + del(self.d[key]) + + def __len__(self): + return len(self.d) + + def keys(self): + return self.d.keys() + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def expire(self, t): + #.expire values inserted prior to t + try: + while self.q[0].t <= t: + x = self.q.pop(0) + try: + l = self.d[x.k] + try: + while l[-1].t <= t: + l.pop() + except IndexError: + del(self.d[x.k]) + except KeyError: + pass + except IndexError: + pass + + def sample(self, key, n): + # returns n random values of key, or all values if less than n + try: + l = [x.v for x in sample(self.d[key], n)] + except ValueError: + l = [x.v for x in self.d[key]] + return l diff --git a/khashmir/ktable.py b/khashmir/ktable.py new file mode 100755 index 0000000..0921300 --- /dev/null +++ b/khashmir/ktable.py @@ -0,0 +1,340 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from BitTorrent.platform import bttime as time +from bisect import * +from types import * + +import khash as hash +import const +from const import K, HASH_LENGTH, NULL_ID, MAX_FAILURES, MIN_PING_INTERVAL +from node import Node + +class KTable: + """local routing table for a kademlia like distributed hash table""" + def __init__(self, node): + # this is the root node, a.k.a. US! + self.node = node + self.buckets = [KBucket([], 0L, 2L**HASH_LENGTH)] + self.insertNode(node) + + def _bucketIndexForInt(self, num): + """the index of the bucket that should hold int""" + return bisect_left(self.buckets, num) + + def bucketForInt(self, num): + return self.buckets[self._bucketIndexForInt(num)] + + def findNodes(self, id, invalid=True): + """ + return K nodes in our own local table closest to the ID. + """ + + if isinstance(id, str): + num = hash.intify(id) + elif isinstance(id, Node): + num = id.num + elif isinstance(id, int) or isinstance(id, long): + num = id + else: + raise TypeError, "findNodes requires an int, string, or Node" + + nodes = [] + i = self._bucketIndexForInt(num) + + # if this node is already in our table then return it + try: + node = self.buckets[i].getNodeWithInt(num) + except ValueError: + pass + else: + return [node] + + # don't have the node, get the K closest nodes + nodes = nodes + self.buckets[i].l + if not invalid: + nodes = [a for a in nodes if not a.invalid] + if len(nodes) < K: + # need more nodes + min = i - 1 + max = i + 1 + while len(nodes) < K and (min >= 0 or max < len(self.buckets)): + #ASw: note that this requires K be even + if min >= 0: + nodes = nodes + self.buckets[min].l + if max < len(self.buckets): + nodes = nodes + self.buckets[max].l + min = min - 1 + max = max + 1 + if not invalid: + nodes = [a for a in nodes if not a.invalid] + + nodes.sort(lambda a, b, num=num: cmp(num ^ a.num, num ^ b.num)) + return nodes[:K] + + def _splitBucket(self, a): + diff = (a.max - a.min) / 2 + b = KBucket([], a.max - diff, a.max) + self.buckets.insert(self.buckets.index(a.min) + 1, b) + a.max = a.max - diff + # transfer nodes to new bucket + for anode in a.l[:]: + if anode.num >= a.max: + a.removeNode(anode) + b.addNode(anode) + + def replaceStaleNode(self, stale, new): + """this is used by clients to replace a node returned by insertNode after + it fails to respond to a Pong message""" + i = self._bucketIndexForInt(stale.num) + + if self.buckets[i].hasNode(stale): + self.buckets[i].removeNode(stale) + if new and self.buckets[i].hasNode(new): + self.buckets[i].seenNode(new) + elif new: + self.buckets[i].addNode(new) + + return + + def insertNode(self, node, contacted=1, nocheck=False): + """ + this insert the node, returning None if successful, returns the oldest node in the bucket if it's full + the caller responsible for pinging the returned node and calling replaceStaleNode if it is found to be stale!! + contacted means that yes, we contacted THEM and we know the node is reachable + """ + if node.id == NULL_ID or node.id == self.node.id: + return + + if contacted: + node.updateLastSeen() + + # get the bucket for this node + i = self._bucketIndexForInt(node.num) + # check to see if node is in the bucket already + if self.buckets[i].hasNode(node): + it = self.buckets[i].l.index(node.num) + xnode = self.buckets[i].l[it] + if contacted: + node.age = xnode.age + self.buckets[i].seenNode(node) + elif xnode.lastSeen != 0 and xnode.port == node.port and xnode.host == node.host: + xnode.updateLastSeen() + return + + # we don't have this node, check to see if the bucket is full + if not self.buckets[i].bucketFull(): + # no, append this node and return + self.buckets[i].addNode(node) + return + + # full bucket, check to see if any nodes are invalid + t = time() + def ls(a, b): + if a.lastSeen > b.lastSeen: + return 1 + elif b.lastSeen > a.lastSeen: + return -1 + return 0 + + invalid = [x for x in self.buckets[i].invalid.values() if x.invalid] + if len(invalid) and not nocheck: + invalid.sort(ls) + while invalid and not self.buckets[i].hasNode(invalid[0]): + del(self.buckets[i].invalid[invalid[0].num]) + invalid = invalid[1:] + if invalid and (invalid[0].lastSeen == 0 and invalid[0].fails < MAX_FAILURES): + return invalid[0] + elif invalid: + self.replaceStaleNode(invalid[0], node) + return + + stale = [n for n in self.buckets[i].l if (t - n.lastSeen) > MIN_PING_INTERVAL] + if len(stale) and not nocheck: + stale.sort(ls) + return stale[0] + + # bucket is full and all nodes are valid, check to see if self.node is in the bucket + if not (self.buckets[i].min <= self.node < self.buckets[i].max): + return + + # this bucket is full and contains our node, split the bucket + if len(self.buckets) >= HASH_LENGTH: + # our table is FULL, this is really unlikely + print "Hash Table is FULL! Increase K!" + return + + self._splitBucket(self.buckets[i]) + + # now that the bucket is split and balanced, try to insert the node again + return self.insertNode(node, contacted) + + def justSeenNode(self, id): + """call this any time you get a message from a node + it will update it in the table if it's there """ + try: + n = self.findNodes(id)[0] + except IndexError: + return None + else: + tstamp = n.lastSeen + n.updateLastSeen() + bucket = self.bucketForInt(n.num) + bucket.seenNode(n) + return tstamp + + def invalidateNode(self, n): + """ + forget about node n - use when you know that node is invalid + """ + n.invalid = True + self.bucket = self.bucketForInt(n.num) + self.bucket.invalidateNode(n) + + def nodeFailed(self, node): + """ call this when a node fails to respond to a message, to invalidate that node """ + try: + n = self.findNodes(node.num)[0] + except IndexError: + return None + else: + if n.msgFailed() >= const.MAX_FAILURES: + self.invalidateNode(n) + + def numPeers(self): + """ estimated number of connectable nodes in global table """ + return 8 * (2 ** (len(self.buckets) - 1)) + +class KBucket: + __slots__ = ('min', 'max', 'lastAccessed') + def __init__(self, contents, min, max): + self.l = contents + self.index = {} + self.invalid = {} + self.min = min + self.max = max + self.lastAccessed = time() + + def touch(self): + self.lastAccessed = time() + + def lacmp(self, a, b): + if a.lastSeen > b.lastSeen: + return 1 + elif b.lastSeen > a.lastSeen: + return -1 + return 0 + + def sort(self): + self.l.sort(self.lacmp) + + def getNodeWithInt(self, num): + try: + node = self.index[num] + except KeyError: + raise ValueError + return node + + def addNode(self, node): + if len(self.l) >= K: + return + if self.index.has_key(node.num): + return + self.l.append(node) + self.index[node.num] = node + self.touch() + + def removeNode(self, node): + assert self.index.has_key(node.num) + del(self.l[self.l.index(node.num)]) + del(self.index[node.num]) + try: + del(self.invalid[node.num]) + except KeyError: + pass + self.touch() + + def invalidateNode(self, node): + self.invalid[node.num] = node + + def seenNode(self, node): + try: + del(self.invalid[node.num]) + except KeyError: + pass + it = self.l.index(node.num) + del(self.l[it]) + self.l.append(node) + self.index[node.num] = node + + def hasNode(self, node): + return self.index.has_key(node.num) + + def bucketFull(self): + return len(self.l) >= K + + def __repr__(self): + return "" % (len(self.l), self.min, self.max) + + ## Comparators + # necessary for bisecting list of buckets with a hash expressed as an integer or a distance + # compares integer or node object with the bucket's range + def __lt__(self, a): + if isinstance(a, Node): a = a.num + return self.max <= a + def __le__(self, a): + if isinstance(a, Node): a = a.num + return self.min < a + def __gt__(self, a): + if isinstance(a, Node): a = a.num + return self.min > a + def __ge__(self, a): + if isinstance(a, Node): a = a.num + return self.max >= a + def __eq__(self, a): + if isinstance(a, Node): a = a.num + return self.min <= a and self.max > a + def __ne__(self, a): + if isinstance(a, Node): a = a.num + return self.min >= a or self.max < a + + +### UNIT TESTS ### +import unittest + +class TestKTable(unittest.TestCase): + def setUp(self): + self.a = Node().init(hash.newID(), 'localhost', 2002) + self.t = KTable(self.a) + + def testAddNode(self): + self.b = Node().init(hash.newID(), 'localhost', 2003) + self.t.insertNode(self.b) + self.assertEqual(len(self.t.buckets[0].l), 1) + self.assertEqual(self.t.buckets[0].l[0], self.b) + + def testRemove(self): + self.testAddNode() + self.t.invalidateNode(self.b) + self.assertEqual(len(self.t.buckets[0].l), 0) + + def testFail(self): + self.testAddNode() + for i in range(const.MAX_FAILURES - 1): + self.t.nodeFailed(self.b) + self.assertEqual(len(self.t.buckets[0].l), 1) + self.assertEqual(self.t.buckets[0].l[0], self.b) + + self.t.nodeFailed(self.b) + self.assertEqual(len(self.t.buckets[0].l), 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/khashmir/node.py b/khashmir/node.py new file mode 100755 index 0000000..65a48ef --- /dev/null +++ b/khashmir/node.py @@ -0,0 +1,95 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +import khash +from BitTorrent.platform import bttime as time +from types import * + +class Node: + """encapsulate contact info""" + def __init__(self): + self.fails = 0 + self.lastSeen = 0 + self.invalid = True + self.id = self.host = self.port = '' + self.age = time() + + def init(self, id, host, port): + self.id = id + self.num = khash.intify(id) + self.host = host + self.port = port + self._senderDict = {'id': self.id, 'port' : self.port, 'host' : self.host} + return self + + def initWithDict(self, dict): + self._senderDict = dict + self.id = dict['id'] + self.num = khash.intify(self.id) + self.port = dict['port'] + self.host = dict['host'] + self.age = dict.get('age', self.age) + return self + + def updateLastSeen(self): + self.lastSeen = time() + self.fails = 0 + self.invalid = False + + def msgFailed(self): + self.fails = self.fails + 1 + return self.fails + + def senderDict(self): + return self._senderDict + + def __hash__(self): + return self.id.__hash__() + + def __repr__(self): + return ">node <%s> %s<" % (self.id.encode('base64')[:4], (self.host, self.port)) + + ## these comparators let us bisect/index a list full of nodes with either a node or an int/long + def __lt__(self, a): + if type(a) == InstanceType: + a = a.num + return self.num < a + def __le__(self, a): + if type(a) == InstanceType: + a = a.num + return self.num <= a + def __gt__(self, a): + if type(a) == InstanceType: + a = a.num + return self.num > a + def __ge__(self, a): + if type(a) == InstanceType: + a = a.num + return self.num >= a + def __eq__(self, a): + if type(a) == InstanceType: + a = a.num + return self.num == a + def __ne__(self, a): + if type(a) == InstanceType: + a = a.num + return self.num != a + + +import unittest + +class TestNode(unittest.TestCase): + def setUp(self): + self.node = Node().init(khash.newID(), 'localhost', 2002) + def testUpdateLastSeen(self): + t = self.node.lastSeen + self.node.updateLastSeen() + assert t < self.node.lastSeen + diff --git a/khashmir/setup.py b/khashmir/setup.py new file mode 100755 index 0000000..a9e680a --- /dev/null +++ b/khashmir/setup.py @@ -0,0 +1,70 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +#!/usr/bin/env python + +import os +import sys + +try: + import distutils.core + import distutils.command.build_ext +except ImportError: + raise SystemExit, """\ +You don't have the python development modules installed. + +If you have Debian you can install it by running + apt-get install python-dev + +If you have RedHat and know how to install this from an RPM please +email us so we can put instructions here. +""" + +try: + import twisted +except ImportError: + raise SystemExit, """\ +You don't have Twisted installed. + +Twisted can be downloaded from + http://twistedmatrix.com/products/download + +Anything later that version 1.0.3 should work +""" + +try: + import sqlite +except ImportError: + raise SystemExit, """\ +You don't have PySQLite installed. + +PySQLite can be downloaded from + http://sourceforge.net/project/showfiles.php?group_id=54058&release_id=139482 +""" + +setup_args = { + 'name': 'khashmir', + 'author': 'Andrew Loewenstern', + 'author_email': 'burris@users.sourceforge.net', + 'licence': 'MIT', + 'package_dir': {'khashmir': '.'}, + 'packages': [ + 'khashmir', + ], +} + +if hasattr(distutils.dist.DistributionMetadata, 'get_keywords'): + setup_args['keywords'] = "internet tcp p2p" + +if hasattr(distutils.dist.DistributionMetadata, 'get_platforms'): + setup_args['platforms'] = "win32 posix" + +if __name__ == '__main__': + apply(distutils.core.setup, (), setup_args) diff --git a/khashmir/test.py b/khashmir/test.py new file mode 100755 index 0000000..a6c8a9c --- /dev/null +++ b/khashmir/test.py @@ -0,0 +1,21 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +import unittest + +import ktable, khashmir +import khash, node, knode +import actions +import test_krpc +import test_khashmir +import kstore + +tests = unittest.defaultTestLoader.loadTestsFromNames(['kstore', 'khash', 'node', 'knode', 'actions', 'ktable', 'test_krpc', 'test_khashmir']) +result = unittest.TextTestRunner().run(tests) diff --git a/khashmir/test_khashmir.py b/khashmir/test_khashmir.py new file mode 100755 index 0000000..e22028e --- /dev/null +++ b/khashmir/test_khashmir.py @@ -0,0 +1,166 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from unittest import * + +from BitTorrent import RawServer_magic + +from khashmir import * +import khash +from copy import copy + +from random import randrange +from krpc import KRPC + +KRPC.noisy=0 +import os + +if __name__ =="__main__": + tests = defaultTestLoader.loadTestsFromNames([sys.argv[0][:-3]]) + result = TextTestRunner().run(tests) + +class MultiTest(TestCase): + num = 25 + def _done(self, val): + self.done = 1 + + def setUp(self): + self.l = [] + self.startport = 10088 + d = dict([(x[0],x[1]) for x in common_options + rare_options]) + self.r = RawServer(Event(), d) + for i in range(self.num): + self.l.append(Khashmir('127.0.0.1', self.startport + i, '/tmp/%s.test' % (self.startport + i), self.r)) + self.r.listen_once(1) + self.r.listen_once(1) + + for i in self.l: + try: + i.addContact('127.0.0.1', self.l[randrange(0,self.num)].port) + except: + pass + try: + i.addContact('127.0.0.1', self.l[randrange(0,self.num)].port) + except: + pass + try: + i.addContact('127.0.0.1', self.l[randrange(0,self.num)].port) + except: + pass + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + + for i in self.l: + self.done = 0 + i.findCloseNodes(self._done) + while not self.done: + self.r.listen_once(1) + for i in self.l: + self.done = 0 + i.findCloseNodes(self._done) + while not self.done: + self.r.listen_once(1) + + def tearDown(self): + for i in self.l: + self.r.stop_listening_udp(i.socket) + i.socket.close() + + self.r.listen_once(1) + + def testStoreRetrieve(self): + for i in range(10): + K = khash.newID() + V = khash.newID() + + for a in range(3): + self.done = 0 + def _scb(val): + self.done = 1 + self.l[randrange(0, self.num)].storeValueForKey(K, V, _scb) + while not self.done: + self.r.listen_once(1) + + + def _rcb(val): + if not val: + self.done = 1 + self.assertEqual(self.got, 1) + elif V in val: + self.got = 1 + for x in range(3): + self.got = 0 + self.done = 0 + self.l[randrange(0, self.num)].valueForKey(K, _rcb) + while not self.done: + self.r.listen_once(1) + +class AASimpleTests(TestCase): + def setUp(self): + d = dict([(x[0],x[1]) for x in common_options + rare_options]) + self.r = RawServer(Event(), d) + self.a = Khashmir('127.0.0.1', 4044, '/tmp/a.test', self.r) + self.b = Khashmir('127.0.0.1', 4045, '/tmp/b.test', self.r) + + def tearDown(self): + self.r.stop_listening_udp(self.a.socket) + self.r.stop_listening_udp(self.b.socket) + self.a.socket.close() + self.b.socket.close() + + def addContacts(self): + self.a.addContact('127.0.0.1', 4045) + self.r.listen_once(1) + self.r.listen_once(1) + + def testStoreRetrieve(self): + self.addContacts() + self.got = 0 + self.a.storeValueForKey(sha('foo').digest(), 'foobar') + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + self.a.valueForKey(sha('foo').digest(), self._cb) + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + + def _cb(self, val): + if not val: + self.assertEqual(self.got, 1) + elif 'foobar' in val: + self.got = 1 + + def testAddContact(self): + self.assertEqual(len(self.a.table.buckets), 1) + self.assertEqual(len(self.a.table.buckets[0].l), 0) + + self.assertEqual(len(self.b.table.buckets), 1) + self.assertEqual(len(self.b.table.buckets[0].l), 0) + + self.addContacts() + + self.assertEqual(len(self.a.table.buckets), 1) + self.assertEqual(len(self.a.table.buckets[0].l), 1) + self.assertEqual(len(self.b.table.buckets), 1) + self.assertEqual(len(self.b.table.buckets[0].l), 1) + + + + + + + + diff --git a/khashmir/test_krpc.py b/khashmir/test_krpc.py new file mode 100755 index 0000000..2ba4343 --- /dev/null +++ b/khashmir/test_krpc.py @@ -0,0 +1,161 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from unittest import * +from krpc import * +from BitTorrent.defaultargs import common_options, rare_options +from threading import Event +from node import Node + +KRPC.noisy = 0 + +import sys + +if __name__ =="__main__": + tests = defaultTestLoader.loadTestsFromNames([sys.argv[0][:-3]]) + result = TextTestRunner().run(tests) + + +def connectionForAddr(host, port): + return host + + +class Receiver(object): + protocol = KRPC + def __init__(self, addr): + self.buf = [] + self.node = Node().init('0'*20, addr[0], addr[1]) + def krpc_store(self, msg, _krpc_sender): + self.buf += [msg] + def krpc_echo(self, msg, _krpc_sender): + return msg + +class KRPCTests(TestCase): + def setUp(self): + self.noisy = 0 + d = dict([(x[0],x[1]) for x in common_options + rare_options]) + self.r = RawServer(Event(), d) + + addr = ('127.0.0.1', 1180) + self.as = self.r.create_udpsocket(addr[1], addr[0], True) + self.af = Receiver(addr) + self.a = hostbroker(self.af, addr, self.as, self.r.add_task) + self.r.start_listening_udp(self.as, self.a) + + addr = ('127.0.0.1', 1181) + self.bs = self.r.create_udpsocket(addr[1], addr[0], True) + self.bf = Receiver(addr) + self.b = hostbroker(self.bf, addr, self.bs, self.r.add_task) + self.r.start_listening_udp(self.bs, self.b) + + def tearDown(self): + self.as.close() + self.bs.close() + + def testSimpleMessage(self): + self.noisy = 0 + self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('store', {'msg' : "This is a test."}) + self.r.listen_once(0.01) + self.assertEqual(self.bf.buf, ["This is a test."]) + + def testMessageBlast(self): + self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('store', {'msg' : "This is a test."}) + self.r.listen_once(0.01) + self.assertEqual(self.bf.buf, ["This is a test."]) + self.bf.buf = [] + + for i in range(100): + self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('store', {'msg' : "This is a test."}) + self.r.listen_once(0.01) + #self.bf.buf = [] + self.assertEqual(self.bf.buf, ["This is a test."] * 100) + + def testEcho(self): + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is a test.") + + def gotMsg(self, dict): + _krpc_sender = dict['_krpc_sender'] + msg = dict['rsp'] + self.msg = msg + + def testManyEcho(self): + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is a test.") + for i in xrange(100): + self.msg = None + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is a test.") + + def testMultiEcho(self): + self.noisy = 0 + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is a test.") + + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is another test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is another test.") + + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is yet another test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is yet another test.") + + def testEchoReset(self): + self.noisy = 0 + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is a test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is a test.") + + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is another test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is another test.") + + del(self.a.connections[('127.0.0.1', 1181)]) + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('echo', {'msg' : "This is yet another test."}) + df.addCallback(self.gotMsg) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.msg, "This is yet another test.") + + def testLotsofEchoReset(self): + for i in range(100): + self.testEchoReset() + + def testUnknownMeth(self): + self.noisy = 0 + df = self.a.connectionForAddr(('127.0.0.1', 1181)).sendRequest('blahblah', {'msg' : "This is a test."}) + df.addErrback(self.gotErr) + self.r.listen_once(0.01) + self.r.listen_once(0.01) + self.assertEqual(self.err, KRPC_ERROR_METHOD_UNKNOWN) + + def gotErr(self, err): + self.err = err + diff --git a/khashmir/test_kstore.py b/khashmir/test_kstore.py new file mode 100755 index 0000000..d2f2b15 --- /dev/null +++ b/khashmir/test_kstore.py @@ -0,0 +1,91 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +import unittest +from BitTorrent.platform import bttime +from time import sleep + +from kstore import KStore +if __name__ =="__main__": + tests = unittest.defaultTestLoader.loadTestsFromNames(['test_kstore']) + result = unittest.TextTestRunner().run(tests) + + +class BasicTests(unittest.TestCase): + def setUp(self): + self.k = KStore() + + def testNoKeys(self): + self.assertEqual(self.k.keys(), []) + + def testKey(self): + self.k['foo'] = 'bar' + self.assertEqual(self.k.keys(), ['foo']) + + def testKeys(self): + self.k['foo'] = 'bar' + self.k['wing'] = 'wang' + l = self.k.keys() + l.sort() + self.assertEqual(l, ['foo', 'wing']) + + def testInsert(self): + self.k['foo'] = 'bar' + self.assertEqual(self.k['foo'], ['bar']) + + def testInsertTwo(self): + self.k['foo'] = 'bar' + self.k['foo'] = 'bing' + l = self.k['foo'] + l.sort() + self.assertEqual(l, ['bar', 'bing']) + + def testExpire(self): + self.k['foo'] = 'bar' + self.k.expire(bttime() - 1) + l = self.k['foo'] + l.sort() + self.assertEqual(l, ['bar']) + self.k['foo'] = 'bing' + t = bttime() + self.k.expire(bttime() - 1) + l = self.k['foo'] + l.sort() + self.assertEqual(l, ['bar', 'bing']) + self.k['foo'] = 'ding' + self.k['foo'] = 'dang' + l = self.k['foo'] + l.sort() + self.assertEqual(l, ['bar', 'bing', 'dang', 'ding']) + self.k.expire(t) + l = self.k['foo'] + l.sort() + self.assertEqual(l, ['dang', 'ding']) + + def testDup(self): + self.k['foo'] = 'bar' + self.k['foo'] = 'bar' + self.assertEqual(self.k['foo'], ['bar']) + + def testSample(self): + for i in xrange(2): + self.k['foo'] = i + l = self.k.sample('foo', 5) + l.sort() + self.assertEqual(l, [0, 1]) + + for i in xrange(10): + for i in xrange(10): + self.k['bar'] = i + l = self.k.sample('bar', 5) + self.assertEqual(len(l), 5) + for i in xrange(len(l)): + self.assert_(l[i] not in l[i+1:]) + diff --git a/khashmir/unet.py b/khashmir/unet.py new file mode 100755 index 0000000..e163a3f --- /dev/null +++ b/khashmir/unet.py @@ -0,0 +1,84 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +# +# knet.py +# create a network of khashmir nodes +# usage: knet.py + +from utkhashmir import UTKhashmir +from BitTorrent.RawServer_magic import RawServer +from BitTorrent.defaultargs import common_options, rare_options +from random import randrange +from threading import Event +import sys, os + +from krpc import KRPC +KRPC.noisy = 1 + +class Network: + def __init__(self, size=0, startport=5555, localip='127.0.0.1'): + self.num = size + self.startport = startport + self.localip = localip + + def _done(self, val): + self.done = 1 + + def simpleSetUp(self): + #self.kfiles() + d = dict([(x[0],x[1]) for x in common_options + rare_options]) + self.r = RawServer(Event(), d) + self.l = [] + for i in range(self.num): + self.l.append(UTKhashmir('', self.startport + i, 'kh%s.db' % (self.startport + i), self.r)) + + for i in self.l: + i.addContact(self.localip, self.l[randrange(0,self.num)].port) + i.addContact(self.localip, self.l[randrange(0,self.num)].port) + i.addContact(self.localip, self.l[randrange(0,self.num)].port) + self.r.listen_once(1) + self.r.listen_once(1) + self.r.listen_once(1) + + for i in self.l: + self.done = 0 + i.findCloseNodes(self._done) + while not self.done: + self.r.listen_once(1) + for i in self.l: + self.done = 0 + i.findCloseNodes(self._done) + while not self.done: + self.r.listen_once(1) + + def tearDown(self): + for i in self.l: + i.rawserver.stop_listening_udp(i.socket) + i.socket.close() + #self.kfiles() + + def kfiles(self): + for i in range(self.startport, self.startport+self.num): + try: + os.unlink('kh%s.db' % i) + except: + pass + + self.r.listen_once(1) + +if __name__ == "__main__": + n = Network(int(sys.argv[1]), int(sys.argv[2])) + n.simpleSetUp() + print ">>> network ready" + try: + n.r.listen_forever() + finally: + n.tearDown() diff --git a/khashmir/util.py b/khashmir/util.py new file mode 100755 index 0000000..3bc456e --- /dev/null +++ b/khashmir/util.py @@ -0,0 +1,69 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from struct import pack, unpack + +def bucket_stats(l): + """given a list of khashmir instances, finds min, max, and average number of nodes in tables""" + max = avg = 0 + min = None + def count(buckets): + c = 0 + for bucket in buckets: + c = c + len(bucket.l) + return c + for node in l: + c = count(node.table.buckets) + if min == None: + min = c + elif c < min: + min = c + if c > max: + max = c + avg = avg + c + avg = avg / len(l) + return {'min':min, 'max':max, 'avg':avg} + +def compact_peer_info(ip, port): + return pack('!BBBBH', *([int(i) for i in ip.split('.')] + [port])) + +def packPeers(peers): + return map(lambda a: compact_peer_info(a[0], a[1]), peers) + +def reducePeers(peers): + return reduce(lambda a, b: a + b, peers, '') + +def unpackPeers(p): + peers = [] + if type(p) == type(''): + for x in xrange(0, len(p), 6): + ip = '.'.join([str(ord(i)) for i in p[x:x+4]]) + port = unpack('!H', p[x+4:x+6])[0] + peers.append((ip, port, None)) + else: + for x in p: + peers.append((x['ip'], x['port'], x.get('peer id'))) + return peers + + +def compact_node_info(id, ip, port): + return id + compact_peer_info(ip, port) + +def packNodes(nodes): + return ''.join([compact_node_info(x['id'], x['host'], x['port']) for x in nodes]) + +def unpackNodes(n): + nodes = [] + for x in xrange(0, len(n), 26): + id = n[x:x+20] + ip = '.'.join([str(ord(i)) for i in n[x+20:x+24]]) + port = unpack('!H', n[x+24:x+26])[0] + nodes.append({'id':id, 'host':ip, 'port': port}) + return nodes diff --git a/khashmir/utkhashmir.py b/khashmir/utkhashmir.py new file mode 100755 index 0000000..b5304c0 --- /dev/null +++ b/khashmir/utkhashmir.py @@ -0,0 +1,218 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +import khashmir, knode +from actions import * +from khash import newID +from krpc import KRPCProtocolError, KRPCFailSilently +from cache import Cache +from sha import sha +from util import * +from threading import Thread +from socket import gethostbyname +from const import * +from kstore import sample + +TOKEN_UPDATE_INTERVAL = 5 * 60 # five minutes +NUM_PEERS = 50 # number of peers to return + +class UTNode(knode.KNodeBase): + def announcePeer(self, info_hash, port, khashmir_id): + assert type(port) == type(1) + assert type(info_hash) == type('') + assert type(khashmir_id) == type('') + assert len(info_hash) == 20 + assert len(khashmir_id) == 20 + + try: + token = self.table.tcache[self.id] + except: + token = None + if token: + assert type(token) == type("") + assert len(token) == 20 + df = self.conn().sendRequest('announce_peer', {'info_hash':info_hash, + 'port':port, + 'id':khashmir_id, + 'token':token}) + else: + raise KRPCProtocolError("no write token for node") + df.addErrback(self.errBack) + df.addCallback(self.checkSender) + return df + + def getPeers(self, info_hash, khashmir_id): + df = self.conn().sendRequest('get_peers', {'info_hash':info_hash, 'id':khashmir_id}) + df.addErrback(self.errBack) + df.addCallback(self.checkSender) + return df + + def checkSender(self, dict): + d = knode.KNodeBase.checkSender(self, dict) + try: + self.table.tcache[d['rsp']['id']] = d['rsp']['token'] + except KeyError: + pass + return d + +class UTStoreValue(StoreValue): + def callNode(self, node, f): + return f(self.target, self.value, node.token, self.table.node.id) + +class UTKhashmir(khashmir.KhashmirBase): + _Node = UTNode + + def setup(self, host, port, data_dir, rlcount, checkpoint=True): + khashmir.KhashmirBase.setup(self, host, port,data_dir, rlcount, checkpoint) + self.cur_token = self.last_token = sha('') + self.tcache = Cache() + self.gen_token(loop=True) + self.expire_cached_tokens(loop=True) + + def expire_cached_tokens(self, loop=False): + self.tcache.expire(time() - TOKEN_UPDATE_INTERVAL) + if loop: + self.rawserver.external_add_task(self.expire_cached_tokens, TOKEN_UPDATE_INTERVAL, (True,)) + + def gen_token(self, loop=False): + self.last_token = self.cur_token + self.cur_token = sha(newID()) + if loop: + self.rawserver.external_add_task(self.gen_token, TOKEN_UPDATE_INTERVAL, (True,)) + + def get_token(self, host, port): + x = self.cur_token.copy() + x.update("%s%s" % (host, port)) + h = x.digest() + return h + + + def val_token(self, token, host, port): + x = self.cur_token.copy() + x.update("%s%s" % (host, port)) + a = x.digest() + if token == a: + return True + + x = self.last_token.copy() + x.update("%s%s" % (host, port)) + b = x.digest() + if token == b: + return True + + return False + + def addContact(self, host, port, callback=None): + # use dns on host, then call khashmir.addContact + Thread(target=self._get_host, args=[host, port, callback]).start() + + def _get_host(self, host, port, callback): + ip = gethostbyname(host) + self.rawserver.external_add_task(self._got_host, 0, (host, port, callback)) + + def _got_host(self, host, port, callback): + khashmir.KhashmirBase.addContact(self, host, port, callback) + + def announcePeer(self, info_hash, port, callback=None): + """ stores the value for key in the global table, returns immediately, no status + in this implementation, peers respond but don't indicate status to storing values + a key can have many values + """ + def _storeValueForKey(nodes, key=info_hash, value=port, response=callback , table=self.table): + if not response: + # default callback + def _storedValueHandler(sender): + pass + response=_storedValueHandler + action = UTStoreValue(self, key, value, response, self.rawserver.add_task, "announcePeer") + self.rawserver.external_add_task(action.goWithNodes, 0, (nodes,)) + + # this call is asynch + self.findNode(info_hash, _storeValueForKey) + + def krpc_announce_peer(self, info_hash, port, id, token, _krpc_sender): + sender = {'id' : id} + sender['host'] = _krpc_sender[0] + sender['port'] = _krpc_sender[1] + if not self.val_token(token, sender['host'], sender['port']): + raise KRPCProtocolError("Invalid Write Token") + value = compact_peer_info(_krpc_sender[0], port) + self.store[info_hash] = value + n = self.Node().initWithDict(sender) + self.insertNode(n, contacted=0) + return {"id" : self.node.id} + + def retrieveValues(self, key): + try: + l = self.store.sample(key, NUM_PEERS) + except KeyError: + l = [] + return l + + def getPeers(self, info_hash, callback, searchlocal = 1): + """ returns the values found for key in global table + callback will be called with a list of values for each peer that returns unique values + final callback will be an empty list - probably should change to 'more coming' arg + """ + nodes = self.table.findNodes(info_hash, invalid=True) + l = [x for x in nodes if x.invalid] + if len(l) > 4: + nodes = sample(l , 4) + self.table.findNodes(info_hash, invalid=False)[:4] + + # get locals + if searchlocal: + l = self.retrieveValues(info_hash) + if len(l) > 0: + self.rawserver.external_add_task(callback, 0, ([reducePeers(l)],)) + else: + l = [] + # create our search state + state = GetValue(self, info_hash, callback, self.rawserver.add_task, 'getPeers') + self.rawserver.external_add_task(state.goWithNodes, 0, (nodes, l)) + + def getPeersAndAnnounce(self, info_hash, port, callback, searchlocal = 1): + """ returns the values found for key in global table + callback will be called with a list of values for each peer that returns unique values + final callback will be an empty list - probably should change to 'more coming' arg + """ + nodes = self.table.findNodes(info_hash, invalid=False) + nodes += self.table.findNodes(info_hash, invalid=True) + + # get locals + if searchlocal: + l = self.retrieveValues(info_hash) + if len(l) > 0: + self.rawserver.external_add_task(callback, 0, ([reducePeers(l)],)) + else: + l = [] + # create our search state + x = lambda a: a + state = GetAndStore(self, info_hash, port, callback, x, self.rawserver.add_task, 'getPeers', "announcePeer") + self.rawserver.external_add_task(state.goWithNodes, 0, (nodes, l)) + + def krpc_get_peers(self, info_hash, id, _krpc_sender): + sender = {'id' : id} + sender['host'] = _krpc_sender[0] + sender['port'] = _krpc_sender[1] + n = self.Node().initWithDict(sender) + self.insertNode(n, contacted=0) + + l = self.retrieveValues(info_hash) + if len(l) > 0: + return {'values' : [reducePeers(l)], + "id": self.node.id, + "token" : self.get_token(sender['host'], sender['port'])} + else: + nodes = self.table.findNodes(info_hash, invalid=False) + nodes = [node.senderDict() for node in nodes] + return {'nodes' : packNodes(nodes), + "id": self.node.id, + "token" : self.get_token(sender['host'], sender['port'])} + diff --git a/locale/af/LC_MESSAGES/bittorrent.mo b/locale/af/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..2057e08caf349b3f060794d88a5661b8328ddd6f GIT binary patch literal 31424 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 HB{KJ)6h~hM literal 0 HcmV?d00001 diff --git a/locale/af/LC_MESSAGES/bittorrent.po b/locale/af/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..88cbcf1 --- /dev/null +++ b/locale/af/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2749 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-10-19 13:15-0700\n" +"Last-Translator: Michael Bütow \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installeer Python 2.3 of hoër" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 of nuwer vereis" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Voer in torrent URL" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Voer in URL van torrentlêer om oop te maak:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "inbelverbinding" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "ADSL/kabel 128k op" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "ADSL/kabel 256k op" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "ADSL/kabel 768k op" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maksimum oplaai tempo:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Stop tijdelik alle aktiewe torrents" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Aflaai hervat" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Gepouseer" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Geen torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Loop normaal" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "agter vuurmuur/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nuwe weergawe %s beskikbaar" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "A nuwer weergawe van %s is beskikbaar.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "U gebruik %s, en die nuwe weergawe is %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"U kan altyd die nuutste weergawe bekom van \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "_Later aflaai" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "_Nou aflaai" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "He_rinner my later" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Aangaande %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Weergawe %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Kon nie %s oopmaak nie" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Maak 'n skenking" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Aktiwiteitslog" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Stoor log in:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "log gestoor" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "log skoon gemaak" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Instellings" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Stooring" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Stoor nuwe aflaaiïngs in:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Wysig..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Vra waar om elke nuwe aflaaiïng te stoor" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Aflaai" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Begin addisionele torrents eiehandig:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Stop altyd die _laaste aktiewe torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Begin die torrent altyd in _parallell" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "Vr_a elke keer" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Saai" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Saai voltooide torrents: totdat deelverhouding [_] persent bereik, of vir " +"[_] minute, wat ookal eerste kom." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Saai vir onbeperkte tyd" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "Saai laas voltooide torrent: totdat deelverhouding [_] persent bereik." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Netwerk" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Soek beskikbare poort:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "beginnende by poort:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP te rapporteer aan vervolger:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Het geen uitwerking tensy U op dieselfde\n" +"lokale netwerk as die vervolger is)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Teks van vorderingsstafie is altyd swart\n" +"(vereis herbegin)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Allerande" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"WAARSKUWING: Verandering van hierdie instellings kan\n" +"verhinder dat %s korrek werk." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opsie" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Waarde" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Gevorderde" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Kies grondgids vir aflaai" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Lêers in \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Wend aan" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Ken toe" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nooit aflaai nie" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Verminder" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Vermeerder" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Lêernaam" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Lengte" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peers vir \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP adres" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Klient" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Konneksie" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s af" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s op" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB afgelaai" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB opgelaai" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% voltooi" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s ong. peer aflaai" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Peer ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Belangstellend" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Beknop" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Afgewys" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistiese oplaai" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "afgeleë" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokale" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "slegte peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d goed" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d sleg" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "verbannene" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "goed" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Info vir \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrent naam:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent sonder vervolger)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Gee url bekend:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", in een lêer" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", in %d lêers" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Totaale grootte:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Dele:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Info hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Stoor in:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Lêernaam:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Maak oop gids" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Wys lêerlys" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "sleep om te herskik" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "regter muis knoppie vir kieslys" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent info" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Verwyder torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Staak torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", sal saai vir %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", sal vir altyd saai." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Klaar, deelverhouding: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Klaar, %s opgelaai" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Klaar" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent _info" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "Maak gids _oop" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Lêerlys" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Peer lys" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "Verander ligging" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Saai vir onbeperkte tyd" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Herbegin" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "Eindig" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "Verwyde_r" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "St_aak" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Is U seker U wil \"%s\" verwyder?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "U deelverhouding vir hierdie torrent is %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "U het %s aan hierdie torrent opgelaai." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Verwyder hierdie torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Klaar" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "sleep in lys in om te saai" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Gevaal" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "sleep in lys in om te hervat" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Wag" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Besig om te loop" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Huidig op: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Huidig af: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Voorheens op: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Voorheens af: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Deelverhouding: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s peers, %s sade. Totale van vervolger: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Verdeelde kopieë: %d; Volgende: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Dele: %d totaal, %d voltooi, %d parsieël, %d aktief (%d leeg)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d slegte dele + %s in weggegooide versoeke" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% klaar, %s oor" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Aflaaisnelheid" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Oplaaisnelheid" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "NB" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s begin" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Oopmaak van torrentlêer" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Maak torrent _URL oop" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Maak _nuwe torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pouseer/Voortgaan" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "Gaan uit" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Wys/versteek voltooide torrents" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "Herverg_root venster om aan te pas" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Log" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "In_stellings" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Hulp" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Aangaande" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "Maak 'n skenking" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "Lêer" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "Aansig" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Soek torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(gestop)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(veelvuldige)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Laai reeds %s installeerder" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Installeer nuwe %s nou?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Wil u %s beëindig en die nuwe uitgawe, %s, nou installeer?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s hulp is by \n" +"%s\n" +"Wil U nou daarheen gaan?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Besoek hulpwebbladsy?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Daar is een voltooide torrent in die lys." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Wil U dit verwyder?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Daar is %d voltooide torrents in die lys." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Wil U hulle almal verwyder?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Verwyder alle voltooide torrents?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Geen voltooide torrents" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Daar is geen voltooide torrents om te verwyder nie." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Ope torrents:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Verander stoorgids vir" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Lêer bestaan al!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" bestaan al. Wil u 'n ander lêernaam kies?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Stoorgids vir" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Gids bestaan!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "\"%s\" bestaan al. Wil u 'n identiese gids in die bestaande gids skep?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globale boodskap) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Fout" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Veelvuldige foute het opgetree. Kliek OK om die fout log te sien." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Stop aktiewe torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"U is besig om \"%s\" te begin. Wil u die laas aktiewe torrent ook stop?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Het u 'n skenking gemaak?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Welkom by die nuwe weergawe van %s. Het u 'n skenking gemaak?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Dankie!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Dankie vir u skenking! Om weer te skenk, kies \"Maak 'n skenking\" van die " +"\"Hulp\" kieslys." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "verouderd, moenie gebruik nie" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "Nie geslaag om bevelsocket te skep of 'n bevel daardeur te stuur nie." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Miskien sal die sluiting van alle %s vensters die probleem oplos." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s loop al reeds" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Stuur van opdrag deur bestaande beheer-socket gevaal." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Kon nie die TorrentQueue begin nie, sien bo vir voute." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrent lêer skepper %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Maak torrent gids vir hierdie lêer/gids:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Kies..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Gidse sal batch torrents word)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Deel grootte:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Gebruik _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Gebruik _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Nodes (opsioneel):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Kommentare:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Maak" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Poort" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Bou torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Kontroleer lêergroottes..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Begin saai" + +#: maketorrent.py:540 +msgid "building " +msgstr "bou" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Klaar." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Klaar met bou van torrents." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Fout!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Fout by bou van torrents:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dae" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dag %d ure" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d ure" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minute" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d sekondes" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 sekondes" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Hulp" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Kwelvrae:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Gaan" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Kies 'n bestaande lêer..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Alle lêers" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Skep 'n nuwe gids..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Kies 'n lêer" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Kies 'n gids" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Kon nie gestoorde toestand laai nie:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Toestand van bedienoppervlak kon nie gestoor word nie:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Ongeldige inhoud van toestandlêer" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Fout met lees van lêer" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "kan toestand nie heeltemal herstel nie" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Ongeldige toestandlêer (dubbele inskrywing)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Korrupte data in" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", kan torrent nie herstel nie (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Ongeldige toestandlêer (onaanvaarbare inskrywing)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Ongeldige toestandlêer vir grafiese koppelvlak" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Slegte weergawenommer van toestandlêer vir grafiese koppelvlak" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Nie ondersteunde weergawe van toestandlêer vir grafiese koppelvlak (van 'n " +"nuwer klientweergawe?) " + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Kon gekasde lêer %s nie skrap nie:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Dit is nie 'n korrekte torrentlêer nie. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Hierdie torrent (of een met dieselfde inhoud) loop alreeds." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Hierdie torrent (of een met dieselfde inhoud) wag alreeds om te loop." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent in onbekende toestand %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Kon lêer nie skryf nie" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrent sal nie korrek herbegin word nie wanneer die kliënt herbegin" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Kan nie meer as %d torrents ter selfde tyd loop nie. Vir meer info lees die " +"FAQ by %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Torrent word nie begin nie omdat ander torrents wag om te loop, en hierdie " +"sou al een teveel wees volgens die instellings vir wanneer om te stop met " +"saai. " + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Torrent word nie begin nie omdat die instelling bereik is vir wanneer om te " +"stop met die saai van die laas voltooide torrent." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Kon nie die nuutste weergawe van %s bekom" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Kon nie die versie van %s uitmaak nie" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Kon nie 'n geskikte temporere lokasie vir die %s %s installeerder vind nie." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Geen torrentleer beskikbaar vir die %s %s installeerder." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s installeerder blyk beskadig of mis." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Kan nie installeerder op hierdie bedryfstelsel uitvoer nie" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"gids waaronder veranderlike data soos fastresume-informasie en toestand van " +"grafiese oppervlak gestoor word. Grondwaarde is die subgibs 'data' van die " +"bittorrent config gids." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"karakterenkodering wat op die lokale lêersisteem gebruik word. Indien leeg, " +"outospeur. Outospeur werk nie met python werkgawes ouer as 2.3 nie" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "ISO taalkode om te gebruik" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP om aan die vervolger te rapporteer (het geen effek nie tensy U op " +"dieselfde lokale netwerk as die vervolger is)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"wêreld-sigbare poort nommer as dit verskil van dié wat die klient lokaal na " +"luister" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"minimum poortnommer om na te luister, word opgetel indien nie beskikbaar nie" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "maksimum poortnommer om na te luister" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ip om lokaal te bint" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekondes tussen hervris van vertoonde informasie " + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minutte om te wag intissen versoek van meer peers" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "minimal nommer van peers om nie te versoek nie" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "nommer van peers om na te stop van nuwe verbindings" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maksimum nommer van verbindings om te laat,na hierdie nuwe verbindingssal " +"dadelik gesluit wees" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "om hashes te tjek op plaat" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maksimum kB/s om te upload, 0 beteken geen grens" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "die aantal oplaais om te lewer met ekstra optimistiese unchokes" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"die maksimum aantal lêers in 'n multi-lêer torrent om gelyktydig oop te hou, " +"0 beteken onbeperk. Om te vermy dat alle file descriptors opgebruik word." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "nommer van seconda te pouse intissen stuuring van keepalives" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "hoevel bytes om te versoek " + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"maksimale lengte van prefiksenkodering wat op die lyn aanvaar sal word - " +"groter waardes sal die konneksie laat afbreek." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "sekondes om te wag tussen sluit van sockets wat niks ontvang het nie" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "sekondes om te wag tussen kontroleer of enige konneksies uitgetel het" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"maksimale tydinterval waarmee aktuele oplaai en aflaai tempo geskat word" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "maksimale tydinterval waarmee aktuele saaitempo geskat word" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "maksimale tyd om te wag tussen herhaal van aankondigings as hulle vaal" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"sekondes om op data oor 'n verbinding te wag voordat aangeneem word dat dit " +"semi-permanent geblokkeer is" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"aantal van aflaais waar van willekeurig na die mees selde eerste geskakel " +"word " + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "hoeveel oktets op 'n slag in netwerkbuffers geskryf word." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"verweier verbindings van adresse met gebreekde of moedswillig skadelike " +"peers wat foutiewe data stuur" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "moenie met veelvuldige peers verbind wat dieselfde IP adres het nie" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"indien nie 0 nie, stel die TOS-opsie vir peer-verbindings in met hierdie " +"waarde" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"aktiveer omgaan van 'n fout in BSD libc wat die lees van lêers baie stadig " +"maak." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adres van HTTP instaanbediener om te gebruik vir vervolgerkonneksies" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "sluit verbindings met RST en vermy die TCP TIME_WAIT toestand" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Gebruik Twisted netwerkbiblioteek vir netwerk verbindinge. 1 beteken bebruik " +"Twisted, 0 beteken moenie Twisted gebruik nie, -1 beteken outospeur, en " +"verkies Twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "vertoon gevorderde gebruikerkoppelvlak" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"die maksimale aantal minute om 'n voltooide torrent te saai voordat opgehou " +"word met saai" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"die minimale oplaai/aflaai verhouding, in persent, wat bereik moet word " +"voordat opgehou word met saai. 0 beteken onbeperk." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"die minimale oplaai/aflaai verhouding, in persent, wat bereik moet word " +"voordat opgehou word met saai van laaste torrent. 0 beteken onbeperk." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Saai elke voltooide torrent vir onbeperkte tyd (totdat die gebruiker dit " +"kanseleer)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Saai die laaste torrent vir onbeperkte tyd (totdat die gebruiker dit " +"kanseleer)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "Begin aflaaier in gepouseerde toestand" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "om te vra - of nie - vir 'n lokasie waar afgelaaide leers gestoor word" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"lokale gids waar torrents gestoor sal word, met 'n leernaam bepaal deur --" +"saveas_style. As dit leeg is word elke torrent onder die gids van die " +"ooreenkomende .torrent leer gestoor" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "verstek trackernaam" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "volleedig afgelaai!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "klaar in %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "aflaai was suksesvol" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB op / %.1f MB af)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB op / %.1f MB af)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d nou sigbaar, plus %d verdeelde kopiee (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d verdeelde kopie (volgende: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d nou sigbaar" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "FOUT:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "stoor:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "leergrootte:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "persent voltooi:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tyd oor:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "aflaai na:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "aflaaitempo:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "oplaaitempo:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "deelverhouding:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "seed status:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "peer status:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "U mag nie beide --save_as en --save_in aangee nie" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "sluit af" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Fout met lees van konfigurasie:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Fout met lees van .torrent leer:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "u moet 'n .torrent leer aangee" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Teksmodus GUI kon nie inisialiseer word nie, kan nie voortgaan nie." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Hierdie aflaaibedienoppervlak benodig die standaard Python module \"curses" +"\", wat ongelukkig nie vir die natiewe Windows poort van Python. Maar dit is " +"wel beskikbaar vir die Cygwin poort van Python, wat op alle Win32 stelsels " +"werk (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "U kan steeds die \"bittorrent-console\" gebruik om af te laai." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "lêer:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "grootte:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "bestemming:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "voortgang:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "status:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "af spoed:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "op spoed:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "deel:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "seeds:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "peers:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d nou gesien, plus %d verdeelde kopie (%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "fout(e):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "fout:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Oplaai Aflaai Voltooi Spoed" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "laai %d dele af, het %d fragmente, %d van %d dele voltooi" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Hierdie foute het gedurende die uitvoering opgetree:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Gebruik: %s TRACKER_URL [TORRENTLEER [TORRENTLEER ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "ou bekendstelling vir %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "geen torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "STELSEL FOUT - EKSEPSIE UITGEROEP" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Waarskuwing:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "is nie 'n gids nie" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"fout: %s\n" +"sonder argumente vir parameter verduideliking" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EKSEPSIE:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "U kan steeds \"btdownloadheadless.py\" gebruik om af te laai." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "bou verbinding op met peers" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "ETA in %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Grootte" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Aflaai" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Oplaai" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totaal:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr " (%s) %s - %s peers %s seeds %s verdeelde kopie - %s af %s op" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "fout:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"voer sonder argumente uit om verduideling van parameters te bekom" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Kon %s nie lees nie" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Kon %s nie aflaai of oopmaak nie\n" +"Probeer om die torrentlêer met 'n web blaaier af te laai." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "" diff --git a/locale/bg/LC_MESSAGES/bittorrent.mo b/locale/bg/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..0e09af500dbe8b0092f6c9b2bc6033bdc9e0025b GIT binary patch literal 79754 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 literal 0 HcmV?d00001 diff --git a/locale/bg/LC_MESSAGES/bittorrent.po b/locale/bg/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..a7b4144 --- /dev/null +++ b/locale/bg/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2875 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-15 01:31-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Инсталирайте Python 2.3 или по-нова версия" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Изисква PyGTK 2.4 или по-нова версия" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Въведете URL на торент файла" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Въведете URL на торент файла, за да го отворите" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "dialup" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/кабел от 128k нагоре" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/кабел от 256k нагоре" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL от 768k нагоре" + +#: bittorrent.py:283 +msgid "T1" +msgstr "Т1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "Е1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "Т3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Максимална скорост на качване:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Временно спри всички стартирани торенти" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Поднови тегленето" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Спрян" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Няма торенти" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Нормален работен режим" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Зад защитна стена сте/NAT протокол" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Налична е по-нова %s версия" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Новата версия на %s е налична.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Вие използвате %s, а новата версия е %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Винаги можете да изтеглите последната версия от \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Изтеглете_по-късно" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Изтеглете_сега" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Напомни ми по-късно" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Относно %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Бета" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Версия %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "%s не може да бъде отворен" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Дарение" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Запис на извършените действия" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Съхрани записа в:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "Записът е съхранен" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "Записът е изчистен" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Настройки" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Запазване" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Запази новия изтеглен файл в:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Промяна..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Питай къде да се запази всеки изтеглен файл" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Теглене" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Ръчно стартиране на допълнителни торенти:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Винаги спирай _последния стартиран торент" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Винаги стартирай торентите _паралелно" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Питай всеки път" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Сийдване" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Сийдвай готовите торенти: докато коефициентът на споделяне достигне [_] " +"процента или за [_] минути, което условие се изпълни първо." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Сийдвай неограничено" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Сийдвай последно завършения торент: докато коефициентът на споделяне " +"достигне [_] процента." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Мрежа" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Провери за наличен порт:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "започни от порт: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP, който да се съобщи на тракера:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Няма ефект, ако не сте в\n" +" една и съща локална мрежа с тракера)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Текстът в лентата на прогреса винаги е в черно\n" +"(нужно е рестартиране)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Разни" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ВНИМАНИЕ: Промяната на тези настройки може\n" +" да попречи на правилното функциониране на %s." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Опция" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Стойност" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Разширени настройки" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Избери директория по подразбиране за запазване на изтеглените файлове" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Файлове в \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Приложи" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Разпредели" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Никога не изтегляй" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Намали" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Увеличи" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Име на файла" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Дължина" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Пиъри за \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP адрес" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Клиент" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Връзка" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s теглене" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s качване" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB изтеглени" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB качени" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% завършени" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s очаквана скорост за теглене от пиъра" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Идентификация на пиъра" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Заинтересовани" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Забавени" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Спрени" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Качване - оптимистичен вариант" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "отдалечен" + +#: bittorrent.py:1358 +msgid "local" +msgstr "локален" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "лош пиър" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d са добри" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d са лоши" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "забранени" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "Добре" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Информация за \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Име на торент:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(торент без тракер)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Обяви url:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ",в един файл" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", в %d файла" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Общ размер:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Части:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Информация за hash-a:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Запази в:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Име на файл:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Отвори директория" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Покажи списък с файловете" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "влачете с мишката, за да преподредите" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "извикване на менюто с десен бутон на мишката" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Информация за торент" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Премахни торент" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Откажи торент" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", ще се сийдва за %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", ще се сийдва неограничено." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Готово, коефициент на споделяне:%d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Готово, %s са качени" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Готово" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Торент_информация" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Отвори директория" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Списък на файловете" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Списък на пиърите" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Промени местоположението" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Сийдвай неограничено" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Ре_старт" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Край" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Премахни" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Прекрати" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Сигурни ли сте, че искате да премахнете \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Вашият коефициент на споделяне за торента е %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Качили сте %s от торента. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Да премахна ли торента?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Край" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "За да сийдвате, пренесете в списъка за сийд" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Неуспех" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "За да продължите, пренесете в списъка" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Изчакване" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Стартиран" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Качени до момента: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Изтеглени до момента:%s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Предишни качени: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Предишни изтеглени: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Коефициент на споделяне:%0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s пиъри, %s сийдъри.Общо от тракера: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Разпространени копия: %d;Следващи: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Части: %d общо, %d завършени, %d частично, %d активни (%d празни)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d лоши части + %s в отказани заявки" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% готови, %s оставащи" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Скорост на теглене" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Скорост на качване" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Няма налично" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s стартирани" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Отвори торент файл" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Отвори торент_URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Създай_нов торент" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Пауза/Старт" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Изход" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Покажи/Скрий_готовите торенти" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Напасни размера на прозореца" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Запис на действията" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Настройки" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Помощ" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Относно" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Дарение" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Файл" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Покажи" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Търсене на торенти" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(спрени)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(няколко)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Вече теглите %s инсталатора" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Искате ли да инсталирате новия %s сега?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Искате ли да излезете от %s и да инсталирате новата, %s, версия сега?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s помощ на \n" +"%s\n" +"Искате ли да отидете там сега?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Искате ли да посетите помощната страница?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Има един готов торент в списъка." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Искате ли да го премахнете?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Има %d готови торенти в списъка. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Искате ли да ги премахнете всичките?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Да премахна ли всички готови торенти?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Няма готови торенти" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Няма готови торенти за премахване." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Отвори торент:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Промени мястото за запазване на" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Файлът съществува!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" вече съществува. Искате ли да изберете друго име за файла?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Място за запазване на" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Директорията съществува!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" съществува. Искате ли да създадете директория-дубликат вътре в " +"съществуващата директория?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(главно съобщение):%s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Грешка" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Възникнаха множество грешки. Натисни ОК, за да видиш записа за грешките." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Да спра ли стартирания торент?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "Ще стартирате \"%s\". Искате ли да спра последния стартиран торент?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Направихте ли дарение?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Добре дошли в новата версия на %s. Направхите ли дарение?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Благодаря!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Благодарим Ви за дарението! За да направите ново дарение, изберете \"Дарение" +"\" от менюто \"Помощ\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "неодобрено, не използвай" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Неуспех при създаване или изпращане на команда през съществуващия контролен " +"сокет." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Затварянето на всички %s прозорци може да реши проблема." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s е вече стартиран" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Неуспех при изпращанена команда през съществуващия контролен сокет." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Не се стартира Торент опашката, виж по-горе за грешки." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s създаване на торент файлове %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Създай торент файл за този файл/директория:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Избор..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Директориите ще станат торенти с пакетно изпълнение)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Размер на частта:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Използвай _тракер:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Използвай _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Възли (по избор):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Коментари:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Направи" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Хост" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Порт" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Изграждане на торенти..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Проверка на размера на файловете..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Започни сийдване" + +#: maketorrent.py:540 +msgid "building " +msgstr "изграждане" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Готово." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Торентът е изграден." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Грешка!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Грешка при изграждане на торентите: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d дни" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 ден %d часа" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d часа" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d минути" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d секунди" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 секунди" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Помощ" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Често задавани въпроси:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Старт" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Избери съществуваща папка..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Всички файлове" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Торенти" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Създай нова папка..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Избери файл" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Избери папка" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Не може да зареди запазеното състояние:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Не се запази UI статуса:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Невалидно съдържание на файла за състояние" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Грешка при четене на файла" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "не може да възтанови данните напълно" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Невалиден файл за състояние(дублиране)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Повредени данни в" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", не мога да възстановя торент (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Невалиден файл за състояние(лош запис)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Лош UI файл за състояние" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Лоша версия на UI файла за състояние" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "Неподдържана версия на UI файла за състояние (нова версия на клиента?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Не може да изтрие кеширания %s файл:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Това не е торент файл.(%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Този торент (или друг със същото съдържание) вече е стартиран." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Този торент (или друг със същото съдържание)вече изчаква да бъде стартиран." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Торент в непознато състояние %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Не можа да запише файла" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "торентът няма да бъде рестартиран правилно при рестарт на клиента " + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Не може да стартира повече от %d торенти едновременно. За повече информация " +"виж Често задавани въпроси на %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Не стартира торента, защото има други, които са в състояние на изчакване." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Не стартира торента, защото вече отговаря на настройките за това кога да " +"спре сиидването на последния готов торент." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Не можа да изтегли новата версия от %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Не може да разчете стринг на новата версия от %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Не може да открие подходящо временно място, където да запише %s%s " +"инсталатора." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Няма наличен торент файл за %s%s инсталатора." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s%s инсталаторът изглежда е повреден или липсва." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Инсталаторът не може да бъде стартиран на тази операционна система" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"директория за съхранение на променящи се данни като информация за бързо " +"възобновяване на операциите и състоянието на интерфейса. По подразбиране е в " +"поддиректория \"данни\" на биторентовата config папка." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"кодиращата таблица, използвана от локалната файлова система. Ако не посочите " +"стойност, тя се открива автоматично. Автоматичната детекция не работи с " +"версии на python по-стари от 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "да се използва ISO кодиране" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ip за рапорт до tracker-а (няма ефект, освен ако не исползвате tracker от " +"локалната мрежа)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "видим номер на порт, ако е различен от следения от локалния ви клиент" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "минимум портове за следене, изброй, ако не е посочено" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "максимум портове за следене" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ip за локална връзка" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "интервал в секунди за обновяване на информацията" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "минути изчакване между заявките за нови peer-и" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "" +"минимален брой на peer-ите, при който да спира инициирането на нови заявки" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "брой на peer-ите, при който да спира инициирането на нови връзки" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"максималнен разрешен брой на връзките,след който нови връзки ще бъдат " +"прекъсвани незабавно" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "дали да се проверяват хешовете на диска" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "максимум kB/s за качване, 0 се равнява на \"неограничено\"" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "брой на качванията при идеални условия" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"максимален брой на едновременно отворените файлове в многофайлов торент, 0 " +"се равнява на \"неограничено\". Използва се, за да се избегне изчерпване на " +"файловите дескриптори." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Инициализира клиент без тракер. Опцията трябва да е включена, за да се " +"теглят торенти без тракер." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"интервал в секунди, на който се изпращат маркери за поддържане на сесията" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "брой на байтове на заявка." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"Максимална дължина за кодиране на префикса, която ще бъде приета - при по-" +"голяма стойност връзката се разпада." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"Секунди на изчакване преди затваряне на сокетите, когато нищо не е получено." + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "Секунди на изчакване преди проверка за прекъснати връзки." + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"Максимална дължина на частите, изпращани на пиъри, прекъсни връзката, ако " +"заявката надвишава размера" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"Максимален времеви интервал, на който се преизчисляват индикаторите за " +"качване и теглене" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "Максимален времеви интервал за преизчисляване на seed индикаторите" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"Максимален времеви интервал преди опит за възобновяване на прекъснати връзки" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"секунди за изчакване на пристигащи данни, преди да се приеме, че има " +"временно разпадане на връзката" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"Брой на сесиите за теглене, при които да се премине от \"случаен\" към " +"\"първи най-рядък\" ред на обслужване" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "Брой байтове, едновремено записвани в мрежовите буфери." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"Откажи по-нататъшни връзки от адреси, с повредени или некоректни peer-ове, " +"които подават недобронамерена информация." + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "не се свързвай към няколко peer-а, ако те имат един исъщи IP адрес" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "ако не е 0, задай тази стойност за TOS опцията за peer връзки" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"разреши преодоляване на бъг в BSD libc, който води до много бавно четене на " +"файла." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "адрес на HTTP прокси, който се използва за tracker връзки" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "затвори връзките с RST и избегни TCP TIME_WAIT състоянието" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Използване на мрежови библиотеки от тип \"Twisted\" за връзка с мрежата. 1 " +"означава да се използват, 0 означава да не се използват, -1 означава " +"автоматично откриване и приоритетно използване на такива библиотеки" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"Име на файл (за еднофайлови торенти)или име на директория (за пакет " +"торенти), в която да запазва торентите като презаписва името по подразбиране " +"на торента. Виж също--запази_в, ако не е посочено, потребителят ще бъде " +"запитан за място за запазване" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "покажи интерфейс за напреднали потребители" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"максимален интервал в минути за сийд на готов торент, преди да се спре " +"сийдингът" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"минимална стойност в проценти, която трябва да се достигне за качване/" +"теглене, преди преустановяване на сийдинга. 0 е равносилно на неограничено." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"минимална стойност в проценти, която трябва да се достигне за качване/" +"теглене, преди преустановяване на сийдинга за последния торент. 0 е " +"равносилно на неограничено." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "Сийдвай всички готови торенти (докато потребителят не ги прекъсне)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Сийдвай последния готов торент (освен ако потребителят не го прекъсне)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "Започни теглене по време на състояние \"пауза\"" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"Уточнява действията на програмата, когато потребителят се опитва да стартира " +"ръчно друг торент: \"замести\" означава да се стартира новият торент на " +"мастото на стария, \"добави\" - да добави новия торент паралелно с другите, " +"\"питай\" - да пита потребителя всеки път." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"име на файл (за еднофайлови торенти) или име на директория (за пакетни " +"торенти) за запазване на торента, като се презаписва името по подразбиране в " +"торента. Виж също --запази_в" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"максималният брой на позволените сесии за теглене наведнъж. -1 означава (да " +"се надяваме) приемлив брой, базиран на максималната скорост на качване. " +"Автоматичните стойности са валидни само когато е стартиран един единствен " +"торент." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"локална директория, в която ще се запази съдържанието на торента. Файлът " +"(при еднофайловите торенти) или директорията(пакетни торенти) ще бъдат " +"създадени вътре в тази директория, като се използва името по подразбиране от " +"торента. Виж също--запази_в." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "да пита или не за мястото за запазване на файловете" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"Локална директория, където торентите ще се запазват, използвайки имена, " +"определени в --запази в_стил. Ако оставите полето празно, торентите ще се " +"запазват в директорията на съответния торент файл. " + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "На какъв интервал в секунди да сканира директорията с торенти" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Как да се наименоват теглените торенти: 1:използвай името на торент файла " +"(минус .торент); 2:използвай името, кодирано В торент файла; 3:създай " +"директорията с името на торен файла (минус .торент) и съхрани в тази папка " +"под името, кодирано В торент файла; 4:ако името на торент файла (минус ." +"торент) и името, кодирано В торент файла, са идентични, използвай това име " +"(стил 1/2), в противен случай създай междинна директория като в стил 3; " +"ВНИМАНИЕ: стил 1 и 2 могат да презаписват новите файлове върху старите без " +"предупреждение." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"дали да изписва целия път до торент файла или съдържанието за всеки торент" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "директория за търсене на .торент файлове (полу-самоизвикваща се)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "дали да извежда диагностична информация на екрана" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "по кой от двата източника да се настрои размерът на частите" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "име по подразбиране на тракера" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"ако е неуспешен, създай торент без тракер вместо да посочваш URL, използвай " +"надежден мрежов възел под формата на :<порт> или празен стринг, за да " +"извлечеш възел от таблицата с маршрути " + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "Тегленето завърши!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "<непознат>" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "завърши в %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "тегленето завърши успешно" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo(%.1f MB качване / %.1f MB теглене)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f(%.1f MB up / %.1f MB down)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d видими, плюс %d разпространявани копия (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d разпространявани копия (следва: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d видими" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ГРЕШКА:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "запазване:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "размер на файл:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "завършени проценти:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "оставащо време:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "изтегли в:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "степен на теглене:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "степен на качване:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "степен на споделяне:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "сийд статус:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "peer статус:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Не можете да посочите заедно --запази_като и --запази_в" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "изключване" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Грешка при четене на конфигурацията:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Грешка при четене на .торент файл:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "трябва да посочите .торент файл" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Текстов режим, Грешка при инициализиране на графичния интерфейс, операцията " +"не може да продължи." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Този интерфейс за теглене изисквастандартен Python модул \"curses\", който " +"за жалост не е в наличност при Windows портовете на Python. Ако имате " +"работещ Cygwin за порт на Python, той се стартира на всички Win32 системи " +"(www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Можете да използвате \"bittorrent-console\", за да теглите." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "файл:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "размер:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "местонахождение:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "прогрес:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "статус:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "скорост на теглене:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "скорост на качване:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "споделяне:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "сийдъри:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "peer-и:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d се виждат,плюс %d разпространени копия(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "грешка(и):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "грешка:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP скорост за качване и теглене" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "изтеглени %d части,има %d части,%d от %d изтеглени" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Грешки при изпълнение:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Заети:%sTRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "стари пуликувани %s:%s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "няма торенти" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "СИСТЕМНА ГРЕШКА-ГЕНЕРИРАНА ГРЕШКА" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Внимание:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "не е директория" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"грешка: %s\n" +"стартирай без настройка на параметри" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"ИЗКЛЮЧЕНИЕ:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Все още можете да използвате \"btdownloadheadless.py\" за теглене." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "свързване с peer-и" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "ETA в %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Размер" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Теглене" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Качване" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Общо:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s пиъри %s сийдъри %s копия - %s изтегл. %s качено" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "грешка:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"стартирай без настройка на параметри" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "незадължителен коментар, който да се постави в .торент" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "незадължителен файл за торент" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - разкодирай %s metainfo файлове" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Използвани:%s [TORRENTFILE [TORRENTFILE ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "файл с метаданни: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "инфо хеш:%s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "име на файл: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "файл размер:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "файлове:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "име на папка: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "архив размер:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "tracker публикация url: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "tracker бележки:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "коментар:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Не мога да създам контролен сокет:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Не може да изпрати команда:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Не мога да създам контролен сокет: вече се използва" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Не мога да премахна старото име на файла на контролния сокет: " + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Главния mutex вече е създаден." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Не може да намери отворен порт!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Не може да създаде файл в директорията!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Не може да намери главния mutex ,заключен за контролсокет файл!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "Предишната версия на BT не е била затворена добре. Продължавам напред" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "неправилно bкодиран низ" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "неправилно bкодирана стойност (данни след правилна представка)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Използване: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[НАСТРОЙКИ][ТОРЕНТДИРЕКТОРИЯ]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Ако не бъде зададен специално аргумент той се взима от стойността\n" +" на избора на торент_директория.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[НАСТРОЙКИ][ТОРЕНТФАЙЛОВЕ]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[НАСТРОЙКИ][ТОРЕНТФАЙЛ]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[НАСТРОЙКА] ТРАКЕР_URL ФАЙЛ [ФАЙЛ]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "аргументите са -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(по подразбиране за" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "непознат ключ" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "параметърът подаден в края е без стойност" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "разчитането на командните редове се провали при" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Настройката %s се изисква." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Наи-малкото трябва да дадете %d аргумента." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Твърде много аргументи - %d максимално." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "грешен формат на %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Не мога да запазя опциите за постоянно:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" +"%d секунди след стартирането му анонсът от тракера все още не е завършен" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Проблем при свързване с тракера, получи-хоста-по-име се провали -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Проблем при свързване с тракера -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "лоши данни от тракера -" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "отхвърлен от тракера -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Спирам свалянето на торента понеже беше отхвърлен от тракера и нямаше връзка " +"с нито един пиър." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Съобщение от тракера:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "предупреждение от тракера -" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Не мога да прочета данните от директорията" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Не мога да да записвам статистиката" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "премахвам %s (ще се добави отново)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**Внимание** %s е същия торент като %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**Внимание** %s съдържа грешки" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "...готов" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "изтривам %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "проверката е завършена" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "изгубен сървър сокет" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Грешка при действие с приетата връзка:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Наложи се да изляза поради непълен TCP стек. Моля погледнете ЧЗВ на адрес %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Вече не може да се използва RawServer, %s вече се използва" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Пон" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Вто" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Сря" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Чет" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Пет" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Съб" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Нед" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Яну" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Фев" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Мар" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Апр" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Май" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Юни" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Юли" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Авг" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Сеп" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Окт" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Ное" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Дек" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Компресиран: %i Некомпресиран: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Не можете да задавате име на .torrent файла когато използвате многозадачен " +"режим за създаване на торенти" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Кодирането в файлова система \"%s\" не се поддържа от тази версия" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Не мога да превърна името на файла/директорията \"%s\" в формат utf-8 (%s). " +"Или файловата система \"%s\" е неправилно разпозната или името на файла " +"съдържа непозволени символи." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Името на файла/директорията \"%s\" съдържа запазени универсални стойности " +"които нямат съответстващи символи." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "Грешни данни в файла за отговор - целият размер е твърде малък" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "Грешни данни в файла за отговор - целият размер е твърде голям" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "проверява файла" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--проверка_hash 0 или информацията за бързо подновяване не съвпада със " +"състоянието на файла (липсващи данни)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" +"Неправилна информация за бързо подновяване (файловете съдържат повече от " +"обявените данни)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Неправилна информация за бързо подновяване (грешна стойност)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" +"данните на диска са повредени - може би имате две стартирани работещи копия " +"на програмата?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Не мога да разчета данните необходими за бързо подновяване" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"Файлът е свален при стартирането, но проверката на всички парчета се провали" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Файлът %s принадлежи на друг вече стартиран торент" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Файлът %s вече съществува, но не е стандартен файл" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Даване на кратко за четене име на скъсените фалове?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Файлов формат непозволяващ бързо продължаване, може би от друга версия на " +"програмата?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Друга програма е преместила,преименувала,или изтрила файла." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Друга програма е модифицирала файла." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Друга програма е сменила големината на файла." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "не мога да настроя обработката на сигнали:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "изгубени \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "добавени \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "изчакване за hash проверка" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "сваляне" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Препрочитане на конфигурационния файл" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Не мога да прочета %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Не мога да изтегля или отворя \n" +"%s\n" +"Опитайте да използвате Уеб Браузър за да свалите торент файла." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Това трябва да е стара версияна Python която не е приспособенада детектва " +"енкодинга на файловатасистема.Вероятно 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python не успя да разпознае кодирането на файловата система.Използва 'ascii' " +"вместо него." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Кодирането '%s' на файловата система не се поддържа. Изплозвам 'ascii' " +"вместо него." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Лоша част във файла:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Този торент файл е създаден с увреден инструмент и е снекоректен енкодинг в " +"имената на файловете.Някои или всички файлови имена може би се различават от " +"оригиналните." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Този торент файл е създаденс увреден инструмент и е снекоректен енкодинг в " +"именатана файловете.Някои или всичкифайлови имена може би се различаватот " +"оригиналните." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Този торент файл е създаденс увреден инструмент и е снекоректен енкодинг в " +"именатана файловете.Използваните имена може би са коректни." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Набора от символи използван в местната файлова система (\"%s\") не може да " +"изобрази всички символи използвани в името на файла на този торент. Имената " +"на файловете са променени от първоначалните." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows не може да вземенякои от символите в иметона файла(вете)на този " +"торент.Имената ще бъдат променениот оригиналните. " + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Този торент файл е създаденс увреден инструмент и е сфайл или директория с " +"невалидноиме.Всияки фаилове маркирани с0 ще бъдат игнорирани." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Изисква Python 2.2.1 или по нов" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Не може да се стартират две отделни части от единторент" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" +"максималният порт за проверка е по-малък от минималния - няма портове за " +"проверка" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Не мога да отворя порт за слушане:%s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Не мога да отворя порт за слушане:%s. " + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Проверете настройките си за обхвата от портове за проверка" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Първоначално стартиране" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Не може да зареди файла за бързо стартиране:%s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Ще извърша пълна проверка на hash-а" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "парчето %d не отговаряше при hash проверката, свалям го наново" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Опит да се изтегли торент без тракер с изключена опция на програмата за " +"сваляне без тракер." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "свалянето се провали:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "IO грешка:Няма място на диска,или не може да създаде файл с големина:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "спрян поради IO грешка:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "спрян поради OS грешка:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "спрян поради вътрешна грешка:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Допълнителна грешка при затварянето поради възникнала грешка:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Не мога да премахна файлът за бързо подновяване след провала:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "сийдване" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Не мога да запиша данните за бързо подновяване:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "изключване" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "Лоша мета-информация - не е речник" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "Лоша мета-информация - неправилни парчета" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "Лоша мета-информация - неправлина дължина на парчетата" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "Лоша мета-информация - неправилно име" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "Името %s е забранено по причини за сигурност" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "единичен/многочастичен файл" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "Лоша мета-информация - неправилна дължина на файла" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "Лоша мета-информация - \"files\"не е списък с файлове" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "Лоша мета-информация - некоректна стойност на файла" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "Лоша мета-информация - неправилен път" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "Лоша мета-информация - неправилен път до директория" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "пътят %s е забранен по причини за сигурност" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "Лоша мета-информация - повтарящ се път" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "Лоша мета-информация - файлът и поддиректорията са с едно и също име" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "Лоша мета-информация - грешен тип на обекта" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "Лоша мета-информация - липсва информация за URL анонс" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "причината за провала е без текст" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "Предупредително не-текстово съобщение" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "невалиден вход на peer листа1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "невалиден вход на peer листа2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "невалиден вход на peer листа3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "невалиден вход на peer листа4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "невалидна peer листа" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "Невалиден интервал за анонс" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "Невалиден минимален интервал за анонс" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "невалиден tracker id" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "Невалиден брой на пиърите" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "Невалиден брой на сийдърите" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "Последното \"въвеждане\" е невалидно" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Порт за следене и слушане" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "Файл за съхраняване на информацията от текущото сваляне" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "време за изчакване преди затваряне на връзката" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "интервал секунди между всяко запаметяване на d-файл" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "секунди за изчакване преди свалянето да се счита за изтекло" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "секунди които свалящите трябва да изчакат между две реанонсирания" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"брой на пиърите по подразбиране до които да се изпрати съобщение с " +"информация в случаи че програмата не го зададе сама" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"време което да се изчака преди да се провери дали връзката не е изтекла" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"колко пъти да се провери дали свалящият е зад NAT протокол (0=не " +"проверявай) " + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "дали да добавям данни за резултатите от nat-проверката в бележките" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" +"минимално време което трябва да измине от последното прочистване за да бъде " +"извършено ново" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"минимално време в секунди преди кешът да бъде счетен за стар и да бъде " +"прочистен" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"позволявай сваляния на торенти само в тази директория (и съответно в " +"поддиректории на тази който не съдържат торент файлове).Ако е включена тази " +"опция, торентите в тази директория се показват на инфостраницата/scrape дали " +"имат или нямат пиъри" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"позволи специални редове в торент файла в позволената_директория да влияят " +"на достъпа до тракера" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "дали да отворя отново файла с бележките при получаване на HUP сигнал" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"дали да изпиша съобщение когато главната директория на тракера е заредена" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "URL към което да пренасоча инфо страницата" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "дали да показвам имена от позволената директория" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"файл съдържащ x-icon данни който да бъде подаден когато браузъра изисква " +"favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"игнорирай параметъра ip GET от машини който не са с локални мрежови IP-та " +"(0=никога,1=винаги,2=само ако NAT проверката е изключена).HTTPproxy който " +"подават адрес на оригиналния клиент се управляват по същия начин като --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"файл за записване на бележки от тракера, за stdout - use (по подразбиране) " + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"използване с позволените_директории; добавя /file?hash={hash} url което " +"позволява на потребителите да свалят торент файла" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"запази неактивните торенти след като срокът им изтече (така те ще бъдат " +"показвани на вашия /scrape и уеб страница). Има смисъл когато няма настройка " +"на позволени_директории" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" +"Позволение за достъп до scrape (може да бъде пълно, специално или забрана)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "максимален брой на пиърите на които да се уважи изискването за връзка" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"Файлът ви сигурно съществува някъде из вселената\n" +"но уви, не и тук\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**Внимание** посоченият favicon файл -- %s -- не съществува." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**Внимание** файлът за състоянието %s е повреден; рестартирам" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Записване на бележки:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**Внимание** не ога да пренасоча stdout към файл с бележки:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Записване на бележки подновено:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**Внимание** не мога да отворя повторно файла с бележките" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "тази специфична scrape функция не се поддържа от този тракер" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "пълно scrape функциониране не е възможно на този тракер" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "Вземи-функция не е възможна на този тракер" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"Свалянето което желаете да извършите не е позволено за използване на този " +"тракер." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "стартирай без аргументи разясняващи параметрите" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Изключвам:" diff --git a/locale/ca/LC_MESSAGES/bittorrent.mo b/locale/ca/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..b51e8d556ded0eb21f865882c7e5c3f270282a99 GIT binary patch literal 64549 zcmdqK2bd*Qng3s+q(O2{QZzKv1JgZ;*aHmBOizGGOg96FINt7iyXP{u?`?0G!0PIn zBbY#3S9eqls2D(37Xxa$YtF3M6|L6Jte*H|%_g2-Z zQzyLVP3JwQ{{67W+?eop*=_)TyP zc=X~VIS4F($Agog(!D60|1)?v=l=#yfcJv~;1x@f`t1)$RH2KNWw7OuY+RDC}Ks=W7sR5>~9oFq9FTnR1(w}E=!n?cp%D*?X;s$4$< zmCs)1CdsAX384CEE2#JF22JZru?_TF6$yMMXpxWVDQ1xwu^EZOZ z?;YX%{b0)ZN5Rv;?+4t!-}74tQl;cV5K>55;0o|9p!)5A%LU1EE2&x=6fnDI|K;`puQ1zK} zL6V#V9swQ&o(YQXE(K2jH-VzZ8mROy4fkIi&R-wyza2C>21V!J04ZAXWAG;Mvz(0cO*MpWjogD`1{_$W6_JZew>%lJYg`oQD9iaN< zlc4(f3*gb<-JqWTNjU#ADEc~Th39_)sCsmRqVux?E(cY<%fP+BYe0?rCxM59TS1NI zr+~`;jiAc$KJZlVOW=v%Z$Q=mh(Uku3{d4<7H}mbF0E zj|F>HIvt$_ZsGhQP~&kosPf+mo(H}URKC9m_m{wQRL=9k>AwaZ!HxSts*?N};u9S&zr^WmJt+Fv23`R^3siZ&4XQl%fpfrLfokVJg9Y#) zn33K)393D>2bJ#ipy=#2Q0@3xQ04svsPZ1T*74AQM}iu6$AaqbQ^0+}rQkl`a!}>F z1XOuO!2`f2gO3593aXyZ08a;B0qQ+>f#MTW;r#2M(tkUge-C7cCij7&!&BFJ`>g`? z{!2j7`6f{BFM!JLI0wcg9|>42XP_+{`Q?tc~3bN7J< zg1-&tdvEZ19}SA`9v9Bf0#&Z_K|Q|$)cc3R^(`Q*BpC-KH{J{?|2x5h!Owyz_-*iP z@K4~G;F&N{^-md8zdaj-RFYdj(ZNqZ_45Ou>VNoU{{9|N?>h$+-`D}_y)On;&fVZ4 z;9Eeo?>~d;mv4j0_a0E`?*|_X{t;At_uu68PeIYuTu|-06cqiw2|N`1PjET-Cs6%3 zFy!xjI;i%19;kZX1nRwS0#(kpf^)%-fNIAdf#SEn1w|i640}Gug39M)@HB7%sOL9> z%C7=4tddD^Z?F;0cY)oUKLuO@z8-}1ldpnmm#)jEbG{I~2z&#$3cMFox#vH@ zuP+2s&Yujbo-YHB2X}+&j}M0Hp90liUjs#N_kgO$Pr!@7UxUi`tZTd<&I4gt$xcw? z_byP+{VOQ`@MZ8E@H?RDdE^rrOW*(~KJX<_<@pwomE_4A)VJ%1`p?riW%Q02S< zd>r@zP;%m%p!mYC!IQxQN4&lZ0-gaDE@C{(S&k4nFEyZ|^}+^?4$w=USk~ z>9fJr;LE`M!Eb>o=Y8P5;7>r6^Vi@i@bqo)B(M(N3m#eV^8Epv!})#_p8w(CT+UAc z)gPCFYKP~5%Kt^6`uFAFx!`T!LhuJ*4|sId-+K|bhV$*={3GD4oc{(K0C(50Ex_-C z2ZH}H>Fxg&Q2GA|RK9yX+399UzzqSn1$-_jdU^w>cK#@MD0p``|3SdtgBlNyt-~|G zF7WTb=YZ<>{ThxZf*S9OLDl;*@Q2_P;K#vbP4B12w7lI90rlSFz%#&J5Ryx-0%6(7 zN5c6r+kJdJ4OIQ!16~Y%9^3>Ty2IsM5$xssR#5f$8rTQk4=w?Z+3D@N798aKCQ#|W z4XWSf?DFz029M_aLhu-HGpO-b1NGh)f};P=gJ*$ru5-C|5vb>ugFgVT21VZ&|Bc&w zBjBl=-w3L|?*#SU{{Tgw2Ry~;MqG#@9! zpx*xkP}fJn{lEsO@;(JT5PS}(c6LdZv&2H-ak1{ope2_uxt3dC&6xx(Ymx^BX~x=L?|d??<4@ z``@7W!`{#Kd=3K(oOgk0?`MJP-&cbdfp>svuU~_D&-~{&U9AP@bN(`L9(WhH2D~5C z`3ss+%=xQ8<@<9m1^0WNkMnup)<47pYQ#054eu=Q(oZtKN&oP^H+mi z;M>7Vz%PJDg2&N_hl2}2jh7Xm%JE9@An;28?*TP#eg^W|ga6BM1@8}P^%dp;{cm17t@6C4FE1aAh91HT4} zu6_wV7W{8e_1W+GKT}r*Ue2wc@^6C2gHHwZ z-dBNVfbRiSo_j#$bJ9zko`ylS^Gm>k!Eb>Ff&U4LzWx9{4m|v&*g)W7@I>%7Q1AN; zcnEkmsPf(iE(CuG4uhw>%=>RAIL7();2iJ)a6Xv4-08O$R6ZAh>W9lf^}|(Q3O)-w z8GIvn82AZLb0z#2H`M!$a@xQO$ogKD4K zL0Cxg3-EHVc9TE@-q-tl^py^r}Gzqdj9j^Dd2%OJKZb-Pvd+ksP~V6 zD&GyD_|{F}+29?Z>iy$z|Ciu_oc|uw`}Td6=QkHre=GtY4{iiM1HKJB2i)=Z{=RpD z%Q^olsO!hQnsEqj0*Ap5fNGaR{=xbBS>Pb&TfuJd9iZC(?tp&*Rln0;-rMnz_99RkXLQr)1R#5GE2dL*i0L}&P2K&K3g1Uar>ztl8f};CT@X=r$ zRJpf@>#qP+-#37wgAah>4<7-Q&u2l=<$dA&ccA+3(AT?MJqc8KxnJ_fuP+y<@+ z*Y5yJdm-n*ajq}C)$_X0FU5&8>sewI@knn1~qOE ze4F>{GH?#(Pv22dX{#z%KAYQ0-9wRgOte_1y(3 z-OIuK!8d?<{x(qMyB*Xx`vj=>`~_6M?tPo5>jIVUTu^jyHh39$A*g5S#}d{0<*4=Ya=s{#5W#@cCd1d^PxN@X&X9`Ckb>n)BVD-g^tE^lt~% zo*xFqcfT6&hu}V({|*#g{{>V#9P_R){y@>eQc(G<2bKOw;2<~-iXLtQRsWBJl1JYI zyTLz!mw>0d+x37dsOR1dE&+cF?gY=c-QRNycrNGf12xWn9UuowK-aQ)Yy=;TkJ((m^kPnUuxaegMK{v8Gn0-p%J0Gt5VfWHGZjxK&L zIwN=`xB`4HsP_E>cqF*jKY9MgfGW>IFa^&8F9078s$FgdPXpfrik`j&D*Zj+A>jRB zANU7Q^`G}XzrPw}SS6Q%dxOK_{PCdbdkv^|eIeKazXU43Rqsy{SZZ=5_!aPX;F;iO z|JnJ>qwaKh&thx@%GsPicUTVZUCpiQ^3PN8u&0cpYx62(cn`-mG?$a?eQj1^!`pz`FsG}2!0Gy zyC42Br<>!!n>l|4sC2zk-oIyp%5OC&{%{qj@pLoz8SrD^Vc_*2_wu|BRJ+~@ie5ef zc7vY*uLOSqicT*17k|$%sB&Hnt^kYR67W`VE%+VqEb#Pyb@}-u@G8z<2`&eJ0jht` z`h@Ef!vSvsmvQ~;U>A7ICq3O#P<-?8;HltFQ0?;?a6j-?@EGuR@CfiT;KATM;J)C` zLDlznpz3$Pr@S6Vfx3PosQN7o=l$SuoUa291h;~Rg4@Bp!RH0M9#sFm0^ARLJ2($~ zFL)IAT~OodH=xS9_osb)9}22}E&*48SA(PA8$gYded(k*;3=T^N*}lxycAS_ydGQ% z{x`S)Jm<4+pN@m4aQ+fd?erdS5%>*I&j9}kkJSzu$ zCa7|~20RG-B&hd&4IBdR1^d8r?}iq@aZv4eGpO=>2;2dF9#ng*{5Pkg4FNZUmva3Y za1(ed_!IDt;OUQozkSuqd&Jj0zqtX=1fa9r z{87Lo{@t%%1gc#sp!)Bn0dE5}ZaxKS{N4-B1^4}~`#~0fcXIw3@MQ4Hd%T^m15f1q zZJ@^2r@)kQegXUt=Rg0R_v1Uh@8jx|;IUl)E;s=G9=sl0`XBzDPlGMa&%M|A`#V6D z_j}+*aG(3=Bk&4P?e$)8HF)3;oZoB))gLWT>E8~n1OF88Qi$+O&R+#C20srT06ywR zUf%;jwaZzc`sFh4`QU57HQ?O)o&P@>+>i6uf~wD(!NaKcM?tm!-9PsCCjaTT=cm9m;O9V%i=%()<8d`O$oX?Y(aq;Tz4yeQxxTXnyovMIg9n4>{oLQT2Hc19 z&7k<)H37GRdS3%n`lo`YfiDJC-uHm2|DE6f?er^9{czSVo$p@@D&MDp9|NBQJ{4T^ zEBc4@p8(&<`B#2TTZ7Mh!1a?ee&hV0462?xLAA%nz;W=Wpz68#x6mc{58x5thrmO@ zFN24G_lD~afY0K5&hMNr-vA!Q`TM~Q;AcR!@A1F)`i+AloL>+2gTDaJ1?T_4m_%`d`mc;`j%SrF%JTUBUg!I6s!-W_};T^^5tfKedtm zZr~8TUc`Ndjw^S-%^Y9knq=OGK>eKpeu3j7{JwCvfp2%<5N3t(@yp!K`ejmW^%lWOpqd8v7@o~=o zC0yIhx&FQq&i|F)7upr%0N36cu73)oYZAIQIhEg6aeN`9dnUjCG5o%e-{ObyZzTLU zgX{YHH*g=0>-c?;UBM>~o)qf6fZuQA_#4t3$?G2_xIh9=27JJ9CVt8b|-ZwGZd67rAyn$3fxR+d;*D#J}J1V;_~1>wn8}3CF3NZ`N<{ zbKnB-0Ma4y?eFe@g4b~WPaOJtG{+mmZ=K)7v5}+2wa0S2NEdT|FXY-5&YuFlk7F0V zSA$oEG{4}t{(c7@3_dTM?+kb{<@yuX-xbc4_D223-^ILyI94Wu|2Umq_x_%G8Ul7j4 zUoYVIux^CEzX|w`+%via8@0dNxQ?huehFSoc@}ZJo%3IFei6U>IP}-#d>e=UDgplv zd@;vL()=^mFXvdo@5hDvKLXF@+DF1UKa*E;{3pkyTwBQT431}V{hw}kl(9#{`cUraBVTTB>e6L7jW;Z z9Q_>nOF1s$SjzEDjyXJk0{6}azY)@$4nCUm`@!Qm{+4u)lM8}5INGzEUI0)L=u;rc*Dkk zoUZ{t#G$_*aD0*DI<9{?q+QGT*ZF-9_$xvsxAIGC<=9@iIg{gYh# zG{5zCNJ#fIKTVc}^Tz~yfb0LlaWCn=$?;Ks9~sg{IEU-!a8lrSEx%WCYzQ|i0c%{- z-)O*}@Oysv-3PAaeTRYPTPo-^+|%hK$Eh5vLz!O8@AVwd=g{97Tz?CA0r>sgb3^>T zk>gjED)>pl@85F$&-^|iHos{PL49?`*DnOJdW#M=Gw>f8{EM8HK6`Z(_w#yCLA4 z`TY%!f8zWBj&Xj!2Rsn`KF4Z~`1ic{11yE-_u+Rx$3Jqug7?I~{|xs($c3ZB?~UNT zoG%8u!9z*Ej^o$-zCEOQI=}UI0O!YXe1hM<3HNmUP2u;Kz|EZR>Kk_r5&bzZ)Fj z`i0@%80U9!oW=Po!IeCFnlcQ3|HZZVH;3OxlkN@R3XWfKyoE!5f7B6vZ?h}pL)w(% zFpigTZ$I!3@Xm1md;C6`-=7EdcRcska6Fmc>p0ei>*wj_oWU!X4{jV@vtfOIGN<0E zraQ{bt!cHE7V6`TbgWiSCkyq$M5$S-r=^{fl|r@9EZ3@yB;~KCyD=~AZlt~XZ?aUX zH}s=XDi!TVvD|2;qqWI$DI_UYb-y*q!>8!^bj?PC{C}5ER%(S}?#hbVj%s#kd2M2{ zLSaZS#0!f_+EXlz6MBW>2wB%Pm*7OK@+Gp&~z&04+0)q1^DZKgd*y1Y_rl&j-u zp;A#fc9g5d+Kxs#QP`D^m3OAit)+CbUK^>DCi;?eU8&J1jF-}}dTqjPHS2}ZZKZlY zFDW-@p=Mf0i{*N0lsD{3y1E-(WLz&5io0kiYToEeSJcv7wN_fLHcQo_$~VgWW+^RH z({hnQl}8Je`Dw8=S>YGgv+Q`JK?-}XWu{_hcb7fr+jbPFt=_e@R%`Gso*Nr0SsRR% zE2XqbZ!SwtN!QlK)1hXePGeFhKd+Z+lcj37FtoMRY}$+I0g`kl-Snonf70EzXso+C zE!L`~`D)C1X`)cBlA1e9#zYzI~=ctU$u=Ox|6bfi!WkU}1#5Xc$IrCg=7 zjnP8ANDtRbPj1nP4J9lVb~)0p_3}td6c8w@r&`+C?B{9AxVBBn8>P`&wP;U3ja7PU zhhO&J^V7*n3lb&YS@H`x#RnfOu?7Gc_jfN`TuistT6MkB&nC)MO3Aqmh2FGCk?2uQ z8B8?QSPi19WC`f-CUnUtD@;z73XCMWaHK>f>-E-TGi4x7lp7-7K4m#D+AMD`H+QKQ zbv{_H*XsJQx>T7I4wbC$?ER4}8Q$JQjdUx?M8<_?I;Xoa=ZadZQZ!nvl(%Wjq~kRa zALECnTc!+ccw1N7`0h)GYZMq3VdEo?jc$7(RS{X~u{ivU^o;ze38{KkgrOtmu%pa~ z9HD_GN>D~~bZdN!*6mqc&}d6b5b1tIKb4~-APAfHrQ(7%Gchu_J zQl8R)4x^TQ#w)cE?oar*o|lSblAZ}zM;Vqv0{8_@U*uPK$leqxFfTd%^c{t|+VAw! zc{1I~3rcGB#`HUC*4&`ZTEHuw&t}w`-MN*I?zGV?)><}xD~wOI8Y6E{&uFkx?QtdR zNYt1tjh4sC43e?J_A+C^a!PxRQS*PXMyu<+#$5V3pKZd5th=aXAit$zr%qAHe2r3u zj*>L|3?^WwoLN_jLQHnh!ud-uTyn0Ko2AOGzNEKzbZcpJ+ZI}KE5%tT8Xqe#zDtc3 z-DyKa1+C6)!lOkMRw{@KR@oCq1Dv5*n3weR^`(v0D2${r)~X~6GY+swtV6~1(RqHW zx($l1UYHC(DLYE_bURWDftJ?B)T`>d?S*osfE4JPL!!xgX?wW_v#H)XJ@Tr9T;fL}5Z|*>RMRJZs!q*bZ~tTBwfGS{mq1 z8|CXteGmEAL=BOs!4aQ(IFD>E73VVwBt7{7sTNDFh~zSvoUH6h1}5vt0IW%pztIXm zqEJRm)+o5Ng=NV=W1BjMB=luN6)F{=a_Eu)>dl=DG@GRf_&+J)HMq+x49XR^{Eg8{ zS&C1yRTqKQ#>S{-YdpCa?dtM1>M(|pT5aZ)I4JDS^dZ@!XT%w*5@YFvlq?^F%6Ud= zSbJ$4THIc!wBWLqM#MZ>K+lvq0rRLLzmtm*i^;{Ua>ZyY444K3J6T>33y^YZFKg24 z8qqOH+9->QGYlE08h$J39ZP8}1ZHF%y>j3(iM#Gb%+N?SMOwftM5i=I9OMm+a&@c; zmNqL6qBir;c-iAm zH5yX?y31*Lc~#xhzA}dt#(by~KV2_T&(jptFOy}3(I>YM?r9Xbs6jg=oVQs+h;Hh& zN`v!K)2euK?pf}_kp23CtkkBn+Mv-mXf?-r&o$elFCD~MfkCLN3Jr;kAeVME7&d8% z8W=U1c1{oNsMly$x+4x+4d+P8aJ4|IBfHSt=!mRJQEz8}OH)^;TE(*xcGSU@{7})< zYYKtS$ZmRysHf4Ktwt%A-dPQn4Fa<$_AAOzhe>M_NoK5ps+m$CrEa*si+n^Ng>*-0 zBps<^?WnPGtVHb)$lEf_R~kuO|&>#fWP40=Z_C9r>2Bp;&prFf%7)tn?Mp ze7?EHA%hBo4`~o(vFVhEvUUZ{0L<|gwZ0U%{97!I*eLqHm|I7a+p7y{1%1CHCC-X5 zJ%>Ff%J&|;0=r6FI+j;9iN>o`;f`XX4@|(9s?EwS=Lxk*vz|MOCY!PIF}sq{R{q^V ze&kxhm_%Vr_W2l!3j!xk7$H3j!l;~q7wFM?ThyOVZ89jzhK@2eWWd4>sEw?}cE`ZB z;J@S2Heh{444BT_QVVRf4ZBuwS*z5-ViZ#@j7SuUIl3O5?@M)H{xv)5D2;jH;slT@ zNJt^k;#VaztV3gum=IB0=UOjj6YO&9)v-1^ZMpA2!^_Nt<>5kW(oRF^%eAd~XrZk$YD2bUcyjMiuL2wtG%$4cJEpI6ErtaYPq09(t`!5}tA*k)T8Ho5Z z&=iqXN={#Im8FJ!E!R|^?ryu@$Nxdci9b?wLg+ZVk#3RQp52v%&dwNb$>5@7aMPv@ zoBHP@gTn)oLc#bp3p^Rb?c$vN@=a@1N%W?mn%ba&d5J#yW5RHc#L1uxyP0)_wEd2e zx^Y%aj!Ab$MA4Wf(kND%zWiHf+(ihCmB(jXwi5c=PEJ-buxU;Q@$VpyC}VzL()smT zYkX^4Gw75seYqSS;d7;tWTl3dsI9}vHJ?^$wjE;i(s-*j9-x|`e#-HLOcT#f%=+Zq?#A5MMA?&l>E$My z=N1~HsanP$rn_MfJ7hf-7pxx`mOo{sxx`GGU_0=3xM{-$3iry%s^H=< zjVtz((+U}{swJysWY7(?G>zj{pk(*(@{N+2Qqd{}(>*aJ`_hdVw}`qK8novl0|);f zqq4XxSzX(qj7^`4^e(n3PSEI27xhb}@!K0#lF}LLn0gvhzKVezhsnI9X}UO<+>|)# zx@LXHW29Qr9|uCt6YF-6mE)maWQ@~fp7o;WCF9AiI9WD(F2I@nX?g77Rm$G=VA`T^caK~hSx*j8IvVdJ*DUBhP&CR>b%;?~*k2NvQ;T4CEjH8|~M^Gph zWrpY{#j2OgY~q*78!TSZ4Q)u*VoJ5-wKq;c3hB{n#QCeWYOmK>GaDERl$T)}i(YQd zg=G}Bp`X%Z%GcP)oL~k9dfftjgqFiOw5F;;>jmb_g&E7t@H6?eC=#x&GMbTDn&=4O z94Ccjk^4-|$>^qfUz!e!mrS(Kh4KBunb5n9$JFqMPt)9UkB8!^#oaHHZrnvzRnx_N zOJwbgn|f2v?n*&`lbc$wMuY?hoF9}qdybLmTtIIw7b2mf&j?}WQ~(B;^bpIBLe&f0cD5_~{S_U=T%r$FAJHcobE3)4xKV`Um4{79EWN2@6 zA9XN~;m;HzI=(fy%-YGW1nXy`&y~usluJ4^cVKJG36q6Qrp}&Vev0A0wbp2k>@o>A zW;$+o42H!d&j^Ynz9VDQ1$Q%#R8Ugp^n|uD?N1a)4R);>z7&3UruZGBou-Qo%Duo0 z7xyjN^X*Uo$gLTo&&dH3kxCUvz>e zjZJ+rbR%nv`XgoATC3CfKEWa_!Dj3|JC_N4JRgk@ItTN@>cLf;SczHEVacX2B^VHq zfWxAK7klWcq2a-Gso7U_N){!Mt{PlFxM^T`a78jyXmUVEWo#(>k@pcRwM}K0IMz0CR8K2K@rT6myMwz)QaIn{9AxyV0cL~9Q>7KIp6ez2IRD- z8l>9UWJ0KvuEOz!z!aA(U*|qvX9-zI3DZ!c5M^I7jQzjOS+W^Gl=x)k!=Y_iLup~W zP)6o7yp_A~f^fB~9ZAxqN%}5kqN}Z#*U98rO0S?_6_JwTIzc^l-MRNp4F)sO z6rDAKEHb8oY<9ad+nKq-h~15uM$Hcc+uXvXo!CVZ^!>b@{Gy@j<3(`<-XEr<7oD9K z|GVO4YKWm&{!9+oESD#40WvYqUrhO^KxiLK)4yX?57Us%*IvrI> z4Kh)v%b&nIAP@~e+#+b*Ov+0}J8|)TQeG=<6^Ad=el`;RM-`HFkx|G)du}w}O)KT7 zsxKW<&6Q@2MC~=IAeg8FK)4v6WAY1R8lCzCHL6-92rQbh z@aGnk-GxQfC^fo*9M{-vVS3k_EiqVHR<5~DlSa95Q|fMHuI4k^vHe5;?z||%%mMVcJz(fgMFwJ^FqBTuoY31j-4H) zxd@@pCN#ZykcJcD-D)^SwRDVSP5qVEiz+qK$uw=*WZ&P!zDFqxFp9f?SwzD_#lQ^|(dB0ofTH93q26 ze8}+bV(wlpp$Hs49+gxJf(yo&2gGsHwQ#yF#IpD(P)9}eQY8v8imA`tndP8nt6)TI3wpwKhi*t32rxaLa0Z$wQOF;MWb zS-+}3U5-MBvSo2##cX5E`jb#Su3iRnK zN)?$l8b8MSu(%?@z`U3+Pi+pM!*_p$m^5~i2qPtYPE)xJf^!sy(wAI?n_q&T=~@p= zG*UHRXBOccXCzI{)_cubi7YZQ7qp8VrAlR4mZdw{HA5*4XL@Y6!oX1T2aKXlEW?zC@QljhllvkCoAiY*o&Y0zo{4XiA)%WIf(f44umAbmaAV&TwRR^w($wkTA3%QV-WpU29JJtkYs{kC9Z1sCrY z^T8=-gr6uH$(GBQb5FM5;lWgcotUty+XajUp&WCFPZ@IRvN0u}=^Efth|k`#8JBQU zNX0ryk5+ASP)6bwzb4MXodlB@9%wGWFdrg%UOha#QSp&GZN^5#Bc2$Ya5|C2Yu3Wl6J$`rfq5w4ScaU1s#4hO+C^ zQ>#F_;ikuIcij$}?T$FgY}XaoxTou~%x1mkYar;9>37=`EVJbs1J-N}MX=eX=U|)< z!Z7Pj{K_gUPSt3QbXtlt9@T_>P+~-%9_KVOl`n-cAw_uD^!p*`ZbYHYX>-@4x0==y zkP_E%G0B2SlHl%uI3P?j1klBz)`VNKZ7gQ7eO9$SxF*o<$9&4s9Noy7%(aWMm=0uT za>K`1b6Y;p!tFnv{Q}q^8}6*Q^`da>c-!VOKm8DvSPFgl27#6nxW|tacympr0Rkx4SLR zNNm)Fn0-22l`0ct+#7T~NqrMY3VIF8XM&Jkmc*dZYHMPIN-|_DPsSwb2?a7g!x-8% zlEqn)CcjmUpf$G5ksutIb+x>*tRow-p;IiO=$I3cB~TuxL06KtLFJgot}yr4NuD+f z(Y{2%DsfVcP}|WWEo95u&3qyV@tnRa1}tS+9oB0o8hEB))r>GwV1h;<2GO ziZo1&XtB=s&VfAPouRkn*YG~3XUuxbO`zkTq`Lyul9%fX6v$`XPHtavibJW)5=r~d zpWAYalES>QBuxUm()J@zZgx*p++7Tdz2g8Z3l<@DnJ{}+)pPQ>+;Jh)s#JzGzuy1}OEuyprq z6)X_Tnp#bj>84pFjceJNt4r;lw#d~xj2?E02hWo27l#xtG9?ge!k#0YN90%=2hEBo z0y>3K!RW0ZzJ@HWjGbqX_S^r=6}yLABt}PRfecd>#Hl#ch}-j`*i(vEtSF7So@I%xl%_O7+@&o99v8hBpj_ zAg9nDv{Y0!q|A`L%{E(vRN_+s)+pskW`~D!3&!oO6U@z`%b)~l@>Q+`i_F%-#r%5B zH5(DzYX7SIu=DZYTo5e&`RQVQhxbrm^;DE$kvv1F)I8i9ZG%X5u;^l(rLxpGXEnvC zuBf`maADmc63!Jflbfgly}jkhzQjhLTp~7<<77*hd>maK97Pg$>1Lg1vYTt!ossDF zw`OD6x)#p3@6R8Vqp7@eUiJWNfDu8jOR$^dTl66J7C*?nB@c4%%Z~z+X^)(|%+o#C+F#dkI%$cg za{O^#vaM8_#5sN%vC|C0#b?Dk#-W_v=22nbM z!ix|mdz-Oe2G{R<|xu_ij8E5gos1=>Z9wL!B8QVteK?^^R&)9d}>i8fMn;=F7nrC^8h%i z6?2COy%(nyk+m#+md_gY7#yl?9-jt{xo`Sw8iX=R6?BUbG^2w6iD?$EOWN?7Ak4+8 zrQKkU6|;QX#%BBNR(JD5VXxc5ChH~z4`~|JX0P(8V<(ka$Y}A;j7TfcY_G8bs|E;# zFwLdeBH2ZuoLSjyqL7rnW{f1+9jO(R1>&L!y>(rK(y&Gq1tv1%y0%YYz{y(2coWm+`WU-@Xk|rbPMCR$ zX)vSNW)fi`qH^-GX$*TxBts?QL>cs=T(rZ7?o4a)SWRDrYz>i^N!Bes*$6&X*VSXp zJlaQtVkb0q6jJ=I_F4d>dPz&kJyH95jKmK<8E(iG=lVpZa0IViyJsT(n8utDZkTR0 zosA{QMS>)#853<#G$MmQxul(icP$bkbQ1&E%`Hh@Yszdu(8Ju1+}Hiv7H>en~*js zpMF#*kZI&*{CSrXp*Joyp*s^i;)Dk5c{80DkezOAVNv1pDiqD7B|oApNwu<8XjQW+ zB-tax-kIqp|AtylBp-+`(TaG6IR%?!Wi=y-9O!R(0xdXzHZl1@LZ-kT24SmK<~(cB ze|U+kmi>UmYtn~RI0=_6ytx~YR3mbnL^0Ho=?J zqV|_WHPvQne0BOo*Y;Rg)Mk0T8T9go& zakDjvg%byrc{h!QsEPYivj=i-&@j=G_G#=ij(&3#X3tG$yKR$Dwlpe0wpl@ldX(J2 zC(guTtnG{}!X_!Mk41}>QD{N0GDb{3L@h=t!St-uQ_*L~5Hz#h)Gx$SR-jB|#b6v; zeq=sth6BSGf|L^DJ3g3IC9iWBI69|mcs2X1^(XD=Tq6TJ7e(-caj(|3U&fUEjJqsz z$>zDu9GEEYOx!<}5yxNS35rTSO|JP*_zB^6Y3NpbEpn0Bgu8B;AC1~tR4?|oFzI`zUM7fqrn#Us3(!8veex+blp;EidX^_{qS1PJlB_YjW-m)l z<1wNXO;1~^6G>ZP~aLa`QoX*(bXHvsh$pV~DK<|#GFBwT2t zk%Fp*ncmw=>uvEIw@BG$k1`P;lYC-1qtV`xv&WPN7<;3voh^(avo^sLi0zv-X=st4 zwfZ|2#BP=zUdDl@zK*L8)YSOB@MZ0(MT~w-!3=Nfn_=bsfAH2ly`)WWxh{b&FmF8S z$Ho$|^7Vo_2jhAscETY}xsjMsE;HICk)O}tuW`N<&Hf=+wDQxN#ZTkjRc!{!`=k~c z-9{1=3E1fBZB6>BbXO&2=n*{YA%G^0r7|NJrRBnQprkCsN*RW!&2Tq~-mEB*Y?~@c z`EbLmC-b=WC#`JGE=CqIy`LuDyk@$Y8YHE~+ScgbJx5FBt3*3b7pR8Iqyk;=H~Rmn zdLe`(x|E~I0^Fphv}1#etYQuIcp_=4k*KC@Yg1hIRlL)KG@?FAYPF3B8D^)4**+yi z-sq~_7;W{yJ41{ri5cigc&q%FfwPMT$Qz=}h|2Z--_-Qlzcc@w$#N^KGzg!?&fm}G zOBMUhoV3NrWO5~R1}l2&HQAnM|MKzpo)o###awV25YLX@H|n{mayErB+bd z@T45fmMU)`D@o+R4Mn>>f;yA zSx3xByON9g7S37jRPdLyF;;#k;scHfddwFr%H_MEU~@bWcNFK5eOP5aRts2`H1NZTyz zTJv~t3>>q)fdP0gX=G4(*!f#P)uj zdZ%WzY%9x=LU||lu2N05uH_f|*b?rr(SD~Fhr0v=;!bF?sH>4~W-pRaHneIcJt`m` zYG|gEPTi`VDzRzFc@mN`hTp>Z0TE_nwuhx_%$rql@3gom>qgaMLKWe`6RMjPg$y)B zOgiPqomyqQRaREmtBkja0;|5+B%#nGv`-HOj@6$~0*V5mw>=SwLjKZg3%;vMsl2l< z-Aq7e%T}(`JCd@0#ME1~tuPIbiQol_P6*zwZHZyWVgKM+vZQ^fGH)+bs1WTjA&rJJ zD%spws>gkU(St_u^Ypj34JKsBPKV~w7E`;`OqiU_{HDRQdDu00Ox_X{e;P=upMA^V z%*nxAr*~$4<6zV%?@im~H?zh|NjE_ywt;YwMuDe>orKAFvP4T5&DBdV49KIzt8kw} zOoq7aXC*D7hsLKqNM`ag+53V{U~l85{B&dlCur7kzo?TsPp{Zx)*(ZGl+jXXKQwD$ zrtL7S0TbrzeN`(Pad+Er(GJ56ZFe`uP^;^rcbSL)i>X=Ym866(kCvzIV8!PIOR0@Q zD|3Ct|Hs}}DHIV#o}Kq19YsG?My75}6?c?wEsH$0zIdFvLm|bvwwPQ4O7H1zgbkAT zF>q~*k?BK%9k~?p#DLP+~F^#z-CQjXw0g(NnpH2D9s3Aq0x~_~^fYB2Bc==+5}yoU=Y# z6w4yD5u12do9dT}{NUMaj$1}zQJ{Lsd0!oIA?78$SDaDegL7D?pL5zEUxd8LI;{oO zzU(yFv>Qx^+n&fp^vWs=E>mR+rJ+NukM5(=D08@g*ozcQ}8P@=8+}yI^^TKcH0NLsPpc zG|WJgYh@pn7Z2Nrp-LjK?c6Oj*i;!3Cl5(y*7XkhhP2GcNV8xkL0gzFmX;IXiBe@Z z)Svda8-tA9C%2~FVwZwLmp4}6Z<<1duGMU?Lyby}YUerPh|Ve*LkjmT(1n+^)YZ~T z0yo4AGD!sW^Up-17>))?K_ugI|7-{1;)*FR@g|8Ym>3)f1{A4`^?OqG*-OXhOXRB7 zFHnhby>%uxXM4MG?&a%Bm;27lG!T0;Zy6B7Py!ZRGEEm5nh2VO!8;3yg1_mn$<~M~ za#NWEiF!_^GnhxdFi{W{(AadBw)aF>1!3S7(Z&WQfgbdE->8`wVU;aDczM)LvNz#4 zjlyheVZ5BZmJ(|lYo-)KIk+H|Mp|AVpj^HKrlhiucD-DIQkrO35Ik0idVITST*PDH z0)sJip^~vFB8ptKFqaIg>2?KN(G%Ppl}4&gnc8i=!aKJYk|8lipKCC}jeTb7R%EZv zsDm~bhiz8R7-ucB(zI?Hm_hN*9>NwD5e|%N(aT_LHzai&{^|~!ydImnZM3W=F{!kD zYB!5g#eZaDxtM+!PfI{#>R4eG_LU2#?qF09gz+h55cI1;+LNPouF6Ih5h{%_DcZGS z9kR8+;(Db<~rk#(q#7}J`6 zFV1C1yIK+pl;r^164R8PIi257u>u1|u`Mz--~;$>SXOgfzB4HLYG}lr(ug59$p9N1d;)}D1@%Bq%PK(n;!&<5jZ|v1ys5cr z)`_V*wefb?h1A)~#3HJW^~%g7^_H7Q)hRZECzDyh?aYV6N0w3~^X0rT&rp4vwSZo7|wLm87WmFQ!4Uy4kKjh zPTPttSHvKY@~UpP$XB#KQJR>#T@*W7Xia}N^buq~F2A5H%TC&;k)tupWVSpXR()b= z#7kgqB4V?r>%^C+aYN7Y!oaSkw}nxpa>)BHO_3h6-V#Ta5S-2zs7>HOxmt%z zrB0a#5__nQ=<00V+K6*XTEf+nynwPc>dsmdquu_ntz$LAVZ`WCMO$idpDauX~UN7oAMjO|V1dbAt-p z*d*A#CCMn!FKdUimwIQ3;5sgce88LE9ZlCa zKA)C0%2*0N?1uPd+WZ{%U1{7T44S=tK*)u9K}y4P;*Z8=C`F`ih^$^#Kv8O0CM z-qUN6WdT3R7{Ig|IKj5bA-+D)L;mFt@osrpjCmOO2C*w~i9c377#+DdfrtjM!N{FH z-3q?I+#PMZE|b=_Ue8i!2X=U%@4>Fywh#NBZ`-Eqx!devJ26r(;oD+kWTGJkbJU)9 zzb4CPa~e`)c4{BWISv!|RW(pkkk7mb7FafAt5A_)YC}6en&rMC(m*~fe>9SRFJUS0 z|b*sDCRdGgOM<$-3l&0Jc?%J(Q&NU`}W$#T} znzTmxO0hNdPBh)QZjEL_D;iJ1TcmAwXGt7Vxg7?3Rc88}n2$lz!=RdB9Fn}W}iXK#$dt+OGCS5%*J}1I^o4{c5x)~>K%igd6#!~%7lx*hSQPLqBm6){tdr)Ba8A6{8vY}Ir2CwMWg}Q>Lqurk~!Jr4CQ<-xmQ!K zymo6{?h0=xM7AMt*%e>44Bk>R6A{1INxtzst}vxbdd@IQdAZN3_!EFVt#IfWtxKd6(3HPwpaa(Ec?=-wkqj< zv#7!k3@u-?#&)d_Uc+R7*AsPJDU8*KFw}A_Z6-V2GPMbo2H(73uN&>|%{It6bA|p9 zmBN8GQ#q_ciTl7vZ5B=612av=^lJv*Bp+=P-P%_6^0mNqaPkm~XWwH}hyjdJB5RL@ zF*`X~O|mf@eH5Y1R+q^MfTxAU04RF6TDc`6u^%18M>Gi&RV89vwdZ|Mzh|*uC~ADp zy*}tbJJEE_^AZ`vQriiCS|+g@u@7l~OqtL*BzFRz<+0#R znyoNMFIOv-K`guI8gj?p&s4+wJ37YWgBSPA{*>v}nPtnaDX#)jN*?W*S;Z!Uh25dg ztNKK!*2Tu=3+1Hhxb<-u5YA~#jtOTYw$6q!51AH}EKLVCPrZ1kzeAT^L}M(5Bw=c< zNQu{kF&rksHNC>z0r3K)on#dz+LKs>2^j>C=7FI`=)l~JxFMi+ml?&mgLEwR)Pf-q zeUVQcp#V~U>|wO#0!?B{8(wyeFip=nyV2CObN4n26@v=?SGXp7!57$wa)2Q>_2vST z<=Rv~^b#yYyi6W+`KfdBMe<-2%kVlDeG^QVYOj4rKN^>s7Z)pz8|y2-z(e$I86Z=4 zwE1#q1}03bfy{TKjyH}vhX!FJhi3wrX*(Kyj3;%;zyqT>S z3aqanD;y%9AulB}>3(n+s+(;~y@WngJ4L@M48~_af*#nOpEaw44OyhVp=JgD+%joA zxa~ACn3I&z;~RRy{ksHH+60Z>2Pulk)Kz}7Fz>HJGV+zS*-J2> zJ4%vRq=`NVP_EfG0d|Ft0%X>JpBES_#5~Z=(MS-5%=P(~>=CyTlC@fMMxB!71Y%nM zx>=r0N3nH3-wVhTR`g%agC;B^#pZ)W7kqn2K_2pR`XsR~My({wtBM>@{~&i;A|nw_ zS7waRz8^64=A1G-F}0hI37DMn0xL;*+&(2x5@j&`RW2YDE0q>821Cd(agCs?PT*LG zHX~m-go+?u#d@q@mI_g44+uRCHescLl5h8A3^EU07M>B)l zDW^4iyGWtNdvG=_Z@&b6i$d%31vVw^pD%DHp0fm-Vu~fAU!&Vj>OFg1$Q#SJ_o)G< zY~hm54b+!R++*O$^JBBU5T{MXYyFgwkLhN7(LfBI)-wm#EN?~Ou%@u_X=-iT5HW_& z%r;{l8SVr}`oE%dy$$v@UeA&QGj_ul4O%jMH}IdxCZk`!qOlO>|Kf0nDZ@Ez)&s7z zut4fHZBzx1Q5a?WX;+yIJtfCMlmZP2qPQWmxoX=A7sYj*TH2( zNmBPDzId@he?SL7W zA6Fnl|I&hM9eJr`{s5obw_G}&)R!0RS^E-$i#yKq&jfLZj1W~LM{H(8_0gub62c1P zpW2O+!l#RPK~#kw#7KH*(`C!BqD^3dFhUCost37?ZY@qK&kN%sHyGQD%D5>7sVEk9 zhT|rV)G$t#As}r6S)(kDrM2p%%s=8Bz?k#|bIZ-B*J)-0Z$(tNawcAk9aK=3`2lR& zF-j`hn3il$ouS7`KDTTZF85vyNT2FonX{OAJN{y3!}XQDbj4sgv_@Zr7$Ep^XzuEP zG<*vpy?p(Ee<4Caq56zrqkz+1exX9|R-(ZB?Wbs|J@IG5+OOwDRhE{q*)AUfma?$g zGUlcELd-%F@}VUWm*Q!tHTkZhPxTQLtnz-^gpf!PHw8h*CEQmusT9%m<-8sa8$TtH zTBr)?JbWknm;_9OOf-cjmh3zOn$^3?JIji0uvs|?dGC)~0s=i=2pOPasFws0g$tzt}z2BEEd{-9l!T=_eS4Kqa(Qyd;86QwGK9}Ug?>TVM)K5R zh!6#2T*KRvQ7(sf;5Zh!XG(sg7s;s>p(bU0vTVH6@qr5u+liBKHibTuSHbUnV6V-r zA591v$JBOqx{q#TC6xn0+&4%X3s^LhGB6E33AGNf$S_2t>?U@^d~s^U?cSbpLM!JO ztw1e2j*qAU^?q^vRMFMx!S0eE6eGSf?Xnost{HDVS(Zk0K(%{Lb%?vXBSutm zq@OedO{5iw!H)6gkefT=GL|X=kxk9c8#oB~Kg$-)E+|}~Plz^y!;mVUNJ^c23KsBW zp2lnOev!#6ukts|Rsj$E4ByiTRq)_G_#Jh~x_6dbLk0f2^2?7+^^svX5WEsrJ57Vd zuY#;L#T0$1P0_glBpzrQsjQ?pN=)Bv>+zAO+X>*bah3z)Bv_{L1>9^8&@BIs?59~s z8sn%9?putrYk_ymrNw3oB2WAuWY@OY+P)(>4$bjs64s1lDq{?u?ug!G^SH1S0KW@7 zpJKZ4v?$mq((p1?mp2F@nqX;Lc(PRa^3JK-2~Z;!RnQ47i}te)!9S`IY&=ZqpecN- zX62?~518(^Wu|6Ut- z@4zl$$u?fBl=5|m?m8KQ>|$yC9{56_(*Nz1w|F*Dd}lppR5Rm^QCV%GE19zAq%N); zgFdC#KP7Jaf(nvTO(8?HZ)-73*AqI44(+mc)^2$-eOBI zf<;lF#KccDv+swrsnx<~Gv5%!WNrbEt9>$rkK4-FF@uF)L9k#>Ox8q0uI|eV9~2o- ztD8<@s)0u&Fq3bitdux0KS_|+ysKHBWJS({#m_{h z@gQ@pxky6UBQuL8r(U~&s$xg1O~6Ce6xEt$_@gvsSHs~#D}HpaD9iC^*SEXLz)k_-}541~JgG&oz-#1<4)Huco% z1zVz)Y2IkH{(+XI8tkkx$x_hcap>d{m9;fQJCRg?=prI|2GtAEkGaA8pJsT((nJ1z zS)=hH0$BVjE~?&jHdDY{&6aGPSh8744t?RF@U*zcf&@O_s$e{Q*hQW?e)y`M-if(*E-eB*^sG`( zU%tRMXGFA_V?*Dd(JUa|FZqK-ZupFReW1Qcsx8 zXUEMM(=mRDx8>xP6NP`Yrm(=5dhw~7@cQ6WY{akE4B;%(J2YEZ@G2TPOS4I~1n;yG z6k#reqQD(A)Uel~KtvZ5;fv&OsiC*)%QmxlC%52b&iS1A#0_&f7KfgQ^J+GU8GbP| zw0N6t@`a+XAKn)EYR6Q5VwzNe^&714=~9eTA%rl9sNhn30LQj|7B6kg&4veAii|Y~ z@?r@wAw^~zUBzu<$0p!ME6hrTq03Z}6!kFff_tSsJBCB4z11%TLnmZUYpoYF1|gF$ zyn-z{ed3COYB1+?5BRuGNg|HtB-7V>sA?gPz8N1KH*iN&D%xu}$LuHiBoNC~AKCy>vMQ=*%TNpf4{=W81 z(}lBFB&#twY9LvN4=RO`IFqfjHWOr_2AF24n7J?IN%urLq0!}m%3scJp*eg0n(A+_ zV2Bhb>Md8_65h{`G%FrRSH1K#P+y8-tA>54K zsnR+OdpCv{Bzi~313B)W)JF6XK*)jz(My7OE431oS}I{0dVk_>V(lqo@t!5iQrTpT z$zm3=vmk>l5rH|k72nS9D48YF{+3cXJWdg4uedxH?=US4i$ZtDk07x-A!d{d z%k#KNBdqp<74-Z-F3!C2roU#J6e1$E+oD1=1=FrnN2`fXP~$vbO1rcpXBRz@e@J6B zucp}T_J&dHeQtAFzCmo}gN(DZagBZ<*`6(R2mvCti;pQA3R@uF25M2Gzz{-6i*ytt zJ!uSx?6CPq)MyCGjN{KNuWY&mol!PUTvwjI-k!B1!(5{NT=}SR$DPiU&hiL>^R1F- z9P`Fnr`v0Ni3byDe1$5rv$pYL!*+-t1>UO)-;&=q7%Jqq_oYHaE z1!2OwYV10Ud$@(u2&OtoBU0X=Drj8EkLa-s^@o>SW!6+b87BJjNPLG~@tI6ET&ruX zozk%1t%s4rlcUO+`Ta6huC6q8C-SugAG+dGUW^JASznW)a{98A?v43$lGq$`pv+;b z8KP3d^pzICYEHJIh0KTmT!xnM0(3?DF%7Vi{}*=Q3gTS_RI}pe_W>O~L!}0fxM=L=Cu(!Z|_&SwxijTIL)t;Vap|fv& zlT9McGma3~K$2Os)Y}2ucuY*RO=G&*S^;@`<(RNa9>`K#6yYm8Ok08GGd5{5LhhzYEaSAMGKrMgN8Tz(vS={H3!z;x z8e_LIwDK|~+f@cml6~PRX+LH$eOfe$oRe+FPC}|_+rUb-$Rx8Ham%Zv!nQ>{IGLno z>0=_=S*f#B8knNJVBSk%gQz<`twmu?p_sZO4cjWyrml46W{`MFyii=DQDT{|F-F^4 zOMM;vKyJ78B^eoZ5e8@m)r<^hdrZR@2a>Ovw~>n~$D7U9;d`b{-O;CB3L1~6WTHMU zIyI)v=Ogu$*jQMg&My<%6H{-|7HeW^?)go^D|rO|=1dhX+U9nGwWdqI^bFf|k{#TeJjJTq;6VrW2c*aHEbE8rwRuPo<7!o6sP2G={XZ{tv zI_h!=#26Wvjnnqm#KJawZADm~b>oDCVNFJthmfPSQtq%iBeCHH!7?f``pRx6PRY?8 zMY=)Hcp2I484sO&KBXz64MvR!rSI0(9E>uAvWNlk!jw=bkQS7yZ8~L zUGfOh>O*EQ=xMDJRyDL6Y5mllglrPf8C|38Hc4jGD|?KMSK@P!yY}7BJvJkRJ+Op) zl8vsu!U!=FcYnfUug1E^R>G88S^>c) zCPQ?N@qsLyBLv1kK|Cu)5I=Szn_0so`gr-08pCkCYelM?*2m%DWgO?-tJKkDn~z<2 zY!s-Kx$k`~hU?!fo?9@)*AE^f1qF&DBkoRwQ(@NJjHp;JXML2k#fY5;12||TL9uYF zgy}equ1xhbSrfDoQw}BFZ9<1+GJ<9(!0mTUPcNzAS!p&ZD!=o@jwGXk{t?uLb~aJB z@lKJ}nbQS%I65O@pM}!KkgD0VMf20dnJay;t^Kw=H&Cp%&(@kml#4NHS5_+5Kil7G z8-j4uo^AhFR6k8^i6WUanI;@4uU#Vb#=g-zGx=DH(Xpn<#%9~&^)=c zFV~ntFn2y4rS0XgwN8;wjM$=)xZI0&W~ryiW1r7g+4Pk+n-pIdB&TR!%JkH2Y!roh z7v0w}7nMJ-Xog+n^Csgo`oczqtXXg_5a#E|PGNBAWw0KUO7w7-6YYtCF{2n|Ap(k{ zAPCa1o58Hbv4LzpW?Ic%VRHBcF9#G4S20f^3b9G$keNm|uOhJ3G@Ph&`pl~4Dl+ZU zt4_aD-7KcSTT>VntU<1RuLQ+F`nqHK%bjB^bs=)Cc*nTXJ2 zzOR+jh>=zn%bXCV?D9mD&_s@fXT$WCZv~Wui){fV!&lo~m^~_r3W7m=7bl*#SKF}! z*OTC&8PItYT>eNigf&S~&vHb8vn(~FLWl`&+u*-Sylh!3h%+$vrzT^?PS}3dp47S_ z`KXOuLqPs5YC?g`q?d(YIy_30wv$e%XZ*|@p*vY)%`>3}9|(k5V%15MSJ+#YGN#uW z#b|!1?3&T&&6$CwLuK7)D;nF9UY%zlOPUr}FIqUkgLI`m-_e!P9Cm4xH{DPmwQNH2 zJp>@DzOgASCz>ThL={HZe%;#vMRJoVk`)OtG3mR4uO6*R(D+^HFD=P5@2~!2`u5iDl zDkQPdZQ75ev}H+ZSBx+bZ+J?cI|6VuJ(634>4CEhKJ$|y)A_(Lo@<4m#2`O??GEE# zwUHZpuI)rDMT)+*d%=6cXw)Yy)C`$!5IJHNNNR&RHaTUFGCyd;NuU$5rs0BDRkHxI zvK4D$jZBx;L9xbmC?I^aVn{MPTvZSoL%#xN@+Csnt}3kiyU_Je+2G|3H(axleaHGxLRiehzWw*`nP zKQ%d5+>GmNDVi=SB2i6{Xq%yW^ssk8)D&^lv(dwc9`;`K=<;*` z&VRG2p>*8NeAJXE2J^Wqf#RYX&Dx_BpLn?*E3s}k$F&r zTwjSZYqrf%&J?He5UcsCc$IVxjZ)*j3H-=rnSG3BU61mjg6(OPGxWuN0{Qao8*i}e z>wY$xv#ABNX=SJVC-C@p%v@NwnP|mA&AdY9j#p%xXisjT@j^Wzp)G5*$(E@4xCYT4 z4PqcnBr+Y5l`YseXe+dW+rZhZyHpBuzgt~tB3`0hI^1FJq+pZjh%stlvQO$4gG9CP zMko~Ve`&z9J&TEb77*@fi$5W(?gky?A|!v2-EYkfqr&i+NGFIpR61YjkK#|hBemw# z9ekq~%~PF1LiVU;;7IsDZc}$Aw$cShqW5lyFzHx;<`42=1epGVf1kq@YHe}LGtLA; zj7#uj`i>HaZ|0@s_sarWpepV0fn70m8`F2Vy3L`*!o(v#k;w`eRiY*R09Q6p7- zKuDj^K>*Fjf=>1=m1s>LACe&W z>;bZtzXJB9{di$xsI_HLm+eZaVkd#4P!+jb`WXY%MIx3n%4}agR7*+!hct6Pv#Muf z%&w59*2LoyHc=Gz>Y2Ke$aL+?*S4c=?!j2p!|>S8bg(DL9cEoLzN0}+TZH%;IzuHz z_m$fx7yL~dNkeE98YSk&kpRz6Gf+5He%&;!C-;R=ajy1QSHV%Z|`wSt+1oZI`n%lTn7H)S*%~t zLKfZtAyT+s7~>q2Kf^NC-#zHV)==8u6z8>yz@_1Xq7_c zWS(lP3^-iw0HZWZ)$JB&$a|2A!*UY{0lU2ZM!phx3BSIEon*+!n-vlbv)L^?{}(NT{^e$Mst&Cr9e)jFi`fMFqi#gRNJr=Nu; zZUVUu_?9Z7hj9Qa+2?x^^9~7&z)Nz@2;3pM1Zd~_GCpC@B6qBdX2{dNkUDhk60U}D z;w4nFi;_Fx4e*B#yU#g2QK#PwW~?kcOh?(XLMo9zuAhE_BXi z-QI#JN8u4@lyO$XQQ;T|!Fdh@WVy;MT!^3m7p5XW<;3FRaK#-Gzn^qFLKDU6yG7n* z!vIElg}%x?R)?Yad{w2CNtynT8{@g5^yZgC2$y9!qT@B0*fE#Z)|Ku?n0bd> zQsWnmUm$}?*LsBJ1dqy!`&!~Gf3!^>qjxM5Q3>U8d(tsyM>v=y&*DSDLSz>JWgK$( zHlxOx?MX8K|B6F^&ROKX&FeexE#X%e+8pRt5z`Sv42H}YoBG-duX@^Nvnpg_AZ^j_tk=1!K zr-x>OG{0V!sur$GS~|prPkQtx66Ex3nRd{J@syrLja7)Sa`wpq7&?s<&Q@mni8NQP zFBW@0, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-17 02:39-0800\n" +"Last-Translator: Raül Cambeiro \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Instal·leu el Python 2.3 o una versió posterior" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Cal que tingueu la versió 2.4 de PyGTK o bé una versió més recent" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Introduïu l'URL del torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Introduïu l'URL del fitxer torrent a obrir:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "marcatge directe" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL o cable amb 128k de pujada" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL o cable amb 256k de pujada" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL amb 768k de pujada" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Velocitat màxima de pujada:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Atura temporalment tots els torrents en marxa" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Continua la descàrrega" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "En pausa" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Cap torrent" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Funcionament normal" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Amb tallafoc o NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Hi ha disponible una nova versió de %s" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Hi ha disponible una versió més recent de %s.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Esteu utilitzant la %s, i la versió nova és la %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Sempre podeu descarregar la darrera versió des de \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Descarrega-la _més tard" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Descarrega-la _ara" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Recorda-m'ho més tard" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Quant a %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versió %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "No s'ha pogut obrir %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Feu un donatiu" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Registre d'activitat de %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Desa el registre a:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "s'ha desat el registre" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "s'ha esborrat el registre" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Configuració de %s" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Desaments" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Desa les descàrregues noves a:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Canvia..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Demana'm on vull desar cada descàrrega nova" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Descàrregues" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Inici de torrents addicionals de forma manual:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "_Atura el darrer torrent en marxa" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Engega el torrent en _paral·lel" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Demana-m'ho cada vegada" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Llavors" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Sembra els torrents completats: fins que la ràtio de compartició arribi a " +"[_] per cent o durant [_] minuts, la primera que s'acompleixi." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Sembra indefinidament" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Sembra l'últim torrent completat: fins que la ràtio de compartició arribi a " +"[_] per cent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Xarxa" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Cerca un port disponible:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "començant pel port:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP que es comunicarà al rastrejador:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(No té cap efecte si no és que us trobeu\n" +"a la mateixa xarxa local que el rastrejador.)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Text de la barra de progrés sempre en negre\n" +"(requereix reiniciar)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Miscel·lània" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"AVÍS: La modificació d'aquests paràmetres pot fer\n" +"que el %s no funcioni correctament." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opció" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valor" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Opcions avançades" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Trieu el directori per defecte per a les descàrregues" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Fitxers a \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Aplica" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Assigna" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "No descarreguis mai" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Redueix" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Augmenta" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nom del fitxer" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Llargada" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Usuaris per a \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Adreça IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Client" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Connexió" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s de baixada" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s de pujada" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB descarregats" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB pujats" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% completat" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s aprox. de baixada de l'usuari" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Identificador de l'usuari" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interessat" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Ofegat" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Rebutjat" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Pujada optimista" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "remot" + +#: bittorrent.py:1358 +msgid "local" +msgstr "local" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "usuari no vàlid" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d correcte" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d incorrecte" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "expulsat" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "correcte" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informació de \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nom del torrent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent sense rastrejador)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URL de publicació" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", en un fitxer" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", en %d fitxers" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Mida total:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Peces:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Resum d'informació:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Desa-ho a:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nom del fitxer:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Obre el directori" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Mostra la llista de fitxers" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "cal arrossegar-los per reordenar-los" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "feu clic amb el botó dret per a accedir al menú" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informació del torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Elimina el torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Cancel·la el torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", s'escamparà durant %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", s'escamparà indefinidament." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Fet. Compartició: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Fet. %s pujats" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Fet" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Informació del torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Obre el directori" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Llista de _fitxers" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Llista d'usuaris" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Canvia la ubicació" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Sembra indefinidament" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "_Torna a començar" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Finalitza" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Elimina" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Cancel·la" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Esteu segur que voleu eliminar \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "La vostra ràtio de compartició d'aquest torrent és del %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Heu pujat %s a aquest torrent." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Voleu eliminar aquest torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Finalitzat" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "arrossegueu-lo cap a la llista per a escampar-lo" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Ha fallat" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "arrossegueu-lo cap a la llista per a continuar" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "En espera" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "En marxa" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Vel. de pujada actual: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Vel de baixada actual: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Vel. de pujada anterior: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Vel. de baixada anterior: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Ràtio de compartició: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s usuaris, %s llavors. Total del rastrejador: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Còpies distribuïdes: %d; Següent: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Peces: %d en total, %d completes, %d parcials, %d actives (%d buides)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d peces dolentes + %s en peticions rebutjades" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% fet, manquen %s" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Velocitat de descàrrega" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Velocitat de pujada" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "No disponible" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s començat" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Obre un fitxer de torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Obre un _URL de torrent" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Crea un _nou torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pausa/Engega" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Surt" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Mostra/Amaga els torrents _finalitzats" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Redimensiona la finestra perquè encaixi" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Registre" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Configuració" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Ajuda" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Quant a" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Feu un donatiu" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Fitxer" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Visualitza" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Cerca torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(aturat)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(múltiple)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Ja s'està descarregant l'instal·lador %s" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Voleu instal·lar el nou %s ara mateix?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Voleu sortir de %s i instal·lar la nova versió, %s, ara?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"L'ajuda per a %s es troba a\n" +"%s\n" +"Voleu anar-hi ara?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Voleu visitar la pàgina web d'ajuda?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Hi ha un torrent a la llista que ja ha finalitzat." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Voleu eliminar-lo?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Hi ha %d torrents a la llista que ja han finalitzat." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Voleu eliminar-los tots?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Voleu treure tots els torrents finalitzats de la llista?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "No hi ha cap torrent que hagi finalitzat." + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "No hi ha cap torrent finalitzat a eliminar." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Obre el torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Canvia la ubicació de desament per" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "El fitxer ja existeix" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" ja existeix. Voleu triar un altre nom per al fitxer?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Desa la ubicació per a" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "El directori ja existeix" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" ja existeix. Voleu crear un directori idèntic a dins del directori " +"existent?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(missatge global) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "Error %s" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"S'han produït molts errors. Feu clic a D'acord per a veure el registre " +"d'errors." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Voleu aturar el torrent actiu?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Esteu a punt d'iniciar \"%s\". Voleu aturar el darrer torrent en marxa també?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Heu fet ja un donatiu?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Benvingut/da a la nova versió del %s. Heu fet ja el vostre donatiu?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Moltes gràcies!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Moltes gràcies per la vostra donació. Per a tornar a fer un donatiu, " +"seleccioneu \"Feu un donatiu\" al menú \"Ajuda\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "obsolet, no ho utilitzeu" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "No s'ha pogut crear o enviar l'ordre pel sòcol de control existent." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "" +"Si tanqueu totes les finestres del %s pot ser que es resolgui el problema." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s ja es troba actiu" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "No s'ha pogut enviar l'ordre pel sòcol de control existent." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "No s'ha pogut iniciar el TorrentQueue. Vegeu els errors més amunt." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "Creador de fitxers torrent %s %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Crea un fitxer torrent per a aquest fitxer o directori:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Tria..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Els directoris es convertiran en torrents per lots)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Mida de la peça:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Utiliza un ras_trejador:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Utilitza una _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Nodes (opcional):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Observacions:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Crea" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Ordinador central" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "S'estan muntant els torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "S'estan comprovant les mides dels fitxers..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Inicia la sembra" + +#: maketorrent.py:540 +msgid "building " +msgstr "s'està muntant" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Fet." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Ja s'han muntat els torrents." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Error" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "S'ha produït un error en muntar els torrents:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dies" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dia i %d hores" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d hores" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minuts" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d segons" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 segons" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "Ajuda del %s" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Preguntes Més Freqüents" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Vés" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Tria una carpeta existent..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Tots els fitxers" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Crea una nova carpeta..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Seleccioneu un fitxer" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Seleccioneu una carpeta" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "No s'ha pogut carregar l'estat desat:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "No s'ha pogut desar l'estat de la interfície:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "El contingut del fitxer d'estat no és vàlid" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "S'ha produït un error en llegir el fitxer" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "no s'ha pogut restaurar per complet l'estat" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "El fitxer d'estat no és vàlid (hi ha una entrada repetida)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "S'han trobat dades corruptes a" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", no es pot restaurar el torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "El fitxer d'estat no és vàlid (hi ha una entrada no vàlida)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "El fitxer d'estat de la interfície no és vàlid" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "La versió del fitxer d'estat de la interfície és incorrecta" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"La versió del fitxer d'estat de la interfície no és compatible (potser " +"pertany a una versió més recent del client?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "No s'ha pogut esborrar el fitxer %s de la memòria cau:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Aquest no és un fitxer torrent vàlid. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Aquest torrent (o un amb el mateix contingut) ja està en funcionament." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Aquest torrent (o un amb el mateix contingut) ja es troba en espera." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "El torrent es troba en l'estat desconegut %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "No s'ha pogut escriure en el fitxer" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "el torrent no es reiniciarà correctament quan es reiniciï el client" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"No es poden tenir en marxa més de %d torrents a la vegada. Per a més " +"informació llegiu les Preguntes Més Frequents a %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"No s'ha iniciat el torrent ja que hi ha altres torrents en espera i aquest " +"ja ha arribat al valor indicat per a deixar d'escampar-se." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"No s'ha iniciat el torrent perquè ja ha arribat al valor indicat per a " +"deixar d'escampar l'últim torrent completat." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "No s'ha pogut obtenir la darrera versió des de %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "No s'ha pogut processar la cadena de la nova versió des de %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"No s'ha pogut trobar una ubicació temporal adequada on desar l'instal·lador %" +"s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "No hi ha cap fitxer torrent disponible per a l'instal·lador %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "Sembla que l'instal·lador %s %s està fet malbé o no hi és." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "No es pot arrencar l'instal·lador en aquest sistema operatiu." + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"directori on es desen dades de variables, tals com la informació sobre el " +"fastresume i l'estat de la interfície gràfica d'usuari. El directori per " +"defecte és el subdirectori \"data\" del directori de configuració del " +"BitTorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codificació de caràcters utilitzada en el sistema de fitxers local. Si es " +"deixa buit, s'intentarà detectar automàticament. La detecció automàtica no " +"funciona amb versions de Python anteriors a la 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Codi d'idioma ISO a utilitzar" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP a comunicar al rastrejador (no té cap efecte si no ys trobeu a la mateixa " +"xarxa local que el rastrejador)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"número de port visible per tothom si és diferent del port que el client " +"escolta localment" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"número de port mínim a on escoltar. Si no està disponible es puja al següent" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "número de port màxim a on escoltar" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP a la qual s'ha d'enllaçar localment" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "temps en segons entre actualitzacions de la informació que es mostra" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minuts a esperar entre les peticions de més usuaris" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "nombre mínim d'usuaris per a no fer una nova petició" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "" +"nombre d'usuaris a partir del qual es deixaran d'iniciar noves connexions" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"nombre màxim de connexions permeses, a partir del qual es tancarà qualsevol " +"altra connexió d'entrada immediatament" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "comprovar els resums (hash) en el disc" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "Vel. màxima permesa de pujada en kB/s. Un 0 indica sense límit." + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "el nombre de pujades per a omplir amb desbloquejos optimistes" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"el màxim nombre de fitxers en un torrent múltiple que es poden mantenir " +"oberts a la vegada; introduïu un 0 si no voleu un límit. S'utilitza per " +"aevitar quedar-se sense descriptors de fitxer." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicia un client sense rastrejador. Ha d'estar activat per tal que es puguin " +"descarregar torrents sense rastrejador." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "nombre de segons entre cada senyal keepalive" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "quants bytes demanar en cada petició." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"longitud màxima del prefix de codificació que acceptareu a la vostra línia. " +"Qualsevol valor més gran farà que es cancel·li la connexió." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "segons d'espera entre el tancament de sòcols que no han rebut res" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "segons d'espera entre comprovacions de si la connexió ha caducat" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"longitud màxima de la peça a enviar als usuaris. Es tancarà la connexió si " +"es rep una petició més gran." + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"màxim interval de temps sobre el qual s'estimaran les velocitats actuals de " +"pujada i baixada" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"màxim interval de temps sobre el qual s'estimarà la velocitat actual de " +"sembra" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"temps màxim d'espera entre missatges de reintent si aquests fallen un cop " +"rere l'altre" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"segons d'espera perquè les dades entrin a través d'una connexió abans " +"d'arribar a la conclusió que la connexió es troba ofegada semipermanentment" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"nombre de descàrregues a partir del qual es passarà d'un sistema aleatori a " +"un sistema d'escollir primer les que tenen menys presència" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "" +"nombre de bytes a escriure d'un cop en les memòries intermèdies de xarxa." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"no acceptar més connexions d'adreces d'usuaris que envien dades incorrectes, " +"sigui per un problema que tenen o per mala intenció" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "no connectar-se a varis usuaris que tinguin la mateixa adreça IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"si és diferent a zero, es col·loca la opció TOS per connexions d'usuaris al " +"valor que s'hagi indicat" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"activar el sistema que evita l'error que hi ha en la libc de BSD que fa que " +"les lectures de fitxers siguin molt lentes." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adreça del proxy HTTP que s'utilitzarà per les connexions amb tracker" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "" +"tancar les connexions amb RST i evitar l'estat TIME_WAIT del protocol TCP" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Utilitzar biblioteques de xarxes Twisted per a les connexions a la xarxa. Un " +"1 significa utilitzar twisted; un 0 significa no utilitzar twisted; i -1 " +"significa autodetectar, amb preferència pel twisted." + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nom del fitxer (per torrents que tenen només un fitxer) o nom del directori " +"(per torrents amb múltiples fitxers) amb què es guardarà, eliminant així el " +"nom que té per defecte. Consulta també l'ús de --save_in. Si no s'especifica " +"res, llavors se li preguntarà a l'usuari a on el vol guardar" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "mostrar interfície d'usuari avançada" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"el nombre màxim de minuts durant els quals vols pujar un torrent que ja " +"t'has baixat abans no deixi de pujar automàticament" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"la relació mínima (com a percentatge) entre bytes pujats i baixats a la " +"s'haurà d'arribar abans no deixi automàticament de pujar. Posa 0 perquè no " +"hi hagi límit." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"la proporció pujar/baixar mínima, expressada com a percentatge, a on s'hagi " +"d'arribar abans no s'aturi la pujada del darrer torrent. Posa 0 si no vols " +"que hi hagi un límit." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Seguir pujant el torrent indefinidament (fins que l'usuari el cancel·li)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Puja el darrer torrent de forma indefinida (fins que el cancel·lis)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "iniciar el programa de descàrregues en estat aturat" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"aquí s'especifica com s'ha de comportar l'aplicació quan l'usuari prova de " +"començar manualmentun altre torrent: \"replace\" significa substituir sempre " +"el torrent que està en funcionament pel nou; \"add\" significa afegir sempre " +"en paral·lel el nou torrent; i \"ask\" vol dir que se li ha de preguntar a " +"l'usuari cada cop." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"el nom del fitxer (per torrents que tenen un sol fitxer) o el nom del " +"directori (per torrents que tenen múltiples fitxers) per guardar el torrent " +"sobreescrivint el nom per defecte. Consulta també el funcionament de l'opció " +"--save_in " + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"el nombre màxim de torrents que es permet pujar simultàniament. Posa -1 si " +"vols un número raonable (s'intentarà que ho sigui) basat en el valor --" +"max_upload_rate. Els valors automàtics només tenen sentit si es posa en " +"funcionament només un torrent a la vegada." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"directori local on es guardaran els continguts del torrent. El fitxer (per a " +"torrents d'un sol fitxer) o el directori (per a torrents amb fitxers " +"múltiples) es crearà en aquest directori utilitzant en nom per defecte " +"especificat en el fitxer .torrent. Consulta també l'ordre --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"si vols que et preguntin o no el lloc on vols guardar els fitxers que et " +"baixes" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"directori local on es guardaran els torrents, amb un nom determinat per --" +"saveas_style. Si es deixa buit, llavors cada torrent es guardarà en el " +"directori del fitxer .torrent corresponent." + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "" +"la freqüència amb què s'escanejarà el directori de torrents. El valor és en " +"segons." + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Com se li posa un nom a un torrent que et baixes: 1: utilitza el nom del " +"fitxer de torrent sense l'extensió .torrent; 2: utilitza el nom codificat " +"dintre del fitxer de torrent; 3: crea un directori amb el nom del fitxer de " +"torrent sense l'extensió .torrent i guarda el torrent en aquest directori " +"amb el nom que es troba dintre del fitxer de torrent; 4: Si el nom del " +"fitxer i el nom que apareix dintre del fitxer .torrent són idèntics, " +"utilitza aquest nom; en cas contrari crea un directori intermedi; AVÍS: les " +"opcions 1 i 2 sobreescriuen fitxers sense avís previ i poden presentar " +"problemes de seguretat." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "si es mostrarà o no la ruta completa o el contingut de cada torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "directori on es buscaran fitxers .torrent (semi-recursivament)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "si es mostrarà o no informació de diagnòstic en stdout." + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "la potència de dos per al valor de la mida de les peces" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nom per defecte del tracker" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"si és fals, llavors crea un torrent sense tracker. En comptes de announce " +"URL, utilitza un node fiable amb l'estructura : o una cadena de " +"caracters buida per buscar nodes de la teva taula de enrutament" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "descàrrega finalitzada" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "es finalitzarà en %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "la descàrrega s'ha realitzat correctament" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB de pujada / %.1f MB de baixada)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB de pujada / %.1f MB de baixada)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d vistos, més %d de còpies distribuïdes (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d de còpies distribuïdes (següent: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d vistos" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ERROR:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "guardant:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "mida del fitxer:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "percentatge realitzat:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "temps restant:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "descarregar a:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "velocitat de descàrrega:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "velocitat de pujada:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "compartit:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "estat del seed:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "estat d'usuari:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "No es pot especificar a la vegada les opcions --save_as i --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "s'està tancant" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Error al llegir el fitxer de configuració:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Error al llegir el fitxer .torrent:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "has d'especificar un fitxer .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "La inicialització GUI en mode de texte ha fallat i no pot continuar." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Aquesta interfície de descàrrega requereix el mòdul estàndard de Python " +"anomenat \"curses\" que no està disponible pel port natiu de Python de " +"Windows. Sí que està disponible per port de Python de Cygwin, que es troba " +"en funcionament en tots els sistemes Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Pots utilitzar el \"bittorrent-console\" per fer les descàrregues." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "fitxer:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "mida:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "destinació:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progrés:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "estat:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "velocitat baixada:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "velocitat pujada:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "compartit:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "seeds:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "usuaris:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d vistos ara, més %d còpies distribuïdes(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "error/s:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "error:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Pujada Baixada Finalitzats Velocitat" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" +"descarregant %d peces; hi han %d fragments; %d finalitzades d'un total de %d " +"peces " + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "S'han produït els següents errors durant l'execució:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Utilització: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "announce antic per %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "cap torrent" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERROR DE SISTEMA - S'HA GENERAT UNA EXCEPCIÓ" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Avís:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "no és un directori" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"error: %s\n" +"funcionen sense arguments per a les explicacions dels paràmetres" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEPCIÓ:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Pots utilitzar \"btdownloadheadless.py\" per fer les descàrregues." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "connectant amb altres usuaris" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Temps estimat en %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Mida" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Descàrrega" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Pujada" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Total:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s usuaris %s seeds %s còpies distribuïdes - %s baixada %s pujada" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "error:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"funcionen sense arguments per a les explicacions dels paràmetres" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" +"comentari opcional a afegir en el fitxer .torrent per ser llegit per persones" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "fitxer d'arribada opcional per al torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr " %s %s - descodificar %s fitxers de meta-informació" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Ús: %s [TORRENTFILE [TORRENTFILE ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "fitxer de meta-informació: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "informació sobre el hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nom del fitxer: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "mida del fitxer:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "fitxers:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nom del directori: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "mida del paquet de fitxers:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "URL del announce del tracker: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "nodes sense tracker:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "comentari:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "No s'ha pogut crear socket de control:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "No s'ha pogut enviar l'ordre:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "No s'ha pogut crear el socket de control perquè ja es troba en ús" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "No s'ha pogut eliminar el nom de fitxer del socket de control antic:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Mutex global ja creat." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "No s'ha pogut trobar cap port obert." + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "No s'ha pogut crear un directori de dades d'aplicació." + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"No s'ha pogut aconseguir el bloquejador de mútex global pel fitxer de " +"control del socket." + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" +"Hi ha una instància anterior de BT que no s'havia esborrat del tot. Es " +"continuarà." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" +"és un string que no està codificat correctament segons el sistema bencode" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" +"valor codificat en sistema bencode no vàlid (dades després del prefix vàlid)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Utilització: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPCIONS][DIRECTORI DEL TORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Si un argument que no és una opció es troba present, es pren com el valor\n" +"de la opció torrent_dir.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPCIONS][FITXERS DE TORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPCIONS][FITXER DE TORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPCIÓ] FITXER TRACKER_URL[FITXER]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "opcions: \n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(per defecte és" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "clau desconeguda" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "s'ha processat un paràmetre en un final sense cap valor" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "el processament de les ordres ha fallat en" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Es requereix l'opció %s" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Has de subministrar com a mínim %d arguments." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Massa arguments - %d és el màxim." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "Format de %s - %s equivocat" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "No s'han pogut guardar les opcions de forma permanent:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" +"El announce del tracer encara no està llest després de %d segons d'iniciar-" +"lo." + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" +"Problema al connectar amb el tracker. Ha fallat l'operació gethostbyname." + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problema al connectar amb el tracker." + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "dades corruptes del tracker." + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "no ha estat admès pel tracker." + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Es cancel·larà el torrent perquè el tracker no l'accepta pel fet que cap " +"usuari hi està connectat." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Missatge del tracker:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "avís del tracker." + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "No s'ha pogut llegir el directori" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "No s'ha pogut iniciar" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "s'està eliminant %s (es tornarà a afegir)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**avís** %s és un torrent duplicat per %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**avís** %s conté errors" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "...ha finalitzat correctament" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "eliminant %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "comprovació finalitzada" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "socket de servidor perdut" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "El sistema de detecció d'errors ha acceptat la connexió:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Cal sortir del programa perquè la pila de TCP s'ha desbordat. Consulteu les " +"Preguntes Més Freqüents a %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" +"És massa tard per activar els RawServer backends, ja que ja s'ha utilitzat %" +"s." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Dilluns" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Dimarts" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Dimecres" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Dijous" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Divendres" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Dissabte" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Diumenge" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Gener" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Febrer" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Març" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Abril" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Maig" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Juny" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Juliol" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Agost" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Setembre" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Octubre" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Novembre" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Desembre" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Comprimit: %i Descomprimit: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"No pots especificar el nom del fitxer .torrent quan generis més d'un torrent " +"a la vegada" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" +"La codificació del sistema de fitxers \"%s\" no és compatible amb aquesta " +"versió." + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"No s'ha pogut convertir el nom del fitxer \"%s\" del directori a UTF-8 (%" +"s). Pot ser que la codificació del sistema de fitxers \"%s\" estigui " +"equivocada o que el nom del fitxer contingui bytes no permesos." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"El nom de fitxer/directori \"%s\" conté valors d'unicode reservats que no es " +"corresponen a caracters." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" +"dades corruptes en el responsefile. La mida total és més petita del que " +"hauria de ser." + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" +"dades corruptes en el responsefile. La mida total és més gran del que hauria " +"de ser." + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "s'està comprovant el fitxer existent" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"La informació de --check_hashes 0 o de fastresume (represa ràpìda) no " +"coincideix amb el estat del fitxer (falten dades)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" +"La informació de fastresume (represa ràpida) no és correcta (els fitxers " +"contenen més dades del que haurien de contenir)." + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" +"Edit La informació de fastresume (represa ràpida) no és correcta (valor no " +"legal)." + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" +"dades corruptes en el disc. Podria ser que tinguessis dues còpies en " +"funcionament?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "No s'han pogut llegir les dades de fastresume (represa ràpida):" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"se li ha dit al fitxer que finalitzi a l'iniciar, però la peça no ha superat " +"la comprovació del hash" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "El fitxer %s pertany a un altre torrent que es troba en funcionament." + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "El fitxer %s ja existeix però no és un fitxer típic." + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lectura curta. Pot ser que hagin quedat truncats els fitxers?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Format de fitxer de tipus fastresume (represa ràpida) que no és compatible " +"amb aquesta aplicació. Potser pertany a una altra versió de l'aplicació." + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Un altre programa sembla que hagi canviat de lloc, canviat de nom o esborrat " +"el fitxer." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Sembla ser que un altre programa ha modificat el fitxer." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Sembla ser que un altre programa ha canviat la mida del fitxer." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "No s'ha pogut configurar el signal handler:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "s'ha deixat \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "s'ha afegit \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "s'està esperant la comprovació de hash" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "descarregant" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Rellegint el fitxer de configuració" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "No s'ha pogut llegir %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"No s'ha pogut descarregar o obrir \n" +"%s\n" +"Prova d'utilitzar un navegador per baixar-te el fitxer de torrent." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Això sembla ser una versió antiga de Python que no és compatible amb la " +"detecció de la codificació de sistemes de fitxers. Se suposarà que la " +"codificació és 'ASCII'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python no ha aconseguit detectar automàticament la codificació del sistema " +"de fitxers. S'utilitzarà el sistema ASCII." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"La codificació del sistema de fitxers '%s' no és compatible. S'utilitzarà el " +"sistema ASCII." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Component de ruta de fitxers dolent:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Aquest fitxer .torrent s'ha creat amb una eina que no funciona bé, i per " +"aquest motiu han aparegut els noms de fitxers mal codificats. Alguns o tots " +"els noms dels fitxers poden apareixer de forma diferent a la que l'autor del " +"fitxer .torrent pretenia." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Aquest fitxer .torrent s'ha creat amb una eina que no funciona bé, i per " +"tant hi han valors de caracter que no es corresponen a cap caracter. Alguns " +"o tots els noms dels fitxers poden apareixer de forma diferent a la que " +"l'autor del fitxer .torrent pretenia." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Aquest fitxer .torrent s'ha creat amb una eina que no funciona bé, i per " +"tant té noms de fitxer mal codificats. Els noms utilitzats, per això, pot " +"ser que segueixin sent correctes." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"El joc de caracters utilitzat en el sistema de fitxers local (\"%s\") no pot " +"representar tots els caracters utilitzats en els nom/s de fitxer d'aquest " +"torrent. Els noms de fitxers han estat canviats de l'original." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"El sistema de fitxers de Windows no pot proecessar alguns dels caracters " +"utilitzats en el/s nom/s de fitxer d'aquest torrent. Els noms de fitxer " +"s'han canviat." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Aquest fitxer .torrent s'ha creat amb una eina que no funciona bé i té com a " +"mínim1fitxer amb un fitxer o directori no vàlid. Tot i això, com que aquests " +"fitxers estaven marcats com de llargada zero, simplement s'han ignorat." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Cal la versió 2.2.1 de Python o una de més recent" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "No es poden iniciar dos instàncies diferents d'un mateix torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "el maxport (port màxim) té un valor menor que el minport (port mínim)" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "No s'ha pogut obrir un port d'escoltar: %s" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "No s'ha pogut obrir un port d'escoltar: %s" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Comprovar la configuració dels ports." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Posada en marxa inicial" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "No s'han pogut carregar les dades de fastresume (represa ràpida): %s" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Es durà a terme una comprovació de hash completa." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "la peça %d ha fallat la prova de hash al tornar-la a descarregar" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"S'ha intentat descarregar un torrent sense tracker amb el programa client de " +"funcionament sense tracker apagat." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "ha fallat la descàrrega:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Error d'Entrada/Sortida: No queda espai en el disc o bé no es pot crear un " +"fitxer d'una mida tan gran:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "s'ha cancel·lat per error d'E/S:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "s'ha cancel·lat per error del sistema operatiu:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "cancel·lat per error intern:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Error addicional al tancar degut a un error:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" +"No s'ha pogut esborrar el fitxer de fastresume (represa ràpida) després de " +"l'error:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "fent un seed" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "No s'han pogut escriure les dades del fastresume (represa ràpida):" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "tancament" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo incorrecta: no és un diccionari" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo incorrecta: clau de peces incorrecta" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo incorrecta: longitud de la peça no permesa" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo incorrecta: nom incorrecte" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "el nom %s no es permet per qüestions de seguretat" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "barreja de fitxers únics i múltiples" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo incorrecta: longitud incorrecta" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo incorrecta: \"fitxers\" no és una llista de fitxers" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo incorrecta: valor de fitxer incorrecte" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo incorrecta: ruta incorrecta" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo incorrecta: directori de ruta incorrecte" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "la ruta %s no és permesa per qüestions de seguretat" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo incorrecta: ruta doble" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo incorrecta: el nom s'ha utilitzat tant pel nom del fitxer com pel " +"nom del subdirectori" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "metainfo incorrecta: tipus d'objecte incorrecte" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo incorrecta: cap cadena de caracters de la URL del announce" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "motiu d'error no relacionat amb el text" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "missatge d'avís no de text" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "entrada no vàlida en la llista d'usuaris 1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "entrada no vàlida en la llista d'usuaris 2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "entrada no vàlida en la llista d'usuaris 3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "entrada no vàlida en la llista d'usuaris 4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "llista d'usuaris no vàlida" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "interval d'announce no vàlid" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "interval d'announce mínim no vàlid" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "Identificador de tracker no vàlid" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "Número d'usuaris no vàlid" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "Número de seeds no vàlid" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "Entrada \"última\" no vàlida" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Port que s'escoltarà." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "fitxer on guardar la informació recent del downloader" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "temps màxim abans de tancar les connexions" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "número de segons entre cada cop que es guarda el fitxer dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "número de segons entre downloaders que caduquen" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" +"número de segons que els downloaders hauran d'esperar entre nous " +"announcements" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"nombre de peers a qui enviar el missatge d'informació per defecte si el " +"client no n'especifica cap" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"temps a esperar per comprovar si alguna connexió ha esgotat el seu temps" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"quants cops s'ha de comprovar si un downloader és darrere d'una NAT (0 = no " +"comprovar)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" +"si s'han d'afegir entrades al log pels resultats de la comprovació de NATs" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" +"temps mínim que ha d'haver passat des de l'últim buidat per fer-ne un altre" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"el temps mínim en segons abans que la cache es consideri saturada i es buidi" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"només permetre descàrregues de fitxers .torrent en aquest directori (i de " +"forma recursiva en subdirectoris de directoris que no continguin fitxers ." +"torrent).Sis'activa, els torrents d'aquest directori apareixeran en la " +"pàgina d'informació indicant si tenen usuaris o no." + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permetre que claus especials en torrents en el directori allowed_dir afectin " +"l'accés dels trackers" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "Si es reobrirà o no el fitxer log al rebre el senyal HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"Si es mostrarà o no una pàgina d'informació quan el directori arrel del " +"tracker s'hagi carregat" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "una URL a on es redireccionarà la pàgina d'informació" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "si es mostraran o no els noms des d'un directori permès" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"fitxer que conté dades x-icon per mostrar quan el navegador demani el " +"favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorar el paràmetre GET de l'IP dels ordenadors que no es trobin en IPs de " +"xarxes locals(0 = mai, 1 = sempre, 2 = ignorar si la comprovació del NAT no " +"està activada). Capçaleres proxy HTTP que donen l'adreça del client original " +"es tractaran de la mateixa manera que l'opció --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"fitxer on s'escriuran els logs del tracker. Cal utilitzar - per stdout " +"(predeterminat)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"utilitza-ho amb allowed_dir; això afegeix una URL de tipus file?hash={hash} " +"que permet als usuaris descarregar el fitxer de torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"mantenir els torrents que estiguin morts encara que hagin caducat (de forma " +"que segueixin apareguent en el /scrape i en la pàgina web). Només té sentit " +"si allowed_dir no està activat" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "permetre accés scrape (hi han vàries opcions: cap, específic o total)." + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "nombre màxim d'usuaris a mostrar per una petició" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"el teu fitxer pot ser que existeixi en algun altre lloc de l'univers\n" +"però està clar que aquí no hi és\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**avís** El fitxer \"favicon\" especificat (%s) no existeix." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**avís** El fitxer d'estat %s està fet malbé; es procedirà a reiniciar" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Log iniciat:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**avís** No s'ha pogut redireccionar el stdout al fitxer log:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Log reobert:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**avís** No s'ha pogut tornar a obrir el fitxer log" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "la funció scrape no està disponible amb aquest tracker" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" +"la funció scrape no està disponible en tota la seva totalitat amb aquest " +"tracker." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "l'opció \"get\" no està disponible amb aquest tracker." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"La descàrrega que has demanat no es permet utilitzar amb aquest tracker." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" +"executa sense opcions addicionals per a rebre explicacions dels paràmetres" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# S'està tancant" diff --git a/locale/cs/LC_MESSAGES/bittorrent.mo b/locale/cs/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..3654e6ff98c90b1cfd46d2341aba6e2c144800bd GIT binary patch literal 48881 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 F{{e99;}8G< literal 0 HcmV?d00001 diff --git a/locale/cs/LC_MESSAGES/bittorrent.po b/locale/cs/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..f9fda6b --- /dev/null +++ b/locale/cs/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2820 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-20 22:53-0800\n" +"Last-Translator: Matt Chisholm \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Nainstalujte Python 2.3 nebo novější" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Je vyžadován PyGTK 2.4 nebo novější" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Zadejte URL torrentu." + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Zadejte URL otevíraného souboru torrent:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "vytáčené připojení" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "Kabel DSL, odesílání 128 kB" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "Kabel DSL, odesílání 256 kB" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL, odesílání 768 kB" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maximální odchozí rychlost:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Dočasně pozastavit všechny spuštěné torrenty" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Obnovit stahování" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pozastaveno" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Žádné torrenty" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Běží normálně" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Použit firewall/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Ke stažení je k dispozici nová verze %s. " + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Je k dispozici novější verze %s .\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Používáte verzi %s a nová verze je %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Poslední verzi můžete získat vždy z \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Stáhnout _později" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Stáhnout _teď" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Upozornit později" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "O programu %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Používáte verzi: %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Nelze otevřít %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Podpořte vývoj finanční částkou, klepněte zde" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Protokol aktivit %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Uložit protokol do:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "Protokol uložen" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "Protokol vymazán" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Nastavení %s " + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Ukládá se" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Ukládat nová stahování do:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Změnit..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Vždy se zeptat, kam uložit nové stahováni" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Stahuje se" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Další torrenty se spouští ručně:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Vždy zastaví _poslední spuštěný torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Vždy spustí torrent _souběžně" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "Vždy se _zeptat" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Sdílí se jako kompletní zdroj" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Sdílet kompletní torrenty: dokud poměr sdílení nedosáhne [_] procent nebo po " +"dobu [_] minut, podle toho, co nastane dříve." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Sdílet bez omezení doby trvání" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Sdílet poslední úplně stažený torrent: dokud poměr sdílení nedosáhne [_] " +"procent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Síť" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Najít přístupné porty:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "začít na portu:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "Adresa IP odeslaná trackeru:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Tato volba nemá žádný efekt, je-li\n" +"tracker na stejné síti jako vy)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Indikátor průběhu je vždy černý\n" +"(vyžaduje se restart aplikace)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Různé" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"UPOZORNĚNÍ: Změna těchto nastavení může způsobit\n" +",že %s přestane fungovat správně." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Volba" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Hodnota" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Rozšířené" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Zvolte standardní adresář pro stahování" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Soubory v \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Použít" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Vyhradit" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nikdy nestahovat" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Snížit" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Zvýšit" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Název souboru" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Délka" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Stahující pro \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Adresa IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Klient" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Připojení" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "kB/s - stahování" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s - odesílání" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB staženo" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB odesláno" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% hotovo" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "kB/s prům. stahování stahujícího" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID stahujícího" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Zaujatý" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Zanesený" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Ignorovaný" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistické odesílání" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "vzdálený" + +#: bittorrent.py:1358 +msgid "local" +msgstr "místní" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "špatný stahující" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d v pořádku" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d špatně" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "zakázaný" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "v pořádku" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Info o \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Název torrentu:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent bez trackeru)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Oznamující adresa:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", v jednom souboru" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", v %d souborech" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Celková velikost:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Části:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Informativní hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Uložit v:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Název souboru:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Otevřít adresář" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Zobrazit seznam souborů" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "přetáhnutím myší uspořádejte jinak" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "stisknutím pravého tlačítka zobrazíte nabídku" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informace o torrentu" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Odebrat torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Zrušit torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", bude sdílen do %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", bude sdílen natrvalo." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Dokončeno, poměr odeslání/stažení je: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Dokončeno, odesláno %s" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Dokončeno" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Informace o torrentu" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Otevřít adresář" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Seznam souborů" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Seznam _stahujících" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Změnit cílovou složku" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Sdílet na neurčito" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "_Restart" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Dokončit" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Odstranit" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Zrušit" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Jste si naprosto jisti, že chcete odstranit \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Váš poměr sdílení pro tento torrent je %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Již jste vyslali %s do tohoto torrentu." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Odstranit tento torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Dokončeno" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "přetáhněte torrent myší do seznamu, chcete-li ho sdílet" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Chyba" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "přetáhněte torrent myší do seznamu, chcete-li pokračovat" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Čekám" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Spuštěný" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Aktuální odesílání: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Aktuální stahování: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Předchozí odesílání: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Předchozí stahování: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Poměr odesílání/stahování: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s stahujících, %s sdílejících uživatelů. Celkem z trackeru: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Distribuovaných kopií: %d; Další: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Částí: %d celkem, %d dokončeno, %d částečně, %d aktivních (%d prázdné)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d špatných částí + %s ve zrušených požadavcích" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% dokončeno, %s zbývá" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Rychlost stahování" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Rychlost odesílání" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Není použito" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s spuštěn" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Otevřít soubor torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Otevřít _URL torrentu" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Vytvořit _nový torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pozastavit/Spustit" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Ukončit aplikaci" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Zobrazit/Skrýt _dokončené torrenty" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Změnit velikost okna na vyhovující" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Protokol" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Nastavení" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Nápověda" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_O aplikaci" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Přispějte na vývoj" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Soubor" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Zobrazit" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Hledat torrenty" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(zastaveno)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(vícenásobné)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Už staženo %s instalátoru" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Instalovat nový %s hned?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Ukončit %s a instalovat novou verzi, %s, nyní?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s nápověda je na \n" +"%s\n" +"Chcete navštívit tuto stránku již nyní?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Navštívit webovou stránku nápovědy?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "V seznamu je jeden dokončený torrent." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Chcete ho odstranit?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "V seznamu je %d dokončených torrentů." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Chcete je všechny odstranit?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Odstranit všechny dokončené torrenty?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Žádné dokončené torrenty" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Nejsou žádné dokončené torrenty pro odstranění." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Otevřít torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Změnit adresář pro ukládání na" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Soubor již existuje!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" již existuje. Chcete použít jiný název souboru?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Adresář pro uložení" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Adresář existuje!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" již existuje. Chcete vytvořit stejně pojmenovaný adresář uvnitř " +"tohoto adreáře?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globální zpráva): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "Chyba %s" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Objevilo se několik chyb. Stisknutím OK zobrazte protokol chyb." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Zastavit spuštěný torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "Chystáte se spustit \"%s\". Chcete zastavit poslední spuštěný torrent?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Přispěli jste již na vývoj?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Vítá Vás nová verze %s. Přispěli jste již na vývoj?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Děkujeme!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Děkujeme za finanční příspěvek! Pokud budete chtít přispět znovu, zvolte " +"\"Přispějte na vývoj\" v nabídce \"Nápověda\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "toto není schválené, nepoužívat" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Nepovedl se vytvořit nebo odeslat příkaz přes existující kontrolní socket." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Uzavření všech %s oken by mělo vyřešit váš problém." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s je již spuštěn" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Nepovedlo se odeslat příkaz přes existující kontrolní socket." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Nelze spustit TorrentQueue, viz chyby výše." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s vytvářeč souborů torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Vytvořit soubor torrent pro tento soubor/adresář:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Zvolte..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Adresáře se stanou skupinou torrentů)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Velikost části:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Použít _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Použít _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Uzly (volitelné):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Komentáře:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Vytvořit" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Název hostitele" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Vytváří se torrenty..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Zjišťuje se velikosti souborů..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Spouští se sdílení" + +#: maketorrent.py:540 +msgid "building " +msgstr "vytváří se" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Dokončeno." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Dokončeno vytváření torrentů." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Chyba!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Chyba při vytváření torrentů:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dní" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 den %d hodin" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d hodin" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minut" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d vteřin" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 vteřin" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Nápověda" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Často kladené dotazy (FAQ):" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Přejít" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Zvolte existující adresář..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Všechny soubory" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrenty" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Vytvořit novou složku..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Zvolte soubor" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Zvolte adresář" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Nelze načíst uložený stav:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Nelze uložit stav uživatelského rozhraní:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Neplatný stav obsahu souboru" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Chyba při čtení souboru" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "nelze úplně obnovit předchozí stav" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Neplatný stavový soubor (duplicitní záznam)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Poškozená data v" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", nelze obnovit torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Neplatný stavový soubor (špatný záznam)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Špatný soubor se stavy uživatelského rozhraní" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Špatná verze souboru se stavy uživatelského rozhraní" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Nepodporovaná verze souboru se stavy uživatelského rozhraní (z novější verze " +"klientu?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Nelze odstranit úložiště %s souboru:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Toto není platný soubor torrent. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Tento torrent (nebo jiný se stejným obsahem) již je spuštěn." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Tento torrent (nebo jiný se stejným obsahem) již čeká na spuštění." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent je v neznámém stavu %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Nelze zapsat soubor" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrent nebude restartován správně během restartu klientu" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Nelze spustit více než %d torrentů najednou. Více informací viz často " +"kladené dotazy (FAQ) na: %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Torrent se nespustí, protože ostatní torrenty čekají na spuštění a tento již " +"splnil podmínky určené v nastavení pro zastavení sdílení." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Torrent se nespustí, protože již splnil podmínky určené v nastavení pro " +"zastavení sdílení." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Nelze získat poslední verzi z %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Nelze analyzovat textový řetězec nové verze v %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "Nelze najít vhodné dočasné umístění pro uložení %s %s instalátoru" + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "K dispozici není žádný torrent pro %s %s instalátor." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "Instalátor %s %s se zdá být poškozený nebo chybí." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Nelze spustit instalátor na tomto operačním systému" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"adresář, kde se budou ukládat soubory obsahující informace o rychlém " +"obnovení torrentu a stavový soubor uživatelského rozhraní. Výchozí adresář " +"je \"data\" v adresáři s nastavením BitTorrentu." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"znakové kódování použité v místním souborovém systému. Pokud není vyplněno, " +"bude kódování detekováno automaticky. Automatická detekce nefunguje s " +"pythonem starším než 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Kód ISO jazyka, který se má použít" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"Adresa IP odeslaná trackeru (tato volba nemá žádný efekt, je-li tracker ve " +"stejné síti jako vy)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"port viditelný zvenčí, je-li jiný než místní, na kterém klient naslouchá" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"minimální port, na kterém se má naslouchat, přičítá se, je-li nedostupný" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "maximální port, na kterém se má naslouchat" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP, která se má nastavit jako místní" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekund mezi aktualizací zobrazovaných informací" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minut čekání mezi požadavky více stahujících" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "minimální počet stahujících pro nezasílání nového požadavku" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "počet stahujících, u kterého se zastaví navazování nových spojení" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maximální povolený počet připojení, po překročení budou další připojení " +"okamžitě ukončena" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "zda kontrolovat hashe na disku" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maximální rychlost odesílání v kB/s, 0 nenastaví žádný limit" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "počet odesílání, které vyplnit velmi optimistickými uvolňováními" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"maximální počet souborů ve vícesouborovém torrentu, které jsou otevřené " +"najednou, 0 znamená bez omezení. Zabrání se tím vyčerpání popisovačů souborů." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicializovat beztrackerový klient. Toto musí být povoleno pro stahování " +"beztrackerových torrentů." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "počet sekud přestávky mezi udržováním odesílání" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "na kolik bajtů se dotázat pro jeden požadavek." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"Nejvyšší přijatelná délka kódování předpony - větší hodnoty přeruší spojení." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "sekund čekání mezi uzavíráním socketů, kterými nebylo nic přijato" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"sekund čekání mezi zjišťováním, zda některé navázané připojení nebylo " +"ukončeno z důvodů překročení časového limitu" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maximální délka části k zaslání stahujícím, ukončit připojení, je-li přijat " +"větší požadavek" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"maximální časový interval odhadu aktuální hodnoty odesílání a stahování" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "maximální časový interval odhadu aktuálního poměru sdílení" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "maximální doba čekání mezi pokusy oznámení, pokud jsou stále chybná:" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"počet sekund čekání na příchozí data, než bude spojení považováno za " +"neprůchodné" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"počet stahování, od kterých se má přepínat z náhodného na nejbližší první" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "kolik bajtů zapsat najednou do vyrovnávací paměti sítě" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"odmítnout další připojení z adres s poškozenými nebo záškodnickými " +"stahujícími, kteří posílají nesprávné údaje" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "nepřipojovat ke stahujícím se stejnou adresou IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"pokud je nenulové, nastaví hodnotu TOS pro spojení stahujících na tuto " +"hodnotu" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"povolit provizorní řešení při chybě v knihovně BSD, které velmi zpomalí " +"čtení souborů" + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adresa proxy HTTP používaná pro připojení k trackerům" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "ukončit spojení s RST a zabránit stavu TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Použít pokroucené síťové knihovny pro síťové spojení.\"1\" znamená použít,\"0" +"\" znamená nepoužít,\"-1\" zapne automatickou detekci a dá přenost pokroucené" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"název souboru (pro jednosouborové torrenty) nebo název adresáře (pro dávkové " +"torrenty) pro ukládání torrentu, který přepíše výchozí název uvedený v " +"torrentu. Viz. také --save_in, pokud to není nikde uvedeno, uživatel bude " +"dotázán na místo uložení" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "zobrazit rozhraní pro zkušeného uživatele" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "maximální počet minut před ukončením sdílení zcela staženého torrentu " + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"nejnižší hodnota poměru odesláno/staženo v procentech, po dosažení bude " +"zastaveno sdílení. 0 znamená bez limitu." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"nejnižší hodnota poměru odesláno/staženo v procentech, po dosažení bude " +"zastaveno sdílení posledního torrentu. 0 znamená bez limitu." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Sdílet všechny stažené torrenty natrvalo(dokud uživatel sdílení ručně " +"nezastaví)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Sdílet poslední stažený torrent natrvalo (dokud uživatel sdílení ručně " +"nezastaví)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "spouštět stahovač v pozastaveném stavu" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"určuje jak se má aplikace zachovat když uživatel ručně zkusí spustit jiný " +"torrent: \"nahradit\" znamená vždy zaměnit běžící torrent novým, \"přidat\" " +"znamená vždy souběžné spuštění torrentu a \"zeptat se\" znamená vždy se " +"zeptat uživatele." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"název souboru (pro torenty obsahující jeden soubor) nebo název adresáře (pro " +"skupinové torrenty) pro uložení torrentu po jiným názvem, a tím nahradit " +"původní název. Podívejte se také na --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"Maximální počet současně odesílaných souborů. Bude-li zadána hodnota -1 bude " +"zvolen ideální počet v závislosti na hodnotě --max_upload_rate (maximální " +"datová propustnost směrem ven). Automatická nastavení bývají dostatečně " +"účinná, pouze pokud probíhá jediné stahování torrentu v jednom okamžiku." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"Místní adresář, do kterého budou ukládány všechny stahované torrenty. " +"Torrenty obsahující jeden soubor budou uloženy přímo do tohoto adresáře, " +"torrenty o více souborech do podadresáře (jeho název bude převzat z názvu " +"souboru .torrent souboru). Podívejte se také na --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"ovlivní, zda se bude program dotazovat uživatele na umístění stahovaných " +"souborů" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"definuje adresář, do kterého budou stahované torrenty ukládány pod názvem " +"předepsaným hodnotou --saveas_style. Pokud není tato hodnota vyplněna, bude " +"každý torrent uložen do adresáře, jehož název bude převzat z názvu " +"příslušného souboru .torrent." + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "jak často prohledávat složku torrentů (v sekundách)" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Jak pojmenovávat stažené torrenty: 1: použít název souboru torrent (bez ." +"torrent); 2: použít název zakódovaný v souboru torrent; 3: vytvořit adresář " +"s názvem podle souboru torrent (bez .torrent); 4: jestliže název souboru " +"torrent (bez .torrent) a název zakódovaný v souboru torrent jsou stejné, " +"použijte název způsob 1 či 2), jinak vytvořte adresář, jako ve způsobu 3; " +"VAROVÁNÍ: možnosti 1 a 2 mohou přepsat soubory bez varování a mohou " +"způsobovat bezpečnostní problémy." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "zda zobrazovat celou cestu nebo obsah torrentu pro každý torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "Adresář pro vyhledání souborů .torrent (částečně opakovatelný)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "" +"ovlivní, zda budou zobrazovány diagnostická hlášení a informace do " +"standardního výstupu (stdout)" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "na jakou mocninu dvou se má nastavit velikost kusu " + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "výchozí název trackeru" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"pokud má hodnotu nepravda (false), vytvořte místo oznámeného URL torrent bez " +"trackeru, použijte spolehlivý uzel ve tvaru : nebo použijte " +"prázdný řetězec, aby se načetly určité uzly z vaší směrovací tabulky" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "stahování dokončeno!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "dokončení v %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "stahování proběhlo úspěšně" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB ven / %.1f MB dovnitř)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB ven / %.1f MB dovnitř)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "Doposud %d, navíc %d distribuovaných kopií (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d distribuovaných kopií (další: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d nyní viděno" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "CHYBA:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "ukládání:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "velikost souboru:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "procent dokončeno:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "zbývající čas:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "stáhnout do:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "rychlost stahování:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "rychlost odesílání:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "rychlost sdílení:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "Stav sdílení" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "stav stahujícího uživatele:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Nemůžete použít současně --save_as a --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "vypíná se" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Chyba čtení konfigurace:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Chyba čtení souboru .torrent:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "musíte blíže určit soubor .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Inicializace GUI v textovém módu selhala, nelze provést." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Toto stahovací rozhraní potřebuje standardní modul Pythonu \"curses\", který " +"bohužel není přirozenou součástí instalace Windows. Je však částí " +"implementace Pythonu pod Cygwinem, který lze spustit na všech Win32 " +"systémech (www.cygwin.com). " + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Stále ještě můžete pro stahování použít \"bittorrent-console\"" + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "soubor:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "velikost:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "cíl:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "průběh:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "stav:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "rychlost dovnitř:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "rychlost ven:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "sdílení:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "sdílené zdroje:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "Vrstvy" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d viděn,plus %d distribuované kopie(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "chyby:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "chyba:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Vysílaná Stahovaná dokončená rychlost" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "stahování %d kusů,mělo %d úlomků,%d z %d kusů dokončeno" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Tyto chyby se vyskytly během provádění:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Použití: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "staré oznámení pro %s:%s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "žádné torrenty" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTÉMOVÁ CHYBA - GENEROVÁNA VÝJIMKA" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Varování:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "není adresář" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"chyba: %s\n" +"spusťte bez ?args? pro vysvětlení" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"VÝJIMKA:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Můžete stále používat \"btdownloadheadles.py\" pro stahování." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "připojování ke stahujícím" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "ETA v %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Velikost" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Stahování" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Vysílání" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Součty:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s stahujících %s sdílejících %s distr. kopií - %s dovnitř %s ven" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "chyba:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"Spusťte bez ?args? parametrů pro vysvětlení" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "volitelný čitelný komentář pro vložení do .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "volitelný cílový soubor pro torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - rozpoznáno %s metainfo souborů" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Použití: %s [TORRENTFILE [TORRENTFILE ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "metainfo soubor: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "info hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "jméno souboru: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "velikost souboru:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "soubory:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "jméno adresáře: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "velikost archivu:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "oznamovací adresa trackeru: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "nodů bez trackeru:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "poznámka:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Nelze vytvořit řídící socket:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Nelze zaslat příkaz:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Globální mutex již byl vytvořen." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Nemohu najít žádný otevřený port!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Nemohu vytvořit adresář pro data aplikace!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Nemohu získat globální mutex zámek pro soubor kontrolního socketu!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "Minulá instance BT nebyla pořádně vyčištěna. Pokračuji." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Použití: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "neznámý klíč" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Příliš mnoho parametrů - maximálně %d." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Nemohu permanentně uložit volby:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Oznámení trackeru ještě stále není dokončeno %d vteřín po spuštění" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problém během připojování na tracker, gethostbyname() selhal -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problém s připojováním na tracker -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "špatná data z trackeru -" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "odmítnuto trackerem -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... úspěšný" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "odstraňování %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "kontrola ukončena" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "ztracen socket serveru" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Chyba v řízení povoleného připojení:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Musím ukončit aplikaci kvůli odpadávání TCP stack. Prosím přečtěte si často " +"kladené dotazy (FAQ) na %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Pondělí" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Úterý" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Středa" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Čtvrtek" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Pátek" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sobota" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Neděle" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Leden" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Únor" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Březen" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Duben" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Květen" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Červen" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Červenec" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Srpen" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Září" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Říjen" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Listopad" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Prosinec" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Zkomprimováno: %i Nezkomprimováno: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Nemůžete specifikovat název .torrent souboru když vytváříte více torrentů " +"najednou" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Kódování systému souborů \"%s\" není podporováno v této verzi" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Nemohu přejmenovat soubor/adresář \"%s\" do utf-8 (%s). Buď je převzaté " +"kódování systému souborů \"%s\" špatné nebo název souboru obsahuje špatné " +"bajty." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Soubor/jméno složky \"%s\" obsahuje rezervované hodnoty unicode to " +"neodpovídá znakům" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "kontrola existujícího souboru" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "stahování" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Nelze přečíst %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Nelze stáhnout nebo otevřít\n" +"%s\n" +"Zkuste použít internetový prohlížeč pro stáhnutí torrent souboru." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Zdá se to být stará verze Pythonu, která nepodporuje detekci kódování " +"systému souborů. Předpokládá se 'ascii'.\t" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python selhal při autodetekci kódování systému souborů. Použije se 'ascii' ." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Systém kódování souborů '%s' není podporován. Použije se 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Chyba v části cesty k souboru:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Tento .torrent soubor byl vytvořen špatným nástrojem a má nesprávně " +"zakódované názvy souborů. Některé nebo všechny z názvů souborů se proto " +"mohou zobrazit odlišně než autor .torrent souboru zamýšlel." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Tento .torrent soubor byl vytvořen špatným nástrojem a má nesprávně " +"zakódované hodnoty znaků, které neodpovídají žádnému znaku. Některé nebo " +"všechny z názvů souborů se proto mohou zobrazit odlišně než autor .torrent " +"souboru zamýšlel." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Tento .torrent soubor byl vytvořen špatným nástrojem a má nesprávně " +"zakódované názvy souborů. Názvy přesto mohou být správné." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Znaková sada použitá na místním souborovém systému (\"%s\") neumí " +"reprezentovat všechny znaky použité v názvu(ech) souborů tohoto torrentu. " +"Jména byla změněna oproti originálu." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "je potřeba Python 2.2.1 nebo novější" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maximální port je větší než minimální port - žádné porty ke zjišťování" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Nemohu otevřít naslouchající port: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Nemohu otevřít naslouchající port: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Přezkoumejte vaše nastavení rozsahu portů." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "První spuštění" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Nemohu načíst data pro rychlé obnovení: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Proběhne kompletní hash kontrola." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "část %d neprošla hash kontrolou, znovu jí stahuji" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Pokus stáhnout beztrackerový torrent s vypnutým beztrackerovým klientem." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "stahování selhalo:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"IO Chyba: Není dostatek místa na disku, nebo nemůžu vytvořit tak velký " +"soubor:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "ukončeno IO chybou:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "ukončeno chybou OS:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "ukončeno vnitřní vyjímkou:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Dodatečná chyba při uzavírání kvůli chybě:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Nemohu odstanit soubor rychlého obnovení po selhání:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Nemohu zapsat data pro rychlé obnovení:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "vypnout" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "kolikrát zkusit zda stahující je za NAT (0 = nezkouštet)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "přidávat do záznamu výsledky zkoušek zda je uživatel za NAT" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "minimální časové rozpětí ve vteřinách mezi splachováním cache" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"minimální čas ve vteřinách kdy se cache může označit jako staré a spláchnout" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"povolit stahování .torrent souborů které jsou pouze v tomto adresáři a " +"podaresářích (krom adresářů vytvořené torrenty). Pokud je toto nastaveno, " +"torrenty z tohoto adresáře zobrazují na informační stránce jestli mají " +"uživatele či ne" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "" diff --git a/locale/da/LC_MESSAGES/bittorrent.mo b/locale/da/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..0befee99b641ef50d69522c31a69b3f2f2664603 GIT binary patch literal 59170 zcmds=37BM6dG{~K+Q`1|cLtj2fvKJi5PE=Nc7|D*X$BRst?sJsF1os^t!0LG4++G? z1y|x8R6ucyam6K~4r(+miTfTg62&EI6pe|?_xr!^Ik#?g_W=5R-}8LWS8(Tl@44rm zdzSaS+j;NlZy$5OOA~%q?Vlv4fwv!%B&RU%#(lapf}lO$(@>%kS^1gQ7D0aQD_5b!=w_4+BO za`wL{Nj8C}ff}cAQ19CluKz4tzW`MEuK-tr_kb#Q|BI94ao|y)`r&#|?QMqZJ3y89 zws3tnm~#CQ@Eq{F0S_JU@|J)!DY*=U6p}W$7JMV9ar+4f`6a&qMS{Nu&jL@U(ObY( zpzhxSie6p}o($dr7QlNz<^M@YKN?~^fa~+X~0c5of2dfW=m2R{R8JA`8fXr zsPcXYE(RaH();leaFFZkz>VNLK)wIBpvLRu%e}pqfl40+mHtdn{dYTfF8C=>=?{YH zw^LSmdl!Lv-+EB}w>zZY4xYsIhrlzyuYizL@+(mDq8}oe2VMq>o}UD&eY?Rk!M_C6 zZ*K_c9|A>xp93|2z747#KMeR=P~&>U8mF^kK;1tTOu+(p3Ah!U4?YLfc)bnOxcnoi zasC{5BKSp6&;K}F{~i>5ov_x+KMhnndO^|o1p(K9s^3-M{@`_>=KYhvW5IDy^Z99@ z%D)3tJ>CnR4gL#wI`}J4?LTgvKX)Fedaew(9;7RiEui}K7VuHvC%~oPKY<#z-+_+? z`_?-hT>uVoeL1N4cpIqt-vwR_z86%vKM(hp!*o>7OTbgXt)Sj>J*axtK(+I^Apa+~ z@Q?C;1w4)$4}df!`8~uZI$m?7)7e%~^f3Wm1O5f5`g{{qeeMT)z+Zss=ih@x@CcZZ z-a7@VKc5dO-|Ilp*;_&N+z|8pAGnV@CfdI8Ps$4gNK8^ z4%Y{6^LC#Iitf$`*B5}Q*Cn8yUkmE}J45;q2rEg(K*^0afGYp};E~{`!4&)^cp>;Z z@Oy?27D=bOL<;DomTny^@U7*UV zf=sJq3Oo>OhU;mtm+Pm2%fZ)ykbd%IQ2jFhYIq)aF8EgPJ>Vj+v@1y#f-eNm13v(& zp5F)m89b87`2+Af;Jx4{AM14X{Krvuu8)4a*YnV8lcd4*67X{H_235Zd!XvQ=n0;_ z1WdVpGN^XG2s{8B{{}aKN5VW+k843a zHv+02lc4(j$>8bW9Uvr<>;((p2~YC*yB4JDk|wwq{0yjZ{vD|2&xXle2tF26J#PWe z06zdqPJA5{U-%_B4?KL>+q*d6g`nu~Qc&|?3#j@&5mdWILA9$I()Wb)X9m0p6g@r% zR5>pIj{$E3)t~PK_53}c%KKEne+KowFN1pD_rc@ApMrY+z!C4SlR!N;ADj>Nfhunk zcs{rbyb^p4sPXtRsB*sts@)HQec%x#=ev&q)xX1_`uzo<`sr=piQqp5{0=BO`!7)W zjw?GZ1JB}mJBX^7w7_2Q@4z#`FM%oeASik~VbuHkOi<&04yb%fz~_P6!4tr5gO`90 zhWpFL{P`W=v7}!Mt^n&GQz&^eC^|c6+@C)cJdo>U;6dO;p!#tocmcQrd=2<)Q14$* z@%n54FXj3wQ2locsOMe{ihsQw)VO{$q<=nK-w$eh9|YHc`(5w-y$)1+o(Sr>HmG@e z6L$5o{yW$Qo>=quUJh>LdUv?~FnAZ&zXDf*x7D#N!0&>G zgCCpn{{I4~@_zuT-2I>IbhA9*wty1>{}L2Ey&hCQe*`=l{9?HN_kh0vH6I?`fMo&@d!HUH|M-uoO-^#57#0Q-w(mZfTupg+qo0GlIvT+Vemds<*a?C&yzt= z?|%ZQ^bzn7unDTZPXiAJZwA$mF9AgtZv`&_-wFN!{27=EpXKy$G{ki<*Jp#z0T+Q+ zfp>%VfIT-dm%&egCGhe;_j!K@sCqmAt^|Jro(W$37d~E(125+KrJ(BbIZ*WX15ow- zA5i?^z?;0BW56QU^Fj6ZUw|6lSAv&=?*!FfzXbK3MK?QLZ3Y){{UUH7cn`P{d;rw@ zm;a^H`y{xF>z9Kn_h(=V9`bCT=L^Bf{jf7Yjqlg~%IW!jaDeOM{@Uqi8>o8U0GB z<-ZtIIj;=qcYw!p{T@*HKMh*_p6}(J2de!SgY&^ba5K0EJPy1URJmURRqlPD#`#B} z`f>kTyuK-D^#K=~}ecold!cqiBcz6(48 zya&|0`7EgVe+66z?)O5!zX8;^?E=-W9{|;V9|2YGpMWaw*PzPT|3$7B90s1t^a>$E)K3@$!it8tU8qX(zdj2MGEBLl>|97DJale;1e>?$H zzbpgQj`5KGBJcn`2Wq_D35xDN35rhBmwG*}14UwJAFC_1Qsnzye6RsXxd>%ez_ zD(9%%y#6PFmvP+-t^-S;?!O6CKfD7x6Z{0I_k2HG|0rA^_F9)?M}iuko#2UdzzDdF z>!-fn`{kd&l12HX@aMKd&2dLK$UlExPA>d!1e3EbHHzbqLTyO;N>0+s=Y^nDklX`1XqBM z0e6DpyUzjj{#Ss{2HyhS2ww0;ugBd1KN#@Cp!)M(P|tl1RJ-m2HBWvD9suqSQ_*`5 z1`h(~g9n2PLA`e=D7w8IRDTVEYrrRgqL16b6To{x(akqNwex4-W5E;Oe~h{1^*mWzkDRz{~D ze*mBHPGk*u$-9^%;KxC|_XF={u7ckK#g8W5<9gs5LDl<*;rgeb=Ka$5`gm>!MQ=|8 zH7?Vj`saDzA>b>(qrumM>YsOm8rKhkDtEuTUC%!V+{E=&pz^&MJQBPeJOX?dxB}b@ zivRurd_B12ecnG`1eNb!K|TK;A^kz{M6Q$fyZk%})cp#mew_j}&QAr;2cHR^1-=X1 z27VP>2=>wG=Yc!GCxFiY7lYpb&jAnnp!45l;8k2d87zQ%LCuq&gC~JUG6>`5&PA^Vgut+yA5PXIThpoIVY%0PhFqf%Eoy z{xzWbX)CxM90s2V-US{H9&)eqqccFgXE~^Tz68{`tp-)@X7Kgkv%yorMIZC=z5-mz z^|he-?|Go+&uhZ{w}X2B-jMzkP~-XlXzc+n<$C{*dw*RHrd*f7lfj!o<-ZLSeZLJn z5d3|>13uy7-verVjs~}bSAZ`AUk?5ZT=tJnUuS*N>0~je`d$W}4Q>P1f-Ud>@O|Jx z;Dt}+RM;{E=NBk3Ob6juYAElr8X|G2GRC^x(8Snpb z@C>e>0bT&U8r1lGA>e}nPyDQ>UkskZ{cFMFz#Bo0ptiCe-ZG|e|CC36I8#h1iuHa17QKlx&Pw*^?gwE@hed8{R6lLJnr-EUwAB7NaOxEy;v*vIw1fR}^+4L$)}@kO_zUIs4X`hM^z@T4y}JuL*cbA2s%IrtXv3h*c3 zx!{Fg_HiqMM{s>Jcr5r*Q1js~Q0@OHxD~t)di| zm9ywuUe8Mct^t*PWw?HPz#^!6je}};6I4514z2|608iYH@dD>_{kw1b{7C=R`SL~J z?WA80ZUFBGsajI_4s`_&y^l3c@MWOdb?kSY&usx$bNzTw?|n760^AE~Uj6|*1zh`Y z&KHJ2(aSV=IQZ9~`tN1n1o#$E<8czid@^_*xDi|jo)6vviZ1U3F9&}DE(H7UcYG|k zhU*(a)#KyfMd1Gb4sQonfU3`{z|+C^f}6oFfpm}kUc$eB!Nm(>LP)=f>+x`YAm`8I zcsz&b_Eq2?IQ07g2kgUs_ww&H(mxA|j?|ZBj#qK4*x%>yHQc|7Yqj@foS#JcYR>gj zU+H%X#~~b-bN~BFAdh}8vtl@YdG%Z z`ePyOHm>#iLb(1o=a*Rux({h@3hAE&|A+M7aGcHg<2XJS^8GpIe;dv(<6Pqzf5YMA zJks_15_k}YX!rf8o{*AN`<cJeFHR0pJxPBC$CVssbG=LF;Ag?Hiv`2G1SBbgbb4VNF`f1>MIi@+k0(@-9 z^K;Ji`!7(u@7dw{hJf>^*Y8Mwd$?BKm+BvW=jYO1&h;?YKe0RLt^wZxt|I*d;JZWq zCxv?#aD61@-wgg8X@AM__neDo9Ru~*at}o?$ zP&dNwsR7@XdqzpW3h8ep{XaPWPjEH$S<3Miu7An(<(&6(=-1+Uf*4JX^t|Ietjmo59<`RUG== z$Z@ys+m-+Gvv7Vs@7>CAH`fP~=OT`8aeSZS0Mahv-VZtdD~{K4Jq1?4{|5EDl;e7i zX|A_~w7<~}erJa3Yr%6V=hvj248DQuzvg^*xc@fJ59HAAryM&tZsJ%#Uj5GJcrnL4 zy5RRgl?R?4?!PaTqkDTf-l>!D`wI8=eg+-`o@H0a3a%G% z{sizgj$?Vxd$@ix#|TH0<2cfP&oRXD3XY3Ni@%R^y(ZLcA?N?d@m_A8LfY{h1+MjL zaXgpvz2UlMso0R=`qNy0g7XiB^usyd!1KQWSBA7@;PP-@02g!b%Nzq7`lTF~bFAR_ zI!6!BpT@ll!LNlp=Yo&o`T_7%j%SeX(Ok#h5>9q=Jb~k@9G~KtPrm!X&v59sjQo1! z+oT`Lq2EUE1QIXdSkC$3;M2iRhx=b4Pmy!!H~+4*kbVUD=5zTHt~Y}Jz@Z;1fyLN7 zh4jydyqih;D(Bw;Uk4t`u|Lnho$L5}6lwijEF^ttNIW6l1RuxoO7fh{aSi8x3D!8i z7xEmyxqfHy{C18e*RSLHbnw5y7l4P7uHWk&%olqx=}SoeN76pUxqe55e9!dDWM#NM zAmD?fe~jaMsz|fR-ujkknZdL=&Ajgz z@Dj@fy@q?boZ>i}vy;2w@moZm$U6_z%)Pz;QF@U*cH6v6kamq#emoApak@zJa5{^&uQ% z9A}XJdD1?rb8s8i*Ma(-L)s#)ZwDU(egk{~>DPh!-4gH(oPUkuJzPJ?F~<43z{A1s za$La?f6tC5U^zU05a$CNf6Mh+-V=X63im%q!inL0J9seH%fMdnX!392_$BA>2zj2x zxqgRneG11XIR90+r}R6+`M-d>xIU2Q=jY!0;&A_q;40ED3-?C3zK7!iuKxyH&$H*K z!0`JCY4O*?xz-?F53c3-1;-mX^!u%ja6VxvltbQ>;~0(?aqkfDo#6Y!{rfnd$N6VL z{Z8fnMvfi|uNwnYQX_ zk}gU|inUt3l{U)FR=rUswb3ZoT4`UBuBq0WmD*TZtX5TzJ(XIizNeW^7N^tE$_;62 zyqr!o>ciFYWPg%wDL0$Nv2r@vs88ChR--sFQEm+Il1h^vYNf@rRB4n)c*AruzqdJ` zf*a*xX_}6r<<0(dZ9Sc?x6?|kRj!p(zY*@Y%4xBdR!UT=GE%HAN=xmjDrcl;#qmg! z9QIx-Ox4cru6)S1?J3e)y=%N)Z}Kjl8yziMABdZ!YvRJ8+n>))#MH*yC zx2$Hg)5U4LpucMilipG~Tr34hA&(IV33gd622w;9ByGM0+dj&y9J zGTasg1j_2Gm2YSb@U#_NpHTK@d8A$|*%MG>jnUfU$$q{lovOAWQOcd8yiihn@S!qm z0#NWk?~-MubiCef=#_poS*cM=u5Bt5(h^l-M7d-#(N&{$h_0GtV8C0@C9|wJHB~M$ zlNiF`GL39B+EcBRi8xtlihTQ3XdM2*~ZS^AIXyG z?IYAo$H^u#F1FI1-e%7=^>(#nv|6o9XwIZ#brB!)hptZ}L6;rU`l ztlOPi`Rq=ctx~;h^S8?URIf4f_VtV=E6pBLwysRgsq#o=w8A7AE$*%`7p$bTV2ql7 zOLcl(?=|Mq-~DV0R%F9PD+Bqh5Ic2>N)~CBGIf-t=~plTyX4A-QWRpcgC5Q&!Eh^cz zQg9H$ zI*_b_L}5be*)f!mJZl^;?uI#z7i(kmmL|H>M&&8x{)c^RvW`g9b;8H$V#K}uN#51c!D0I9t1zZThIkxRg))+24YmpWm?pSlg^+X;Jws=EBL`)rAU{gEY*F4Ke+IwNVKEWJa6V$qz^KQ#mua?RU zFWPjzpb~c|CQ}{5m?d_ zx`Os)vaC4raO`~3Ia$Rm&6X)fg)nQ9o7mALPJ$-N^AtVG~Hy{q-9!Q)MVN@BebVcr(YS4IB7MVBPqkx0<8{D zqq#8Ww0$W|STImWrWTdBHHdBxJ1g714aYyT%}cDw7Xs5M{CHl!&rU1I+-;@fP*I z6uA6bERWbI`oEZ4SC`wXi)j^ozbqxrsxh;KeP_y#9=rm(N?bbDS2l^}t5o5xYNHQK z!k22T>a_EO`jlDET~(9K*!`HLWVDrkcaR^so-ig+9F=`OisFL6$rDD%4}&l&XW|8V zw9yvz=X0A3in5`rj!hY`umf5nYq2vhur2uSn6wR8UkL-I`?k~qn{9)x6g<_7bN9V^<1DJo!o(4)|Ubr{`g!zZ#bSb8ZlgNd zVW(~P9cX%)xv(ZAw5RNH?as~VV=laCLM{!?7mwIHS-Nay%CZYC^gQK}WNlf@gz3FD z`VNA-U>+$mja%MQT9IxI25u7k2~nAV%}So329}~UvaZgNrVO@4un26p84m}_KsyVv zZgO8)DlOf???ast*7i?2JWEhpx*3T0Gtd-~Rm#p-kIPa+zE5?b%&P=g5?jEJH!%cNPXJpK8%&bo^b7_E%W zO12vM+vX+fnb>rvgZOulN7OMtF&X?uy*)PG(G0pJOn$E+-^Os=T!QNgB9MS2(86enm7q)P{+()jId z>&fYibyOpbDPP0Dj?-k}iZor8%Wg^>ZQZ!F>oIaIABYnn=ZSSY$m;QMFEYkyGS5a) z^pf#pSDdVveOKW8fwVIE$QotudZ^-XxMP2Gyu#`(qhWgp=hQS^wRG{ag&3ajLG_>A?F#D5@+uSiZkZ#4unkr(~SIeV_ zWpndRm>C`1^|2+!IlSTUkulU0)(DEFlFSgDQmsbW%qGrM-(c~QZ|AmjGp1BqUVGyN zjmb_g&E7t@GJSWs1mNO3Yw8wn&=4O8YhKhk^4-|$>^qff0_=8mrSejUh4`+F&aVLH*dmcqaM>MS>QGUh;GNbI7 zESG~*FuFJFMdp#DH{@}bba9Uly<$E=c^!gl&BcT&GWVOY}&s>1GM+nVLcwvkq{O?GT1EBrEcz>xGu%MelqxN22!SF_v~h{#eP z9Nl1+s?(*&nA-$Fy}bzADzWDTE!w!&(3fJ3ziiif88+8bAVWLHbrVoj)6%jGYPgwe z){l09(JEGC=O{lFxP2da5+tE7Sf& zfwW+H!{8?P-TC5o%yzmib}07(GhEicbl_y(Ck(O_o=w;C=c0m zNOriBSEkjhDY!D;HEIkb(n)lJCyyex8rU z2ZMuoVeKH*7FJ@B3|O)wEC~igB;c^9;>F(ixSfORwxniXF(_G-K)PYw)^$5p4X#_8 z>@2o8AfyU5l$~ULA@g{Kq_NI@apCxOF&cYJ)!503r`C7GhrJ7$q|wG%yZ~LY&Eg6& zwPRH>((;To(`$#WLx?m+kT#}Us63^GwOE#-#w%nL1EpXd7_BrAJpL;4z0Z0dwd|}} zrG5TxF>rdGQnYTuB4`B)wEE_Ad&=A_?Gd&jR88-*aw3z-zvf{p~=Ao9?q=4s$rR#B<=P*?*4+U@QO6A*QWg82z%f(kH zf?;UZ3`llDy~)m6dw3Wox6>R%K?eAhUVz3I7qKEium)Ibi#DMe$qlMtj=XFR?L@5@ zT+088aSRMDPX>d(vLff3p3sDx@l=ysH?&v~DyJK8d?7H!B`Z&HAFs27ETn{Gs1b;= zKN-aSpKz9J1`su#$9g!lEo&$(juk7&oTm5ke7qo}&hJE$%-16Qd{&}s?O4`4$}FeX zFs_P7$#I>a9=mVNMnJ1x!G0AH1{2hma>Pmdh{-Xv6`2zHrhk1fbG2;EgdJ8)L|i<} z0$gA#V-*~Es*|m)`CDiQ%kFv+qRJ@I*4cA)?2}wt*a^IeO11j?PpEAA$JaI}0llKf z89EPR>a|7yvrJ0ULgv~W3KAU#Gtm;Ab%HE1mV#_`ySv!grNW5ajhRNx4+GoW!sQ#V zizMg=csu1qL)Yhv;s|^^Oi3>}J1@#xFKeV#$7L%ApYmne;ZlFrIKP64g5s_*k$}ro z6SGbGQ;c(CdN>?V9W*SgmHTo!s**Znve=M6fp>G#Xey_j4A$$m7^v1asRUeVM{&1D*%(QK3ilkei&TQ#y>@L6hZ+g3Ru$7 zdPZ?UE=;-=uMF;b98z#VcEtdP$RH6PGQ78xyO+x-0*8-BCDnr9f-&X+aolt*oS_S` zEItb~P*J^9jY5oK>T7pqIcQuetz@uWPOh$Hp5ipF$T`!GG|*>)+fAJi>Je_OT-fz^ zZn;Y&AuW5dh=R-ng}|(oB9)WQ` z+p%Na*1`1~H?QlyAnG8!F1;@I+#|`0cN$-(bj=vrSFH@Q46VRHDflrpnxOVM9;=Ts5?6C+A9VJ{4Dc6?oxP5vMU6W z^){1Tl_oxRi?h_?`xL#lGP!2ej;$NFZWu_{pwOXgSsWN8X5JChy&m4U8w*BVY=bk3 zt}XRJ*)u89pIqZE4$!=@tRP*3K7CEOD$_>u$9NwWS0osi7YpX8tpRlT?ynJ(#%>Z} zq=e6DDYr>*j^a@IlgHuam*8i))&mobRL$3!ML5S5NmH}+Ub9vri;T<#?P5>4T3wkH z=}va7P)fs@SzmY!_3g3T^b3r~BFz*p;IEh+GeFow%+BhsM?rcdo#yS_GTxj~V?;ee z-s<8Q5gOUEsa)~lEgJQ(Gs56aAEh#d9xmT}BAxt05;re{CKl3~ZvbBkLd zIgXJ!oh4eTb?r9$EMVt#*(6@OamTtf%sza^hBAUO_@ePl0}2Ya+OQA(m{2K9(5hdD_VqY zB4>?MDtAJ5B(2y)p(l}6Z{bmHS_W~5LomC+i}CQWAlvjv;{x@-ZOOkVJ(aOXma!>M zm1WH$>I><7(|YD-?lPkXb(E#g%&iLPhMOL9-E})?t~=r=bEPY=abM}O%;vo3-#{=Z zGw*g5Smr7>2CUgP6v1YjS%Pss2*a#9@hfYvI90Pf+-)h&dQ=PcL5UH4dYsejT>dGH z2`R$EX5J4$cf$&8PFvGc-fQ}vfSkCFOGy??k_2}L!~tQNA%HFxwI9b++z?X#xs z!!?0+Kk7@4=IBPwWUgJ5#dKA6B{zJGHMh?P+PM9Q&vegmkf68%6llrRL>jTQMr}f* zX7-Ja`ZiIlwJFW!7Kg}Po!+r?&;&$rcU{UqQc}zAgB!Q38@guI#z9v+6B>*DT7qs- z!xd^KnG}4}n5=dm?O=eDyxZMA&q!?6g_wN?T#c#_WLyZko}|7BBn7>O&u4;=UYW$8 z(OP?Qm_{;XtW4%4>IoGxKf@^6HIl_yk`}+!jG#4k%#k1*S#`CtvZ5m!v8hukqv)6u zkx!sJPJ^K&ZDEb`Ex$Vce*0di78A0k?t`~IwJMlDdO3!>7|5$W{2`Q)>f z^i#bipVnctgh+h%E@#$pQo>`yXq4!f7|~*b?}Gz*!aKug$*B(d5Ie_#oJjvI0$d$Q%SWpl3W!ycENzNnsRk{5}V zVo)V8@wc`0j&$|TwY+6`M3Y>folMBekc7~JiiP>$)j*K;C+6+L**f575z=spuJ=cM zPiZfKG8EOM&bpys-|ZM>T3Zyy@85F7KwkMwm@T4M`^cxCClV{icz&N6CiYP+7c4c( zdi=vPeT1oHp7HIKQJ4J1n&eSODx$3`Fr-n*R&6uRAst&fMJGG1t+G6h&3aBR{(rxU zeB(r1PuYXZHPy54snj;uR0Edoo~@z*JtV5kTJbk-_N96sh=CRCEo|D}kN&Co;+Ys0XxKWL_GJv=^O0$pn_G_86i}HlytR zWOhbxzHx(S`46|{+Rf~=+*2|e%;Ykjr$HrBEO0$_tz7RcXd&EELhRDMCF!NySD>&x zu+ZLLC%9UQvbc`y&>VTE84tIw;^Jqgyk``ew~50?D~dqrj`s_b=klra%5g+u5Z2t(K>$6&s5bZS@Bx0!#}9F4b#LC|8y-@ zyawN5`V*0Pz4nxHqrS-2dDOPSZ97AdQy33=Dk>XNW+>iPn=L{r@udLkl*$yV!-KgG z#_g?>tj(g!pag00Rjve!%+`mC`R_G1ZbxjZ|7-HYF2aLzX|VVgrOP-E@1epPsVKuD zd4^D_g}66529fMw(Zv{_%F^PT)fAVyqUs{Uh3^iLaITn{+(Z>96e?5wiOoQ{L~JU@ z#g_TB{`^rnnkqLe%pQOZFe4as33iiw zOCRFivWK|0{2}h0pWVZv?a<(?>RTm7ke99OfvjFxili^3lFt-XzDg;9JRqH6O*ha+ zAC2Bq=Zxt~`{d+ho$jH&{dFCuo0fPg#~&9a6Xo(0&T)*rC;~&zlS^OgPhoPSGn&gR zE?P9jdibgn&Clk|;=mZC21bV-m(-9 zGzV0vP9igIcA|}eea3l%g3QrDdBz&*|8|&<)B;g(NA7CEn#(?uQ$brDB#%jwzDJ-L z5dGKnF?Lp%M{6qP+U+4)nsGt|k?|K^)TJ17WGIBDs&?t@vlWFRac@4XouX&8Q>K;6 zVQZiGrcHGZ%GG*E1G@H}cgI|@Nt6!Zux1(>AEWXXmFhgy-A!SUpsVn#wKOb?6NVeB zE#{ZC2y?x@t7S9-zb#RHxOVK^YRZ|S{(ND>KM_m98bvyx*hr>Gh&Yt5KDw@%3{_&u zT3Oz(PV3CWmljn6NOl4JB7coG4}hauHTQ_n3plNatmV^Z`K)1&!J*pW@oCVQ`)9tU zNhqUKLAMA&Gdc*6m|^j{qz$hL!d$Fc+70$tDJ!>QYQz2>9Ha^#GFtpIGtw$F*K4f8Y5_taEOTkKNOn=EXI3{`C?uzUGe(x|j?@b30&&rW z-n%Z`$c;i?fgkv6v=C5>jD`el`6Q0*TRv_!9hP;Nl2y65xjPtk%{zU8goXtVY$_GHaScYQRm+-?WRDPgXQrF{8|pccd?3C=U&J%bsn`@>Rx^_* zf$^3n(1HW#6O$igWC`pM5Vl%n&a*b-hnL7&IRIF^CSzEGlaOrT&Aqr~JRrEU6sheO z3Xyh2Cx}5-J}g#vAVGT;EseGt)|)xf3rpPo4GH6F)eqrSG+KO|h*E;|h%IEB5UtkZ zd8M|21kC%H1@PF)25-x4)X`bsQ0y3MCW_tc1%Lq(x?F0W(6VYQE~&HI17uhwX=!{o20lt7A;n0p#{Cl7%}+}wHT=c zGmFwlMV}p0(9CvIzYtGZg))&9gK_NhBlB4^9hk-tq?8!n@xiPrd7Z<=(KSQEtJ!C5 zAn7dU8X4HND1sB_y?WQqj4AsSclpdETjw@&V6t*U;{K_OIQ|q*P*n2ia;<;DPYAzD z!?5COk&Db0+;z+RXtdU%da=Ka>BzosW%3^gk=%9>o#D0Ya+1Yi7Vf z7R4lCWRyRjnKz>VQs#UZey1si-NsiF5+3t$^<~eps**J!TcPexyzU*67S}W(XPOAC z!7^xK!Aqt5VA6%5O;lb~4?B`pqhpe+=#dFFTA@?K+)azqcg!jgFB3#Q+g#8$3(!8< zeeo%Flp;EidR8WGqLD^rilQ;R=B`Ul<1wNXP0#pNCz7@zL8jEsNUd|1=vuAmP%g@8 zgkmlF(@sDRZUEXRJ~h1%<|#GFBwXmD;i8&`nO-Q+dqZC0kd$rqC=&s)$S0OF673y1 zdrWzNu{SH)*}^C?>k~|Y*uPnqh8_u8tG{D$9A@d^6&z?9>-hD7x*ES1zN~%qh|!NJ znBi^xv#h-T3vb=mOF9IX8xrUO^TwloY%UQi-zb`MFn-U(PB_FVHxpCJWk$Os^6Odr zHLjPU**^@6R(X1}_-Wj`s>48epVUI5+em^U0h?Wg_LP5>?yAHrJ%VRF1kj|hRAvOD zv|QK@l$3>7slc$b8SW<0n-wLJZBr#FA8wfSWFFUnq@AtV#mGXI_tV6?*GxB4gQT=r z-x~e9=V*m|m1yVbVzqFkRG>?rs(+uZ7eY9qOF5b>z)gBeCpO5)Dz;FMCz7U`iR#LZ zHbt_3#XB=dBkH5%R^Nz_VRm|$?NdVJjZ)>t=%@!i7-CdOEI?1fTjj?LoLxLX-VhZ= zRIcy;rmolio%!cXmRn_|LHH_m{(iPzs@Qkdq%B4!lPh5`_@cK_m+gu6FCUNZNs+5v zECr_l@$Be*BVL*sXGZsW0+Ar+i7i z9j7yjup1zDG5uj0h#Wfv0A0lv$9=5 zz;MgV5u3%z;JZd30>cKXDPLBV87|m0oK^2eQhY6 zys)uU*hMCDm#(g~2E$}OzkgZJ4*PPvu%$UxDHT??$C`yfR;+urZyPMEL9oaOD6BE=~iH(b4H!@Bg6 z&6_W;R{HCWvCDe45IE9l>C*lsJ!_n%3WLPh@J^WZVl<{oZ3UX7_AF{$diCJ?!bP2Y zsue3|g>|^qq*4x~7g3X*#}+ntIHan+ohbx`Ea|_ne|f*Ug`T*ur+eSviM@9>(l&b+ zWKq{ppa?s&S%%Bai3Wqmh$auWYjC-W_iRGj1~(MDjT0TN4AiICrIuiZtNlalwJ~~O z)o8QIPPLHv74$ns6&@b;OF(7QCj{jNTTo6Ycx8fRIO04@Fz?Ph>|;Y7HlE^x!pXgN zu#}6(as2wdcUD;f#kOQ_U<2ECH*G!6jMpA0%$pj!XYhsemNHR!Xo#{rk&J=!u&E5Y z1XF!`C*3lsk5CfD?xp34rlOhghFNL&sL)gPzO2T(u^b4sW!~V;r9E)YuptEeSN%cV zyd=``t+VPE%fb!scf!`dtnq5qPu2Ao?4p4bzMGa2O{gZ3!9H)r!B&gg0Z;9{W4Jsv zT`Nf~JI@Bvcx>(x;Tk9h& z_0{&?Nzco9)U{Rcgso!eF+MIKWT|sDd+Xos0<)ch_1Hsa?%F9>%8lxq+bI}|NP3CA z6~8QwPSlO!qnp*jH{$*9eZFxk(ExiLwyTvf*b)u(P5B72CYiw|e47$iP1t6^e2S0o zRl@r6^;O{&M(H}+h$B_s>c9lb_9C8-)B~}N5v{IlJ~iOjMqZFhs*UCXan&cSh%!D- zMh=3jwddYBcq2tad!6}W{yd8B(4SrwL?t?mrme!W;V8ZA*}FxviO)ggB1Ed{K6@lj zmBRzRX|NnSJjT>+Ojtk-#y|E88;NKl@EkAGzQHi$YJEaZVu+kBW9wkn%{w!>vvcq; zJgi)b8wZbSYGu0y^ZjpMc)c^izzMW%u!6eazE$=O)@m95kJA72YOl5q&fN_KP-$9E zHs1|~$uGaf%*;?NY|I!;?D(LySdTE$bR3hm>kYYw;>4ChM$Ybh`Z!^?_=5))Nkn5_ zsapISMqjV)eoBU{$MbsqS^g_ev{pa|Ri_NGVw&x`qF?O2%l0PbhIp`yMH;2X<`dd* zZDJwD_-(eDW$YN1)}|T%?Ar=Bv$vU-jP1P>%A>mdDI1faxl~GA%*efZ5c)0e z4i&t<%pR>Ues+1m^P`4p6Vq06@10s$X5ZG);l^~fdL1rl9vo2X>5@OSMJ$t(*@)M5 z9tg?aQ5=Oi!17tDbXTP^<4lvbt|{WaPKeaH$Yp7NvTahs@Hj{|)ZVDpS9}ow)wWNo zsj*_e5j5NN+BU+-E_VB6KB?Q;3Ku(NV((p@UEQd5##s=hd3MH!-Lk=yfliAI0D8#w z5zY(_vMQ)AW|cG?V$BEso)*RKG6^3WlmUcK zn0RcqkS_${(826j_sAai{e?#uaVz4FcyhElEk%Y1yUEhtyN9WsadMYcs8N(fJo0hA$;fnkH~e#4EEDf&=DTRZ`{1we!Da%@HTT|a zzNvWMw2(kHzBU;2Y4N0d`h@Q`+^p`sL(Og!eYatXlpIg5-dGTOXg9@c=1P=ek6xWz zEg=TmfcGH7b6bJizQf|`rSiDPVIxH24Bq!s?P`5D1T1NYs=}9XS^1SJRjME~;~vDm z1@Q*S8vPgP&vxJ46g5ccx+q(EHG?2#7R8PtQ6O8*`}Igh6A)CFIV$%PwiA_4*@bw4 zrW_fxd+A!vT?j?#k*TV57jwaEdx}8xAf2^Ouv8yrexsOd>WBc(%-cArVsz+r{ub0c z<^&EjIjMI0_n^t%n;~!?b@QqE_N9=A-_iEKgV&cQAj45uCF2S2z(88A*2NeGX3b1^OPh6O zTa}j1%RkFaNEqg2jBl~kTe>x!XL`TXl&+nNW&cacn;s605T_@d7N!}#BF?^Wu;-xx zO(eLyu>?XsA)(x4;KA@Zat^mk3_1bM@Is9X9oM0iXkG-4SFq&@t8Z6>Vz#bUqfpFI z(u^z_d#|vI0XvT8o^VbkSxJ5AeOt0;2s^cl1JCrbhMM(ZYUcLF-n(~;XRA=-OT=Nt zSZH-Gw>nRU`DCgy1{jh0`L~!3W5hV75t>9qOJ`;Bx*a9?pz@3{s=E9?V{%pIE>I>E zGY{$A)tjS?mV^{)gJe|TcBTaPHuE*}_U4$MhDQprGYcxj<4hA+X*$vAHYlNrc~fR> zb#`gI*940+9$$1&ak)LSC$Kdx123IM4Pn!zaF+=m`Zzm5$2ILFmw>+_X2ZE3++Q)JjE1;0S-d3I=azSO6aMu!90)d&$-Nc-v4ickcRHG=NV>R1v zS+B8|OC6SKql=*O6uNaD3b4Y==#*Y5mtq zG|~mDcCOjDaRFtSK8<4`Ogbv#yDn?bWz=SQ6xr|*%bJ`x$kgoMbHriH!MA#@s_IwE42NO=RXGS{9*RN!IQ+kYnaM#E%iQ#%kP`J*$j4-&B-e&)BJ5DB5I-^g^xBFV5mAuKfD{W z^OWjrw20&&dQv7lV(%PY|Cb?W15G@!Z~BR<7Um453yStE0vR-awVBhQX`sq zMco2UMoCNfnG4`+$^&t$6&b+iWa-Ne{y+K#%W*deTt9(pA7LZ@?8Q;3KE zyUkURpvnu+`F_qsMH9n2Hp-^$e8y~3f##dY4f)^>(WxwYj@k&-x|@YW^5%U(a7bRy z$K6OIRt;T|l)_4%%xs5Gs``}aDz?DEWHR?Zd!7a_@IESnQiE0&8v-xTZb{Sy8kTiNW zexeQqZ`V#u$lCFdGc-IWn-Gr{>sGfI=u(FjEUhgxw1d6^3UTT{0FNxjOAj^AHovnwtFn7U70`NLT=T_ADqX*~5^S__m> zt7|brOLQ;>>qmHumKkeouD1)Nk_(GU)5YSQ6W0@jIW)5q*jhZ}rnr*C8I$d}HZ1bR zWRPe%OJUrm89ZqSd9kCob=0b`8MXQ;aMo-ZqW{#oHl)^)rO#wrM3N^lWM-$@jupWM zkhwjnSs?X2sZj!{S9D^m=)^S96=9{ARhy!RYMOOO_Hu1rx*nAv*MjU8>>j0rH5u(t zjlMNcTT~a*`5qNAzo73?OwG{}kp4Kzyd>C)U`1MZg{zQ})@GDwLuHz;)LsO#i(!3oFGsIvZh+F{aEZ=0 zI#JbyxR?>Lg%H&I>){>}==R5YVa5&9Dxz9!n^v2u#|{+uIOO{@=T#vvP~!=rjQ(^B z^C{CjZ9p(cJ#tS&2zS+=V&&xubCbQTFH1C`Fok4%q)Ra66<>jo%aHmr!&QPseIE&G zZR;uj8?9=?f3#5Tv?BF>h6{`pz2F5K6>GrQHmd4Rx7LY132nBvQ9YXwHkS~q=!P@_ zN)M~P3~Qq(y&5?pw*&2l-E_R6YFXm=zn36bG(uU}8cg|peSG1nrUu9r5Vak+GSp`~ zSMya9>yot6HN}E&R?Vt!wp+F6lWtI{6lP!K$Fv=CduT3v#Yx?r|^Hd=Z*; zswR(R7N05Esc%xO$b+7=p8QtajfAZ?p*%en7{dp1IISpFkTWo zxslkTmeS`snfRZyT92_nkJ2*B!ZdV-I>O>(1A}{H56d|q^)7gLi6Gf~H#EX*mGcP& zg0F66%ue9-E~nY{)er{d+d7aGnCy8YHkVg&LsNpn(;(5Xfi)vQ+AP?kGcUKH|Njaws-~ZUZo?teo11*yIW^2BK~~5i4sgsvva#IyY{ZlZ(p51Pgy6m zovvp*+m)y5B0jKMnnv2J)n(7(Nf&WUG>7>}qk_0oke66Sc7w*oz!sdJOZkwgB~1^E z#bBK*nUQQguUBx7uk7M8Xh}#j`5)sKbIl3!rtlIrksz4Z>eWhC%SG;cVEbw2_T6Pd zFxlmyTsS+3sIq{v5I0P`hW2G(>2%fFU8{ENT(@~3wNRum-CbBSOFQvJ5{W(3K)ZCo zJbR^sNzG|9MLIm1@F57hOtfKemE*78#%2n;%2ln^LsRNDDd{o{bCg9K1YZrnRqan% zQX&f~TIp?<@NiK+@t{;j+9zT`9^^ucxG0#7g%G0-s>PZ6%KTR5xam*Bda=jpxWQ%> zFl%a-tw4Eh-OK`Nj9*8n}is3<^qE zsEJfuZ(m?F)+zhg51V0v5~4&_Odj@h(0g;jeE#s98)N%gWy#;>uTgd8D3RS%x|ivt znQ1IL^>*!@ZL>SuV#nz{_omtL?yNnt^EV#hmf6OL+1YxMjixQq6IwBkf<^5Qd8{A$ z2Oj~t9MHDe@~^Y`wX}DJ-}cUS!+FR*r(x@C|2SYslbSuOH}mPhP|g+V=N$@)`)2d_ zlnUI=1`35xq&$r5<{c`EWi3ZJW`VvAmJPw{Wws7UnxeX}!vLo&26&lwVS z&PKHC*t|f*Yx)GT&iIQvb9dVoFurPQw3aZyOzZ2#Tg|)L*(+j|hVA|Y`I**zZiP%_FZW}O)WU}cy1nAslYO!Qv!ynxtBr|hH3?w<3Pl;@$ z-7zvON>9=(6d`YCyz4s-@C2(fth>vsDo`8ks7<1%6$aGkWX~xD%COI;sx-CSc`Sa8 zLg8_nZJsvn0%wJce7Lh(Sp3j-#TL|UmbXQ?q)FyiLSla($tX3iY36h{8x?z7H%5;~sxk(poc5uURw-l3I9GuT7|r8ZV)YtF3d%P~eoB|cOG)h?q!DAD+-NSl7M zbU3OhKUVR=KD)pj1R*kSa#fdcr(jVb^chfhBekbbJdOzN*aJk1=9>Wup4< zxun+H<5tpAByH*2qM~HQn>9fX>Q9By2HEuZT%&gG!yLB{p)Pb4mXJ!c;_Y+H$Wo1T zX%7xa6weTMAv#I4dN|G(l>BMkQh72lN;gH^&cvW?vBwvdqf1I2N#0ipJAYF-g*liW zPd6|0Qha5y!afjP+kP{>@(fYVBsLLZ?nAM*#$k(5j3v8&XG6zLlqp5&goyRL)@qAR zoq1YI!&cxBcJ_xo(gnVnvVdJH6yVsOxYEvkXY7BWfpmqCKgiBndem|{Qlogf#}h*U)@O~te7EV8fLjf7uu!VcNT{ybWUZ& z!u;?Ciy*l`nuSk0ePxnws60okPdRbB19IqiElr+51=;94R3=+d4jG^}RO(cg%tYB2 zu;bR?K_4&=zAT{nB$L*LT@Ueg+Z{aH9NaxBioG$Z7s3q5Hd)sCL=|-yrrn=t8Z%Ix ze?6*E)ZC*v_{hJR_T9iO!dH|Y6ds$MkP174LotMm$T6YXHrN`1>EMBCocLs!u}!!M zls+6u%s}~Tys3QJ(Bc(^pxN=qB;AwZR4Uoj=U-dqa@c6dwg?YV1=`PMoM;yGN0zE@ zxN#^;o5sPR_gj>k*+_)~Gis=k@a{jkVrs$6%DHNoRlzx$Pu@^TnT1dot}7AmA645G z&H-KAA~NVj?Rw!+cZy!pR~_scrLZUYY~d~T>g=N%BtU4eu{h52>Y&CUcMbKpg<@rx z?yOLzIK%Ks67ys|7#i)$riZHpR_?)Nv@@{W?j6G;GqWwjwN*Gw6)=r$OttTd8_rAc z)OU+2V3_0UW{V1_&cr^i%6yf^d4k~-7nqqa*+cZuBYn&Tm2V#o`3*~_r+!noL9ExM zNc1N&a)r=3jdFCM=?W=fwVik*GM`kDCTj&IG*%@Z04E{Ex<=O;4l;b6?Fe*VeebzDWjJYy4H*`6c1nE z@xBaule^3aiy%y_y?2gQCiu2K6v`enV^A4do}70T8>6sG`NQQ{_ON9vf7l%7#~k{2 z%eJ016F+NZ+?}_REvMSXL?P6eW**VBF)>cF0-mpp+g$-L@oQSYyRwXm zT6SCGl-Hd#Ny0>B_Vnc}k3c}^=Wa+l6*wCTi`H>k+URGcEJR_{Y6j8DcbnWX=RUl{ z2aYL8YMa>5yY=UM`V`Ph0(!n&nOf{d#W6ca(=%>Hik3Tmy=k_v2T?DY8X>MwAdY46 z)KFbkFFMv)j3=KV7NJ@;Op%$nT(napQD-SVrYkxN$~Q7=S5}Y77Ooe!RAFm+qrWdG9B}KQA#?-E8;Ts1 zA(Y%e79e$GD?53(?d(Q#P=?H97~V;ZodUh3qGoAHu*y!S=9xnvgDigboofT1!8PB+F^XNn5@L>tX(FK>TC zXSvZXS(A8?{z?&Z!d(SaHlGzGMaB$T_pH*bra4~Lw#|%;nZ@M*bxgL+PPy6Xc&$-C zRMe=AGUAfWv|ZeI|I-ImzB({+s%=QqkEojfiba$IgFfeAEO!i#>i=?&?5*<1- zOAL|U77iTrvrZVe7mj-XT419Iqy`&3$)ZHe-M!nKP-s3ZD9B!g6Gbsk*W!{1^HHQB zD_Mo9H!RMD^%5GSQ%fo^EEH=o?=0z}CYci{iJnIPj;*&DG}SO5;&DFB#Z96W!6ftr z8OxQR{#l6o!wdwQV8RFG9I3M{qLH98F;WzVlPTv+RydQoqoZ^#Vpd?L(g5FE9htAt z4ox=ro?=?mzsw~0Lb3vK6lDXPivE}(TKdbP333CX)gJ_jSP6cIy_=7a3>N(#v#0N)WgeBFPURl$$t9lF^ z%ZZqBL)wT$nW-7RJJ3Gr5R@CeUM6vFvvmy*Yd4zrVnODJve^`z9Odi#XKuKzPg>Hs z_AA@vUrt2c&0-gRATy~lkF6#={DK>NFhcWVd+ehCzPg|a*{Ym2MzM(%8ii*dvtigr z&%Obo#&CHR$tGy+mgW!burG~*8Km`yhno#*aM+B+b|AG5U?X;qW`+{AKBFDQ6LCMj zS-?{#KF8aA%w%P|ECk*RzcsFgCZ*+4F_U5E04r+I?436a@7qI!HJic)tA zbC_Kg^(76_jA(-<{j8ROvq)q>KrukemcRUct`NF!0U@7QIHdo}6TQvcskCt0Sxi1% zrr-6riKSK$)2FX~GzAm^n>@Uu4xZqi1tdjc+7$aH&fJgPR{S(KP`wCs(Xxm$M;k=w zS=w`Gz8otH_c5pABt%AfZ$uS8nK}El^dYC3=0V(}9bMjLo%2ZXRFHRXuD*e?iGwf`V`*f^W)Kadp zL2SwaqiXWWqd!dd^3Lvk-l;;^AjfndiPhXb?{uJ z-SWqDaX(wM7ELeL02pN(fOfVn5lER$!mdm(~(2 z;Ag?2bbgrQxgzXUxe_E(#c|P7) z0>c7e;_YQl+6zr(tTp=CyWh!xQKl-vCWtzLd1a9%G|mQ9f+MurIf9wSib9avQidE# zU1e-VE)dKGN4HHCzD9Ca27L>sKyTBam%G`WV-uIyN47%&cuPrE?K%^p*aMDc>QWq}eul z>=zHiKz>AfN}I*UMbbikzxZrntv_8$N5eW5G^v?+T=Zk_02ide_C~Bjo6>`>aKwmc@b;Jhs{0%^vzzQSYX+ezjB5$qXFPAk;Xmd zZP{5Xy93EgLfQnRk<2;BCDq+%n&PyR@6$laSDwjgweL)g<^HD>0VE94?*PXe)>Tt(O}k%DMMe zh*_C>WOm@}9qEZJ3Cm6HXF;g?a+gLTQx@W!u!Z^>V#~%4nGs_ulW2IEYM6OBrNo)M zb;Zz5JGO#{yJ;OJ2=?rK(3A5?d%~2m=E}tUSV&-PW+Nt4CaAGNST=iZxO*b{@%cMS z+LT_}QP)F3UBR5@QPo`~Xj($4T^UiMxCOmPlal2dxJA}5ZBAcu_nJhX_N=r5;$HNa z*0!EU??YrIk*QVN3RX^YIC^IVr7{Z>&gZ-$d^E!5JXWQGu@GsPat2pm6SC zNY-};H7~1m8y-HV|InW>DRza1G0PYU>XQnQ(!oaDS8p$bP3fbUS3UhF?Hq;va9B2+DnyoU$})JY3ToCmuXd!|iTOWPyFaPbcz5>ko-hWs%!5&LZCc z&7JG!YHev^drX=I$Qu*r4cpb@IV64@<;}uc8O3P1iF^||%s~zWH=pi#lnu>RNRMLJ&HdbXRSy<-aH_If}2SEU|vu1zW|{Gu6Y0e literal 0 HcmV?d00001 diff --git a/locale/da/LC_MESSAGES/bittorrent.po b/locale/da/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..6349cf4 --- /dev/null +++ b/locale/da/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2849 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-11 03:59-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installér Python 2.3 eller nyere" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 eller nyere kræves" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Indtast torrent URL" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Indtast URL for den torrentfil, der skal åbnes:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "Modem" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/kabel 128k upload" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/kabel 256k upload" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k upload" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Højeste upload-hastighed:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Stop alle kørende torrents midlertidigt" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Genoptag downloading" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pauset" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Ingen torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Kører normalt" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Firewall/NAT opdaget" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Ny %s version tilgængelig" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "En nyere version af %s er tilgængelig. \n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Du bruger %s, og den nye version er %s. \n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Du kan altid få den nyeste version fra \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Download _senere" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Download _nu" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Påmind mig senere" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Om %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Version %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Kunne ikke åbne %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Donér" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Aktivitetslog" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Gem log i:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "log gemt" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "log nulstillet" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Indstillinger" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Gemmer" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Gem nye downloads i:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Ændr..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Spørg hvor hver ny download skal gemmes" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Downloader" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Påbegynder yderligere torrents manuelt:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Stopper altid den _sidste aktive torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Starter altid torrent i _parallel download" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Spørger hver gang" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Seeder" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Seed færdige torrents: indtil delingsforholdet når [_] procent, eller i [_] " +"minutter alt efter hvad der tager kortest tid." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Seed uendeligt" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "Seed sidste færdige torrent: indtil delingsforholdet når [_] procent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Netværk" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Søg efter tilgængelig port:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "startende med port nr.:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "Rapportér denne IP til tracker:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Har ingen virkning medmindre du er på\n" +"samme lokale netværk som trackeren)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Statuslinieteksten er altid sort\n" +"(kræver genstart)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Diverse" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ADVARSEL: Ændring af disse indstillinger kan\n" +"forhindre %s i at fungere korrekt." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Valg" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Værdi" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avanceret" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Vælg standard downloadmappe" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Filer i \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Anvend" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Allokér" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Download aldrig" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Formindsk" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Forøg" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Filnavn" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Længde" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peers til \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP-adresse" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Klient" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Forbindelse" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s download" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s upload" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB downloaded" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB uploaded" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% færdig" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s anslået peer download" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Peer-ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interesseret" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Blokeret" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Afvist" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistisk upload" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "fjern" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokal" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "forkert peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d forkert" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "bandlyst" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Info om \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrentnavn:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent uden tracker)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Meddel url:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", i én fil" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", i %d filer" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Størrelse i alt:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Fragmenter:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Info hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Gem i:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Filnavn:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Åbn mappe" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Vis filliste" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "træk for ny rækkefølge" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "højreklik for menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent information" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Fjern torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Afbryd torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", vil seede i %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", vil seede uendeligt." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Færdig, delingsforhold: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Færdig, %s uploaded" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Færdig" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent _info" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Åbn mappe" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Filliste" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Peer-liste" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Ændr destination" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Seed uendeligt" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Gen_start" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Afslut" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Fjern" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Afslut" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Er du sikker på du vil fjerne \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Dit delingsforhold for denne torrent er %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Du har uploaded %s til denne torrent. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Fjern denne torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Færdig" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "træk hen på liste for at seede" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Fejlede" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "træk hen på liste for at genoptage" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Venter" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Kører" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Aktuel upload: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Aktuel download: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Tidligere upload: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Tidligere download: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Delingsforhold: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s peers, %s seeds. I alt fra tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Afsendte kopier: %d; Næste: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Fragmenter: %d i alt, %d færdige, %d delvist, %d aktive (%d tomme)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d forkerte fragmenter + %s i slettede forespørgsler" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%%færdig, %s tilbage" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Downloadhastighed" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Uploadhastighed" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "NA" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s påbegyndt" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Åbn torrentfil" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Åbn torrent _URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Opret _ny torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pause/Afspil" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Afslut" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Vis/Skjul _færdige torrents" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Gendan vindue" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Log" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Indstillinger" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Hjælp" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Om" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Donér" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Opret fil" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Vis" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Søg efter torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(stoppet)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(flere)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Downloader allerede %s-installation" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Installér ny %s nu?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Vil du afslutte %s og installere den nye version, %s, nu?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s hjælp findes på \n" +"%s\n" +"Vil du omstilles dertil nu?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Besøg hjælp websiden?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Der er én færdig torrent på listen. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Vil du fjerne den?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Der er %d færdige torrents på listen. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Vil du fjerne allesammen?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Fjern alle færdige torrents?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Ingen færdige torrents" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Der er ingen færdige torrents at fjerne." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Åbn torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Ændr gemmeplacering for " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Filen findes!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" findes allerede. Vil du vælge et andet filnavn?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Gemmeplacering for " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Mappen eksisterer!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" eksisterer allerede. Ønsker du at oprette en identisk kopi af mappen " +"i den eksisterende mappe?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(global besked) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Fejl" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Adskillige fejl er opstået. Klik OK for at se fejlloggen." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Stop den aktive torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Du er i færd med at starte \"%s\". Vil du også stoppe den sidst aktive " +"torrent?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Har du doneret?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Velkommen til den nye version af %s. Har du doneret?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Mange tak!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Tak for doneringen! For yderligere doneringer, vælg \"Donér!\" fra \"Hjælp\"-" +"menuen." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "forældet, brug ikke" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Kunne ikke sende eller generere kommando gennem eksisterende kontrolsokkel." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Det vil måske afhjælpe problemet at lukke alle %s-vinduer." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s er allerede i gang" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Kunne ikke sende kommando gennem eksisterende kontrolsokkel." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Kunne ikke starte TorrentQueue, se ovenfor for fejl ." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrentfil generator %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Lav torrentfil til denne fil/mappe:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Vælg..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Mapper bliver til gruppetorrents)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Fragmentstørrelse:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Brug _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Brug _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Noder (valgfrit):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Kommentarer:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Generér" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Vært" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Genererer torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Kontrollerer filstørrelser..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Påbegynd seeding" + +#: maketorrent.py:540 +msgid "building " +msgstr "genererer " + +#: maketorrent.py:560 +msgid "Done." +msgstr "Færdig." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Torrents er færdige." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Fejl!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Fejl ved generering af torrents: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dage" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dag %d timer" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d timer" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutter" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d sekunder" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 sekunder" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Hjælp" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Ofte stillede spørgsmål, FAQ:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Gå" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Vælg en eksisterende mappe..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Alle filer" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Opret en ny mappe..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Vælg en fil" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Vælg en mappe" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Den gemte status kunne ikke indlæses: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Kunne ikke gemme UI-status: " + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Ugyldige data i statusfil" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Læsning af fil fejlede " + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "Kan ikke gendanne status fuldstændigt" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Ugyldig statusfil (dobbelt indlæsning)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Korrupte data i " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", kan ikke gendanne torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Ugyldig statusfil (fejlindlæsning)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Forkert UI-statusfil" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Forkert UI-statusfilversion" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"UI-statusfilversion ikke understøttet (fra en nyere version af klienten?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Kunne ikke slette %s fil i cache:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Dette er ikke en gyldig torrentfil. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Denne torrent (eller én med samme indhold) kører allerede." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Denne torrent (eller én med samme indhold) står allerede i kø." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent i ukendt status %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Kunne ikke skrive fil" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrent vil ikke blive genstartet korrekt efter genstart af klienten" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Kan ikke køre mere end %d torrents samtidig. Få flere informationer i FAQ'en " +"på %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Starter ikke torrent, eftersom andre torrents afventer start, og denne " +"følger indstillingerne for, hvornår seeding skal ophøre." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Starter ikke torrent, eftersom den allerede følger indstillingerne for, " +"hvornår den senest færdige torrent skal ophøre med at seede." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Kunne ikke få den nyeste version fra %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Kunne ikke parse den nye versionstreng fra %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Kunne ikke finde en egnet midlertidig mappe til at gemme %s %s " +"installationen i." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Ingen torrentfil tilgængelig for %s %s installationen." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s installationen er muligvis korrupt eller væk." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Kunne ikke starte installationen på dette operativsystem" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"mappe, hvori variable data som information om hurtig genoptagelse og GUI-" +"tilstand gemmes. Standardindstillingen er undermappen 'data' i bittorrent " +"'config'-mappen." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"tegnkodning i brug på del lokale filssystem. Efterlades feltet tomt, " +"bestemmes kodning automatisk. Autobestemmelse virker ikke under versioner af " +"Python før 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "ISO-sprogkode, der skal bruges" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP, som skal sendes til trackeren (virker ikke, hvis du ikke er på samme " +"lokale netværk som trackeren)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"Portnummer synligt for verden, hvis det adskiller sig fra porten, som " +"klienten lytter på lokalt" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"laveste portnummer, der skal lyttes på. Tæller op, hvis denne er utilgængelig" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "højeste portnummer, der skal lyttes på" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP, der skal bindes til lokalt" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekunder mellem opdateringer af den viste information" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minutter mellem anmodninger om flere peers" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "antal peers, hvorunder der anmodes om flere peers" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "med dette antal peers startes der ikke nye forbindelser" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maksimalt antal tilladelige forbindelser; herudover lukkes indkommende " +"forbindelser omgående" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "om der skal kontrolleres hashes på disk" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "max. antal KB/s at oploade med, hvor 0 betyder ingen begrænsninger" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "antal uploads at udfylde med ekstra-optimistiske unchokes" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"det maksimale antal filer i en multifil torrent, der holdes i gang samtidig; " +"0 betyder ingen begrænsninger. Bruges til at undgå at løbe tør for " +"fildeskriptorer." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Start en klient uden tracker. Dette skal være aktiveret for at kunne " +"downloade torrents uden tracker." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "antal sekunder mellem 'hold-forbindelsen-i-live'-kommandoer" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "antal bytes at bede om pr. anmodning." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"højeste længde for præfikskodning du vil tillade over nettet - større " +"værdier får forbindelsen til at falde ud." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"antal sekunder at vente mellem lukning af forbindelser, hvor intet er blevet " +"modtaget" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"antal sekunder at vente mellem kontrolcheck af, om nogle af forbindelserne " +"er timed out" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maksimal længdefragment at sende til peers; luk forbindelsen, hvis en større " +"anmodning modtages" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"max. tidsinterval over hvilken man kan bestemme den nuværende upload- og " +"download-hastighed" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "max. tidsinterval over hvilken den nuværende seed-rate vurderes" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"max. ventetid mellem genprøvning af meddelelser, hvis de vedbliver at fejle" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"antal sekunder at vente på, at data skal komme ind via en forbindelse, før " +"det antages, at den er semi-permanent blokeret" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"antal downloads, hvorefter der skiftes fra vilkårlig til mest sjældne først" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "antal bytes at skrive til netværkets buffers på samme tid." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"afvis yderligere forbindelser fra adresser med brudte eller bevidst " +"fjendtlige peers, der sender ukorrekte data" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "forbind ikke til flere peers med samme IP-adresse" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"hvis ulig fra nul, sæt TOS-valgmuligheden for peer-forbindelser til denne " +"værdi" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"aktivér omgåelse for en bug i BSD libc, der gør fillæsningen meget langsom." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "HTTP proxy-adresse at bruge til tracker-forbindelser" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "luk forbindelser med RST og undgå TCP TIME_WAIT-tilstanden" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Benyt snoede netværksbiblioteker til netværksforbindelser. 1 betyder benyt " +"snoet, 0 betyder benyt ikke snoet, -1 betyder detektér automatisk, og " +"foretræk snoet" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"filnavn (gældende for enkeltfil-torrents) eller mappenavn (for gruppe-" +"torrents), som torrenten skal gemmes som, uden hensyn til torrentens " +"oprindelige navn. Se også--gem_i; hvis ingen af de to angives, anmodes " +"brugeren om gemmeplaceringen" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "benyt avanceret brugerflade" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "max. antal minutter at seede en færdig torrent, før seed skal ophøre" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"det minimale upload-/download-forhold at opnå, før seed skal ophøre. Angives " +"i procent. 0 betyder ingen begrænsninger." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"det minimale upload-/download-forhold at opnå, før ophør af seed på den " +"sidste torrent. Angives i procent. 0 betyder ingen begrænsninger." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "Seed hver færdig torrent uendeligt (indtil brugeren stopper seed)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Seed den sidste torrent uendeligt (indtil brugeren stopper seed)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "start downloader i pauset tilstand" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"angiver hvordan programmet bør handle, når brugeren manuelt forsøger at " +"starte en ny torrent: \"erstat\" betyder 'erstat altid den kørende torrent " +"med den nye', \"tilføj\" betyder 'start altid den nye parallelt med den " +"kørende', og \"spørg\" betyder 'spørg brugeren hver gang'." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"filnavn (gældende for enkeltfil-torrents) eller mappenavn (gruppe-torrents) " +"at gemme torrenten som, uanset torrentens oprindelige navn. Se også--gem_i" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"det højeste antal uploads, der må køre ad gangen. -1 betyder et " +"(forhåbentligt) rimeligt antal baseret på --max_upload_hastighed. De " +"automatiske værdier er kun følsomme, når der kun kører én torrent ad gangen." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"lokal mappe, hvor indholdet af torrents gemmes. Filen (gældende for " +"enkeltfil-torrents) eller mappen (gruppe-torrents) bliver genereret i denne " +"mappe under standardnavnet, der er specificeret i .torrentfilen. Se også--" +"gem_som." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"skal eller skal der ikke spørges om, hvor downloadede filer skal gemmes?" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"lokal mappe, hvor torrents bliver gemt - under et navn, der angives " +"af__gemsom_mulighed. Hvis dette felt efterlades tomt, gemmes hver torrent i " +"samme mappe som den pågældende .torrentfil" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "hvor ofte torrentmappen skal gen-skannes, angivet i sekunder" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Hvordan torrent downloads navngives: 1: Brug navn PÅ torrentfil (minus ." +"torrent); 2: Brug navn indkodet I torrentfil; 3: opret en mappe med navnet " +"PÅ torrentfilen (minus .torrent) og gem den i den mappe med navnet indkodet " +"I torrentfilen; 4: Hvis navnet PÅ torrentfilen (minus .torrent) og navn " +"indkodet I torrentfil er identiske, brug dét navn (mulighederne 1/2), ellers " +"skab en midlertidig mappe som i mulighed 3. FORSIGTIG: Mulighederne 1 og 2 " +"evner at overskrive filer uden advarsel og kan muligvis udgøre en " +"sikkerhedsrisiko." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "Hvad skal vises - den fulde stibetegnelse eller torrentens indhold?" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "mappe at lede efter .torrent-filer i (semi-tilbagevendende)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "om diagnostisk info til stdout skal vises" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "hvilken potens af 2 fragmentstørrelsen skal sættes til" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "standard tracker-navn" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"hvis 'false' så lav en trackerless torrent, istedet for announce URL, brug " +"pålidelig maskine på netværket i form af : eller en tom streng til " +"at trække nogle maskiner fra din routing tabel" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "download færdig!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "færdig om %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "download lykkedes" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB upload / %.1f MB download)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB upload / %.1f MB download)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d ses nu, plus %d distribuerede kopier (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d distribuerede kopier (næste: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d ses nu" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "FEJL:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "gemmer: " + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "fil-størrelse: " + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "procent færdig: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tid tilbage:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "download til:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "downloadhastighed: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "uploadhastighed: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "delingsforhold:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "seed-status: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "peer-status: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Du kan ikke angive både --save_as og --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "lukker ned" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Fejl ved læsning af config: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "fejl ved læsning af .torrent-fil: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "du må angive en .torrent-fil" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Textmode GUI-initialisering fejlede; kan ikke fortsætte." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Til dette download-interface behøves Python-modulet \"curses\", som desværre " +"ikke findes til den native Windows-portering af Python. Det er dog " +"tilgængeligt for Cygwin-porteringen af Python, der kører på alle Win32-" +"systemer (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Du kan stadig bruge \"bittorrent-console\" til at downloade med." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "fil:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "størrelse:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "hvorhen:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "fremskridt:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "status:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "downloadhastighed:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "uploadhastighed:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "deler:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "seeds:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "peers:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d ses nu, plus %d distribuerede kopier(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "fejl:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "fejl:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Upload Download Afsluttet Hastighed" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "downloader %d dele, har %d fragmenter, %d af %d dele færdige" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Disse fejl opstod under effektuering:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Anvendelse: %s TRACKER_URL [TORRENTFILE[TORRENTFILE ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "gammel announce for %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "ingen torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTEM ERROR - EXCEPTION GENERATED;SYSTEM FEJL - UNDTAGELSE OPRETTET" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Advarsel: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " er ikke en mappe" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"fejl: %s\n" +"kør uden argumenter for parameterbeskrivelse" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEPTION:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" +"Der er dog stadig \"btdownloadheadless.py\", som du kan bruge til at " +"downloade med." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "forbinder til peers" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "ETA om ca.: %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Størrelse" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Download" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Upload" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "I alt:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s peers %s seeds %s delte kopier - %s ned %s op" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "fejl: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"kør uden argumenter for parameterbeskrivelse" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "Valgfri modtager-læselig kommentar at vedlægge i .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "Valgfri destinationsfil for torrenten" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - afkod %s metainfo-filer" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Anvendelse: %s [TORRENTFILE [TORRENTFILE ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "metainfo-fil: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "info-hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "filnavn: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "filstørrelse:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "filer:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "mappe: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "arkivstørrelse:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "trackertilmeldings-url: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "trackerless udvekslinger:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "kommentar:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Kunne ikke oprette kontrolsokkel: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Kunne ikke sende kommando: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Kunne ikke oprette kontrolsokkel: allerede i brug" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Kunne ikke fjerne gammelt kontrolsokkel-filnavn:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Global mutex allerede oprettet." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Kunne ikke finde en åben port!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Kunne ikke oprette program-data mappe!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Kunne ikke anskaffe global mutex lås for kontrolsokkelfil!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "En tidligere version af BT blev ikke fjernet ordentligt. Fortsætter." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "ikke en korrekt bencoded tekst" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "forkert bencoded værdi (data efter korrekt præfiks)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Anvendelse: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPTIONS][TORRENTDIRECTORY]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Hvis et non-option argument er til stede, antager det værdien \n" +" af optionen torrent_dir. \n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPTIONS][TORRENTFILES]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPTIONS][TORRENTFILE]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPTION] TRACKER_URL FILE [FILE]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argumenter er -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(standard er" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "ukendt nøgle" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parameter passerede ind ved slutningen uden værdi" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "kommandolinie-analyse fejlede ved" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Optionen %s er påkrævet." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Må understøtte mindst %d argumenter." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "For mange argumenter - %d max." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "forkert format for %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Kunne ikke gemme indstillingerne permanent: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Trackertilmelding stadig ikke afsluttet %d sekunder efter initiering" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" +"Der opstod problemer under oprettelse af forbindelse til tracker, " +"gethostname fejlede - " + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problem med at forbinde til tracker - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "ukorrekte data fra tracker - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "afvist af tracker - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Afbryder forbindelsen, eftersom torrenten blev afvist af trackeren, mens " +"ingen peers var tilsluttet." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Meddelelse fra trackeren: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "advarsel fra trackeren - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Kunne ikke læse mappe " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Kunne ikke status " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "fjerner %s (vil gen-tilføje)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**advarsel** torrenten %s er identisk med %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**advarsel** der er fejl i %s" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... succesful" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "fjerner %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "færdig med tjek" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "mistet server-sokkel" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Fejl ved håndtering af godkendt forbindelse: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "Må afslutte på grund af TCP stack-kollaps. Se venligst FAQ ved %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "For sent at skifte RawServer-motor, %s har allerede været brugt." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Man" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Tirs" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Ons" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Tors" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Fre" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Lør" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Søn" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Maj" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Aug" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Okt" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dec" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Komprimeret: %i Ukomprimeret: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Du kan ikke bestemme navnet på torrentfilen, når du genererer flere torrents " +"på samme tid" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Filsystems-encoding \"%s\" er ikke understøttet i denne version" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Kunne ikke konvertere fil/mappenavnet \"%s\" til utf-8 (%s). Enten er det " +"formodede filesystemsencoding \"%s\" forkert, eller også indeholder " +"filnavnet forbudte karakterer." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Fil/mappenavnet \"%s\" indeholder reserverede unicode-værdier, som ikke " +"svarer til skrifttegn." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "ukorrekt information er ansvarlig - total er for lille" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "ukorrekt data er ansvarlig - total er for stor" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "tjekker eksisterende fil" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 eller fastresume info matcher ikke filens tilstand " +"(manglende data)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Ukorrekt fastresume info (filer indeholder mere data)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Ukorrekt fastresume info (ulovlig værdi)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "data korrumperet på disk - måske har du to kopier kørende samtidig?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Kunne ikke læse fastresume-data:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "fortalte filen er komplet ved start, men fejlede hash-check" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Filen %s tilhører en anden igangværende torrent" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Filen %s findes allerede, men er ikke en sædvanlig fil" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Kort indlæsning - noget har forkortet filerne?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Ikke understøttet fastresume filformat, måske fra en anden klientversion?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Det lader til, at et andet program har flyttet, omdøbt eller slettet filen." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Det lader til, at et andet program har modificeret filen." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Det lader til, at et andet program har ændret filstørrelsen." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Kunne ikke indstille signal-kontrol: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "droppede \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "tilføjede \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "afventer hash-tjek" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "downloader" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Genindlæser config-fil" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Kunne ikke læse %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Kunne ikke downloade eller åbne \n" +"%s\n" +"Prøv at bruge en webbrowser til at downloade torrent-filen med." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Dette er tilsyneladende en gammel version af Python, som ikke understøtter " +"autosporing af filesystem encoding. Erstatter med 'ASCII'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python magtede ikke at autospore filesystem encoding. Bruger 'ASCII' i " +"stedet." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Filsesystem encodin '%s' understøttes ikke. Bruger 'ASCII' i stedet." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Ukorrekt fil-sti komponent:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Denne .torrentfil er genereret af et defekt program og rummer ukorrekt " +"encoded filnavne. Nogle eller alle filnavne kan synes anderledes end, hvad " +"skaberen af .torrentfilen havde tænkt sig." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Denne .torrentfil er genereret af et defekt program og rummer ukorrekte " +"tegnværdier, som ikke modsvarer faktiske tegn. Nogle eller alle filnavne kan " +"optræde forskelligt fra, hvad skaberen af .torrentfilen havde tænkt sig." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Denne .torrentfil er genereret af et defekt program og rummer ukorrekt " +"encoded filnavne. De anvendte navne kan dog stadig være korrekte." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Karaktersættet bruget på det lokale filesystem (\"%s\") kan ikke fremvise " +"alle tegnene, der benyttes i filnavne(t/ne) i denne torrent. Filnavne er " +"blevet ændret i forhold til originalen." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows-filsystemet kan ikke håndtere visse af tegnene, der bruges i filnavne" +"(t/ne) i denne torrent. Filnavne er blevet ændret i forhold til originalen." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Denne .torrentfil er genereret af et defekt program og rummer mindst 1 fil " +"med utilladelig fil- eller mappenavn. Men eftersom alle sådanne filer " +"annoteredes som havende længde 0, blev disse filer blot ignoreret." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Python 2.2.1 eller nyere er påkrævet" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Den samme torrent kan ikke startes to forskellige steder fra" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport mindre end minport - ingen porte at tjekke" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Kunne ikke åbne en lyttende port: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Kunne ikke åbne en lyttende port: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Tjek omfanget af dine portindstillinger." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Første opstart" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Kunne ikke åbne fastresume data: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Vil udføre fuldstændig hash-tjek." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "delen %d fejlede under hashtjek, henter den igen" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Forsøg at downloade en trackerless torrent med trackerless klient slået fra." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "download fejlede: " + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"IO Fejl: Ingen plads tilbage på disken, eller kan ikke skabe så stor en fil: " + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "aborteret af IO fejl:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "aborteret af OS-fejl:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "aborteret af intern undtagelse:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Yderligere fejl under nedlukning pga. fejl:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Kunne ikke fjerne fastresume-fil efter fejl:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "seeder" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Kunne ikke skrive fastresume-data" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "afslut" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "ukorrekt metainfo - ikke en ordbog" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "ukorrekt metainfo - dårlig del-nøgle" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "ukorrekt metainfo - illegal del-længde" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "ukorrekt metainfo - ukorrekt navn" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "navn %s afslået af sikkerhedsgrunde" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "blanding af enkelt- og multiple filer" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "ukorrekt metainfo - forkert længde" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "ukorrekt metainfo - \"files\" er ikke en filliste" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "ukorrekt metainfo - forkert filværdi" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "ukorrekt metainfo - forkert sti" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "ukorrekt metainfo - forkert stimappe" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "sti %s afslået af sikkerhedsgrunde" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "ukorrekt metainfo - sti optræder i dublet" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "ukorrekt metainfo - navn brugt både som filnavn og undermappe-navn" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "ukorrekt metainfo - forkert objekt-type" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "ukorrekt metainfo - ingen streng m/ URL-tilmelding" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "non-text fejlårsag" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "non-text advarselsbesked" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "ugyldig registrering i peer list1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "ugyldig registrering i peer list2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "ugyldig registrering i peer list3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "ugyldig registrering i peer list4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "ugyldig peer-oversigt" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "ugyldigt tilmeldings-ínterval" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "ugyldigt minimums tilmeldings-interval" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "ugyldig tracker-id" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "ugyldigt antal peers" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "ugyldigt antal seeds" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"last\" entry ugyldigt" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Portnummer, der skal lyttes på" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "fil at gemme seneste download-info i" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "time-out for forbindelser, der lukker" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "sekunder mellem auto-gem af dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "antal sekunder mellem downloadere, der udløber" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "antal sekunder downloadere bør vente mellem gen-tilmeldinger" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"stanardantal peers der skal sendes en infobesked til, hvis klienten ikke " +"specificerer et antal" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "ventetid mellem tjek for at se om nogen forbindelser er timed-out." + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"hvor mange gange, der skal tjekkes om en downloader er bag en NAT (0 = tjek " +"ikke)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "om der skal føres protokol over NAT-tjek-resultater" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "min. tid, der skal være gået siden sidste tømning, før en ny gøres." + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "min. tid i sekunder, før en cache regnes for statisk og tømmes" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"tillad kun downloads af torrents i denne mappe (i tilfælde af gentagelser i " +"undermapper under mapper, der ikke selv rummer .torrentfiler). Hvis valgt, " +"vil torrents i denne mappe fremgå af infopage/scrape, hvad enten de har " +"peers eller ej." + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"tillad særlige nøgler i torrents i allowed_dir at påvirke trackeradgang" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "om logfilen skal genåbnes, ved modtagelse af et HUP-signal" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "om der skal vises en infoside, når trackerens rodmappe er aktiv" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "URL'en, som infosiden skal viderestilles til" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "om navne fra tilladt bibliotek skal vises" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"x-icon-datafilen, som skal returneres når en browser spørger efter favicon." +"ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorér ip GET-parameteret fra maskiner, som ikke findes på lokal netværks-" +"IP'er (0 = aldrig, 1 = altid, 2 = ignorér, hvis NAT-tjek ikke er aktivt). " +"HTTP-proxyheadere, der videregiver adresser på originale klienter, behandles " +"som --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "fil, som trackerloggen skal skrive til, brug - for stdout (Standard)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"anvend med allowed_dir; tilføjer en /file?hash={hash} URL, som tillader " +"brugere at downloade torrent-filen" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"behold døde torrents, efter at de udløber (så de stadig fremgår af din /" +"scrape og hjemmeside). Har kun betydning, hvis allowed_dir ikke er valgt." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "scrape adgang tilladt (Kan være ingen, valgt eller fuld)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "maksimalt antal peers, der skal uddeles til, når der forespørges" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"din fil findes måske et andet sted i universet\n" +"men hér... desværre ikke!\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**advarsel** angivet favicon fil -- %s -- findes ikke" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**advarsel** statefile %s er defekt; nulstiller" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Log påbegyndt: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**advarsel** kunne ikke omstille stdout til logfil: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Log genåbnet: " + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**advarsel** kunne ikke genåbne logfil" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "angivet scrape-funktion er ikke tilgængelig med denne tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "fuldstændig scrape-funktion er ikke tilgængelig med denne tracker." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "get-funktionen er ikke tilgængelig med denne tracker." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Udbedte download er ikke godkendt til brug med denne tracker." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "kør uden argumenter for parameter beskrivelse" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Lukker ned:" diff --git a/locale/de/LC_MESSAGES/bittorrent.mo b/locale/de/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..a13df2bf77a186112cd420a1f7c68d21c24f23c3 GIT binary patch literal 64211 zcmdqK2Yh5#dH;PeZpa1qZn!I3tk&MqHdnc@x1JI^`yo5vjZvV^}Y4@i>Jz&nmflG7iaB#V1=HA!w?mL!LPuLc)`Zvig`zXomu zPh6fPM}kH0RB#4Vy61=U_khQ8{zY&aydN9@cdST~M}n^aj{@Ha9u2-1d>Hr%unYVY zcry4^Z~^!W@L=%xbCRSNJPkYqTnnb)X7C`e3hMbLsPaDTm!xVRKNWQg#40UfFi+PgJ*!JQ|Zm% z0I2&f0!1$`1y2TF3l_k;L8bpuxPCOmdLZX#gU5kO!ENALP~~_z*bROXR6aiiRiCa) zlH}3gao`EyIiTon6L=c99TYv*K&5|ixc|y<{+e+A&7jdSC_4WtNYRq-gD(dkbE)_9 z`$6UReQ*hQ_)2fbi@_nzZvZ!f{{-s&zX#P{Ctv3Ey%f~-5m48k466O^0M7zH2I~5+ zK(*T`176?7px(C*RQv4=*Y5yN;{0F0M}c1kA*tj6P~)NxB3S@l3W}a@1XaJC;G@B3 zgKD?ehwJ|WivB(gYW#c?R5`vM@b{ql^~lvuXUBlLe=3-Q1@K~U3)l@l4^)4>6;!|c zJE(sCGDpvrR}*aiLqR6G9>EP_YE zjP%|aQ0@6bQ0ZO+iq75wsvSQ8s=Pk~Ro)}6a6CHT@u0@t$)NiC4Db-}BJf~vHK_7k z4yrt(;9=n7!2`j+09DVYfoFk#1?oL_gW?l=!}(W0rN1Yfe;Z_oCij7&!!tK~`>hA{ z{>wqp`F2q6FM`T%57-C32vj-#1=RaL2HphT13nF0zs1Y(v4Ecn_&M-M?tcl?bN7Kq zfWHps2W|Cwp9qTX9u>~d1y!z#K|Q|))cXg+^RnOxe$5;XfK=Fakf-29~LAC4spq~2)cpUiO;3n{qFi(}^ zdQi`ef-1)}sCIumcslr65E4oDf(7t|8-4t)0cpCV0WJYQ396s}0P6WOVRGkz*MKVL zi@-;L?*k<#z6Odf{1RLM9x>weT@vs-Q1o{RsBy3vRCylQxEXcZKUu4){z^ z^!Pkb`P>2?1Ktj*J>LQ9`MW{o_pyMV0rkEwfqLI}!Q;W7fO`I*QE#u4Kt0zDc7wg3 z^4kQS16~bY4n7Z5e|!m4zW0Kv_piWS@W?UeyXS*y-w{yleha8}dMkJ$`0oL~1&Ypo z11jBdCCBC98JuqeQ5BOW*aN-|d^Gq)Fa>`FiXKlG_x64?sQ!NpsB}xg7l7Nq6TokR z7lXeF_m@xj^V`8=xqdx(5m*BmLdlyz(b>V1{`{%nL7XoK4+bv))s8E{bHVN4tH9@g zdjG<*muEeA3FlXWYQGnOdhYK)@vpao>eqh_*FP7|?*rApzXDf-54*|Rdo8H?JPy=z zEl}h1ncxQSCEz2#uY)S*ec&PB4?&glm*9HvtSNXBSO@O~kFR+7{u}J#{LpF7|5$J# z=VyTGk4>Q3;aQ;ae?F-GeJOYW_!e*}_#LnpJhAHUy$syQ`Oa|u0q~8SKL8GZx7V;O z!2bk~06#S2?f-dD`F{^oz6U(s>1IX1tpTS3J{uH0{XM95{vdcX_=Rx(oq)duH69MH z!!y8c@TuUlK=u2f4ad_#jrZlC>U|~nU2q5ZZ{W(N_tSwbZ}+1>z4sLGY_I@Aa>=zI zEIau?I6rBpkFO_#s^2@oRp6(bce6cfjjG(f6t+ zxV<+5p2_*kK=t=~LB03CK+)%6Pjost71Vh*sPZibMW;7{)8I|u3E)>i(bZ2t(f0Hh;r($MC^}dMD!&m><*kD%#~Z-Yz)ylo_kHku@YE-HJqN+dIe$4g0)87*K5L%r z<75cb`yUJH`Y3oP*Z@`DCxSz61Op@TXuZe2UY<(Gb@moSz9k z4_pjh3BDV=8|-=-V;TGyI0jz!bRYMx1yzpw!Ij`|!AFA^KEwO#TJS>7Uk0i?p9V#L z-vd?N-+|%}2R+mCIR-3p-VLg~p8=|WUkP3Yz5`Ty{SwrB7C+1B>I!f%=Pv;lfp>!& z!TUkIf5o$%-lxHB8i%L6zr(=XjJQw^UJ`4z)|opundY%w7})ya|6B~RDb<6VDdt5x1+#I zxqb<#etIJK2=HZ~%5xj2`n&;Dx!(h-K3@b2;G%pa95mZ0F1iT3R7^w0c{9@9{>t0+Qt%kgr@-~#lR(wy!{9aG0Wb4%Tn|2+^9gV%I0aq;-U^n$uZ8=U zz1;7w0d>CxZU)~04uB8)YabV@!2>xT1=U}ZAXy~O0EfU+{w7Jbf;CX>emB?!eib|y zycb*up7IL6z6w-3Z3fQ-cZch*0uSc=jiB1|?V##^SGfNz@OaLD0IL2E`&)D^a3k0c z{sz?eS@B9A-;V=TuiL-|_zm!S@XA}A&ffyA;QTY-`QU+n=k$FsxR~==z*|AJ$45cs zf7q*hJe>!s9z&q|`zhdM;KxCwKm4}fZvaKdQ{X1>#o)={H$av9*P!TZ`R&d>t_4+| zJ)qM46L=!{2~hRF7gYQFHz@i#_|=Xlf$I0OK(&7#sC+L3HLh<2RnDh_DflVyRPZO@ zA>d)J@%BF!)N`kRCx8Rsqrq!HrMnrl@e=Oe0v^Zp*MmoZcY!MR$G`)?dqIu+?}F;j zpMsZw$Njz2#dc71um@Cs+y<)sKM$&XlRLcpi$T4AD|jTh0~`a#LDApG!H0vVzSi}# zM}x}m8t^3W`Jme6wcz8xw}Tpgk9?ii=VWjL=ZnDWzZNcm(&?f@-Hh@G$V% z;KATa!85_X1;uyn233yFfoivJgKF0wfTGs}-|BqgVld@=093n-fJ#3Os@-P5YrqD0 zHuwopeDpV<>i>whdHs(8AH{huDEeOyt^tR`{X0OF>%AaFNInU^1AM~U{k=>6(Q!q< z^TA`ee-Wtu*$Nu}2G!mzQ1yNusQ!Kl*af~BJOq3f_(@CfkJpwfQ>ybQb-JRR)$ zC-0Zlpz;|8d%)eG_|I+N<>2qa^>q|_0p}HP0(>EOIQT%g{_uBtK0V;kTwe)p1g`|u zzpn(31^*R12>cSLdffwxUVj9t-H-TZFZWTP@_7`f@x2s04O|~^EL?voSmpZPfHm-t zJH1}Jz(LMm3Rb}Hf-3LOyFC9QcqHdFQ2qZTP<-ZT;AP;eK)wGzz=hz?K(+75@Amdy z0P6Y0;1cj6@FZ{wR6U*%@Y$g1``mDT3z%~LQg8}8j+`yYPL2Ti?%E1CQk7ci_9h#o#;dMn?m`4Xy_# zKj3=!+d-B47vMVZ0Z`-qk`H?OPlDZ?KN&n8d<`i2dN-)?@L^Ex@o7-)^i6OT_#IIB zF8Wt|Kj30e^?ntoaon}n@dQxMcY_y$%fMw|6{Kp(?cx4o|1Ibj;DKC!5-9qAI(R1d zLU0^>2Y4`e%7=VhF921Jvq9zG2ljwd;A6oTgR1Y3!G7@M4?EoqffsWAK~U}YJ8%=& z`w<@>P4FDf?*>P~UxKHB*Ze#023z16;4Pra`A+a)@NQ7;_+e0Vc@KCfct5E7KM&V` z3u-(c{87Jt0(cPTr-KKAXMnoj3!VU80BW3V1=YTzpwibs<=+BD*G~dfo?E~Z!B>JQ z_zqD0@C8um{|i+8e+V7}KIUUiHy468aQ;+K>Hh;%zCQ+2F!{K*3Z67@H(zfg6gNepxXD3pz`bfl$T==RQXGw z>Q@CX0G|bZ5xg5b8GPBNolf5d_Hq7munS!98L#hR@G8z%f_0?_)o+J>*8BHSpxXCB zQ2ntIRQs<1*MZl7Uj=Ui7lOM#=lu88;1!(T4T@e4|GbxT5qJ{k1K@GsbpdOj`u7>& z5#TGqwcs1UGr^w(Jnjqr{Dt6=T;C3gzZAhkzz+ueD5&=NEVu#u8mM$<&^UBq@^tX1 zhcTb^C4b-WmmQ}AJ^@@qy1xX~ub%=%x5s?N$J@!E%6kT=a`uCwqo;r?!1scB?~lPT z@O&ESO7K>Yrb>Pc4uK!|8f`;4j{my1d-pxweiwkJa{p>j`PMi)=p7{-@ z%PYW>NH-0tADzXsn1KIfZmXJ7Ci{+ef%2i0T2GJ<6cR@Hi^3 z`=^7VryfxEF9LOc2vk4Z0E&)p15?i5{8MkgPl9^>2cYEKFF=*!Z9l_y0*`>0UI8BZ z3uG_&8t@XZ`hBEj(;Oe*_vIX4;y5YX<7e_aelG%_sFU#5AM%Um*YV?r;h9&1 z)0|(=aW2O$jyl)=0sK10*E_ksiDMPluHkrL zxToZzeeuoz;@ZFDu8(mIR%kK;NZ!mn#ec*QNBKR(j-TdAFUK7&% zjNkhE4fsg#IpO@~fD0(sAGrSZaIUm3(|`P(le_i`&POW5a_H2%S6X}x#9dTIKPD7 zL%I?Eo)GY@xo30c6)=4pi!0`=^?{XZ-wF|iSeSZHX$E!J?0n6ZjgZjIK zLwtNU=bOW|zt#=@9v#lF2hSoOL_=~i_nH&pAtG{zN zUdnN|PWZb^`GKd0`|k<)=-ytAcj!m>`!e?)#_@8F!?}j|Om5wgx>{l3HQFl(a)j3 zl;bjvi#Wc<(Z%zpaqm3vt0B!<;KMn;A3T-gNu)cR^Z2)vA3Hf7%kdSCk8yO9?mqC7 z9Qs>MdOh+@u0Mi9e;dIQxOg$g3Vt5}{ss7naR1AsDe`+g_#Isf*N-G!H>ZEa`9|>l z9QykX$7eY9aQ$;3?G>DVh2P%-UjrV?aRAT1o%8tjaIW=nvWV-;!o?HfP4HTdSCZyr zjvf4dHdy7jH>5d`-}*a)=eKb*IDZZ2r-T0u-U2>?>-zh92eWZ5I=RV2x|~8x8nF zelHHc`@k!B-!b6DmI`_e_jEeLaVE!xP^K5~dke>3a_H}DuD=1i1pLq3bA$YT8OJXy zmD_?G*98T{tn~(6poMZ`+;yz*IyTYe-^x&^MiQ4JNMp~hWlRt2e^J| zxHr!E-5lp~{@36-o_&lm41Yi3TKwzc_lczYdvFcMFF4-7p}*hj2*0Q73i*&Wq>Sov4YgVt_Hnef;mj0xx-m0d% z%FW5NT1$)diAFkJtEV%?dU3kcEY;J}%`=r^wb(4zs*NP&ueYbMDD7#a1^qWuD%BhM z(I}P1?8jKS(M(5cGv!i9GFH|7)(j7yq36?$+YIvmT{Tmw6~}T{*3@=YvrDUM(=!zc zLxMqGIF_WnW2Nz8tI}+w&03nIi__6!wOVVY^-`l*tCzT1ua~OLv^PmtS89!Nbs{ZR zDk{gWa&@e>tC3C@cclcdU15BRPW~{ zo<=tr*Gt8*-82+6Z}g>WYU%D;D=k->rRtcyF*5F+{H$GmnHW)8g zN@0-G`YVNEU7io|n-Mot4PM4(dg!Zm3N_xi9k>Xf@6!I8_K+aY!|AR!cWG`+3?ju1zU_Wnqg3~%qDMmk9{k#Vt^cJ(y6cGOyxF{9N=c}im@ov4ZU z7(X=KN@Zxn+q&AucV9YGqrk8T8y|6O^w`6tU1dh( z2n{q{f-;(;lkqWHw|7HPqb)5##G}o$Ri(`uR@5S;t5sFZt_C!nR%#5Vv|4KJs@11b zp3;C0qn3OoDzy>rPy4uDl!|1M-f37z8J0o<_ytWr#;@>@y(v^+QF7K^o}K+@Q`{z$>25X4IP9xs{LZw9y=^wQT%W7@ul2M&7=j(O{+86H3;R zs4-I-EsvKOB;&=MWyXT#lopIp^Z!_lR@Zxtx%72D+k_QacTvkgeiwcS>GT2x`Bg1BInyVw255B@k{eG~4W+w` zDiLp$QW1tJHizt(Db=Z2y1E8$ueNNk4vf_5>Q9qGiJfuXX)}l>vMM(%$9m}|h@9+3 zcIT-#-8D<Zhq?RZqeoEmn8?xa>=nGjv0P4~&hKC8D8qqfZ`&N=Ae169$cG^pss))0OL>5+ zRocmFGoEU=LRY7OCAHfJ+1*krx9XMtWB?L{38`f#P(t#oak97*<~UibPS9E!=uR8u zJ*B>fd~CXgNYvnn&+X46J4<7W83mG_{D4%)O0J0HGMSmF>`n$|>d64CNs_^6!99|WgZ6Qid+81Xr(O0 zr`f8DKx^aURI@datU|lGYNI-gVWd`@dnFDEyEA)8_UajNhN{F^IxQv32cdGFlN#1u znt&E}7Aq~dtfdh#&lJ%!rB1*+s>ttT6=E@2)hbtv#=?MUFtC%=MX>-Wr}nZYy{-`* zlcbHZxH!X*ajN0Bj^449#zJ65*3s(*u9UdzX~YbTWK*OC%tCZZbHqX3&?r~OnqY~8 zmvV?_R*F#QWP1p>5Q1}T9ZXgmMS5r22oh_N79H+bb;R{V9uT&8LtR8n8C+mfI^EYe z%ShT=VX`*G7+oFIx~lVTOINFmmFk|g>3l&YZc|LAI)=wBt&vB9Mm7j_a8ZM9mT;c3h7jGOiTfJ;+Xr&`6c5_Z(VmHbfA)N2ZX z&&h6fim0d2oUKMFm)=VC)rWN%4l9V_r#_SyS zohaXX@CxiIap_oI*(4gTQiVH;jXp39U#d1MyPYT0X3To-D4J}>&d2OZMqBxJ2luphgKDEi9C>uJ;*pLAWJD@hQ7TX;I+k*d2 zNZWw*jbXra-j-Tmqix8wf-76478awJa&bhWP|VTw=zL$Q1M{!hRYz&e3l}GVTtPw# zi59;qnPD9od&Go@+B(;IF`HnQTd$6{*=fst2O3^xF02k0S~GUKX7Gyi{PQlDl1qc% zOGa&+EL%SN%JOs1^E9Q=WKBuTgyFp=`VNA-U;$TV8@Ie=?4oo_FmRLLPl(C{Y*z9N zHE=9SBWvm$Y06+*42!^qoAq#@479T#>!$aWq}q%K^$k%dB_37!c>wWwmbe#AjMJI%gvm5EK?Dp)gBy@JhcuUqUOV)1RzIA(l zSF(0!KvF0e-)4a)YjL|cr@w0Z6{;k9Q&3H9(7?PzAN?_5xJTk-tqi-lb%eD2j*+@? zR!oi=cSc0fm?hFER+_&2Tj$(G2#l8}=3KTC`r8&H>loNHr-S%+kVlj;KQQV1daX4v z+13m?B}`u~hd=ST(nzvSLrc`w;pAFOD>d5=v3hBuRVl)XNSr+}QmPgn&>2suxz+d)>2hkB7QPLp}oi=vl|C%fWg+3dRj=k%xL@%^imz3aiU!{Lto z(e?_fxr~PGA)HgYX{u#QmM_Biq|55N$|Q(-DgIGx7{Vz%zfjIw9CR0>YP=-#jwnMab=kjGup#XUZ>iunZP zbqKCC7ZWPT{I8-V;hHuPpr5f6u&N>>&x$3#(PCp&*28jD{~4uI5q2h9SFcF6jy996 zvSTw@;is_yhNVARf^emuvt}80HPd~8i0lf4qZ^D;HM$fTbDJQjw-sSqW9&IWjW(_^ z^r=|mFWWR?f_)pdv&5_+E;l@qJ z4UfUFnB*Bjk;HdojJoJ<=8+0YN>^`aE7Sf&fz)94`k_tmyK}_v80|D&Y*6k6X1Kg> z*}iXw0zj6qIvT7u2kdv-1p`glGXA9N1ph1G+rHn9@3q{EW!VM;I{A_0d* z1uypCwSz-zH>YM_(J5J!K)QbImbKdlhSsi028&G&2&s$>Wj`{%ka;}ArHS@^apCxO zF&cYJ#TaD9Q}a9G!`=i9u2IK1yZ~LY#pDVywQW_>)AEcp((8wBK#0^wkv67VC_h~b zbFoZCO_oV021>>}FkY@Bc>Go7d!O?@O4**XN_+j?V&JqqxoF;mNzgJBXywhP_AB$V zwEe6_D4O19`9vm@f6YS{${V;MaxOX{3^H}$XXfglpfkx}yFD50OZ%2CXMUfn=Ao9? zq=4s$sq0A_=P*@G4+U@QN~POnc^eC{(WF)*|u84CW&vYc;vLIZNvQw>tx z++;$il&;6|g}@Y-Ebnn2ud{?Kq=adxQHZiH8N&Xba+Yic5G7u~d^of%YbY&F6wAn* zhPQGzUJ$N!wv*9q#e`_`-nH0u@YR}o<_L47Jm zoV1si98+77DWPrp)&(!lr+EX@e5bBYK>r^U$YWY6LLTq*N^=uFj(%(O@tWP0?8+ z$RcAZ$Y!@Yvz?nOjM&|nY1I5Mu+1%8x*5Ajg1(=(lV3D+eY_}+!283L^f71WMS1IG zjWlbxY~|onx=cG<=Fb}ES1?gf+|?%%aG7diwrO9Aac)cxhXbmEx`nxNpH4?rQiDtv z>+&b?4hTd85Vr_gHX=sxy3QBJJU2+eJn$7U!`S5IK=Xm7S|AC6q@RDnznh1#g zgshnVKdFSchBv!$3wZ|6dFhrA#zgHksvwxC13*~0X$H(O$`w5(inohFTP=XHN^=oH zpG|0b^B@hU#kZM8)ViZ%KyEDr{{ZeiwL#V!~_aBJnFj>mJ;T_Oo-+0#W7WCkb%X1Nq8ob2aW`6M2U z8$eSy6iiXEvIo=L&!O!Dt2eFPF55S~erW6V?Q6FTt=o9T+RhWA4$>Ra8*Pg=aw z_&TL)#?Zb>d4y?b1rAEVk5{7^N^o)?Zp~@pvfvNMuBJb}7-8lY!>mBZy+VAVZTz{{ z0A+^g*_a7sN2gu0VW{7KW!}fD72c9u9fHYv8p+k=20nI+v()7K46U{@*)gzv%f>D1 z`_t7ZbSPUE2S$#WcLa5>i#P7Xf>9G&=ZvFkOMOuCOp5d+JKV(qnm3jiq#fwfJ4zLq zHX1+1`>?no!N9zjFi&j`pu=~+LrfaGNraISKBuYN2EjRsL+MMd#mz6l&vdN^CK{=l zuQQ8qjx&;`X6wCXtwa_XnG4#*u2QA4GRxAP?3$sJhBLdo@EXe7WvOWw7>`AoDPF)| zF*jy_u!oqO*^hi35+xca@Iin_sdWO8!#4#c?vS(AfYA8-IXXCgQV7WUTVcZZ_ zsY!%kDQHw9oRzDV-t_G_A*wF5j-hIyQBXhmp=m}_z?_s#5{`xsM(ZA;HBZi(dBM{0DYXerk9TWwju;0@UzUbAug+SQEi zYj5c4n&-9#{NN4yy3@XKLz-t7&L;FfDTXaR(xBA@8dzCom*YSyCBrsqATEU_G9Z#+ zH?5N4b?`O+-|bH>NMBEeEgX7y18$~dSfSFxvs`z69xE^Qm<*fyZOOI@F5Y4D!6|5j zpC}s1@RiKDC&PGnFx6luCamgq0i!`E#~k8QhMc-=T*>FU2DlXBvxl$7C7cvfu};#X zRofhtk+{XLiF0r#!6b$UnhP+@hlrjx3=M5leB{kGV;^B!!^ebd!y}CglmoXV|D*JjC-yI4L!K&2nnlzX(r(jwx-)l~(SsVwuFp=b0_ldE z9`oIGJ7~T;;wbZ7S7775uFEo;_nxnTpi^ewZBMYwmv0PMvo#dKW}BUZaXtvctUK{5 ztFSm#qczfLDb9IR6ZS!g5q)}`)7(_P6vl)U;bF7yhoHL=g*K&i$F^lc9s_nxyfp$OcQ;z27M$TleU6jRiAUl&AKE|5c z@_`m^KjJgpa~vcnt^fsEGBlA!Os!Fx5UH81(NWtbinTVS+1%m~xvSIL2Zu~R6nEC7 z{39hb?LM?|^V;DZ0~?22@l2>J`s)~UiyE#_Gs&djo5p0d`)CLK{K&iAZFxpwqb|hk z)8VRAnIPjr(DfwsO&}@gH7uVALV9HqgGQ^Z=@BZ)kg+@&lc*;Y$ovfBXxB&K0w-1n$ z68aF)n%w%cjuEv`xh{-KM_Z)R^5&DzYSKsX8Z52DXbF+{?p@BT<75nv4ZSf&!^DUd z>wNDV$P?ZfdP{x{?_+w#thd|*Iu1&@D^M+YxxPSwe8z1-`;t=}N@bQv+JFAsmRpn* z=9MLB65y4#AAxeSd!pi=v9Q={v6qnZ@p^H>!jElY3YyE(WQ8Js63JCSenDEjyW#l_3eC z2^9^cDZ1XDw4Tyl0%a(wNsV=L!Pe~(q421B@Z(yk{Jm zw}Hc=6-A(Q#`}c9q=zi(PeLNEX?btfOBEMSRn1S)TQtwKl3rY%xwQXcIWjLb*EefH zG>;$jGZl44R=nox@DD0(!!&WkKTV4jugoqrSLu{-4 ztMbDx#)ET7u=p3J%lRGNLxI&(QHDkG453nsaBs8?BH6*BiwTy>QsbP}6sNkP>LSC1 zb%#heSIkUqq6!oW<(a<3Mxb0GHk9LJOSgO+-5wl85_jolooKR~YuTNV==Qf}W7)bE z&baT-AC;r2eDk900oVW|f?k(kH_5l`LGCSokb5g05*~}iu z%9UM_^o3ONiK5C^9!nq(NM}UD4Yb}zqxY-x#`LAVa`G}y_h4&(UB~I9C7#Oh$3@9h zsWgLg9Ahtvz|iuf(rWz~Om1{WbD70Si-uSat2)vAY}_mfj8SS}bm&2DTdT}Fpdl)p z*!YXA>|j5`Ud&fiY9>>%)NENNF_ES@ph~qbGUDc5v_7z9oHr}T937NrtfKyZoB2pB z5Cym8t_G~R>@ztPwACTfm?Y`l56yt+zmCP&S!N!sshDfGhp1`B2@yobUwBc6V$hbM z5SohGp|j6b6pF;XdAGK+o>NbmRxXFFe&U-p)IBIy^C5NU+FRZobHxTxI)uZTX=r?m z!dq0T^H6s;g-L>r%(L23u`Es)ZmhbPU)Cbb_4l$OP}SlhCK#{YMaNWL1XTl{h9`$j8X;NA_UFoAV6Z4#p{wbye0^9v1(~I*kfZ^ zzHMW({dTLn`Ju4aZDEsjlY)mdjcT)3`P8wK$}D8G_-96>6==TKSbYO)1a0~x_VJ&bMI;8; zPt;&6$3|zVD1qkH&}*8z6y;GbAw_IR1V@f>DM)rVE^yEO6RWR}jB>ACTVnjsD>_){i ziLVGv2Mt06*kmIm^df0kqly9(nQ>j)r!e4Ttz*22X>)y?T|cz4qBAGVJjFDa(QGq` zundD%3EJtdN%5^P2uR^wlNX#Vb5ua=XAFJ!?F=ig^qd~C~ z8aoOpepd??0I6QmQgTn!z8)j-gHMJVa>cnmktrO(YuE0XNI#}AXM`K3TTN$UN%9y$ z64Z=|HYggAL7-gH&cZtv3%UKcBCP0D;-^f%)Nsv>(%iGL-^hKYD61vXs@zN>RS_l= z?nmzH{%wmlAZ))^G?00OcoZp=bJu7# z5ndh{yH3pmU{pb$#7s?i>K;?{r3ytv2iQ0+-Fb1=Z_3(OR?H2ZqODCxo0LyKDip{x zax?zC+lkN{mzvO>2_A7m1NOa{P7KISCtFxl_`Hf^=F*ZMQI@1ySu3=vSrwA(5n}Jm zbd!HWEhmx>#FuDAJj0xV&9JhXkwgykw>*Is96+0x{2(DyVEaMXs+Bp%#mK0;`TKp z^s5y=gjZ2%@o^$b3DP6BkZnRVTaV|J(gqSR?`IakV>27PEw@oedxAr;W6Y6T2$@O< zndW{I79wSZT40JSN(i@`Y!+~yhL!P(2TX9sX6@UaSW)M+JEUVDF0={Wq!zWmB&w-4 zQ{&@<&g+%o%4|OzMJqDhoiQroQAYowB#y~A6ip{q4PtxK8gml)tJ5(FfjKu@Ggvrr zP?>krXo#A)KQ((G_XZ6UEoq;{PUGk|M`8BdY_{7r31v&80%V&Ngs4Z!4SeEEEXLZ- z$s%l$;`&&$SQ&*D^eSV-JWx`tP?&su-dp3XHguyauaKN$CFUHfHB+0VGkGM8+g+suLK z^393+r!wOBb38#&$*0LR{|P@K{4NdMimyd3GMjMME%T#MTZ`(&{x+s7N0`=(M@bv_ zQGeQvjY#xAGvOY^5yAn&ReRU$fP*ZGNy5k|znhUaD+8{~`!M`YLk_!*RTB~(-MIR) zXPH&Ws*uf4_a$ETHc5+XnvgS11lC{)G_c^MQhqS$Lf0nBFRF)aNvqy5Nmlg81naHP zC}QrW#c3V0a>UC7kFVB!QhS&UM$!R=Bl%nZb zYjq-ND-vWz^^DXye~zxznhxcnoJuIxqAzU+-QBWI5(4>0ydSvy-8MP_Y+DG=K?YtqmnL2LDQEQ#GL zJ-mzqO?@3#AE>GEd*RF4SBn_^n1UJJ);Gt>`@itkeZ8bjaJeplE--IA>c_?svGVnz zIS1o`v_s*$LsY->|o_Eo&IgEXQ(N@}%@2pMLlhuJowV)X#eu@_?{HG(#2eG8W7Kp-Z$#Gsd6@jGT$p@#|3|S=rO%uzLcu1 zO{tiMOqF#Z_6)S_{yDWp-shCh$+zQlMiF)c#4e^iOaqZ)hXA0fSh{Z;u<)cD>@)Zu zZTeo5{HjWD@Azo2@Fb#%nE$Md6?PJ&Ce6aM>EwltV}+|pWbV>c<>pWr?C10?@7iuF#|xVq6XmhO zs@6oKFvN^?*S4)gh1Cca83Bbg2#)@A`O>B57M3k9EM1;1JEwoeio((hmM$e>VLRIa zD({YT%L>burAyE2U%>-PcLg&8g&~aS1{<2x*bxVcwBMz3&TyBglYytG&Un*?_ChQf?L+s zrz(5zKDXF$n;B!!5*^zt;R<2HG+QleQQ}{)^fsYYYKl ziHxyc$!won4R0WAg(;${UdZ2u@Qh#E3 zZ!1r*$>kKvJx;$!ZR|xdiF1Ta21|8{!XzJhWHs$glQk`^bR5H$8078c(%##+4kw`n z)}fEc;NHmyrwUU@8A}LdGe}v1t_r1BO*fi*@4)dcgKn~hn@3A{IPFWepmNmh%{%el zK!EKHi<>BljH0deF#=r^MG?XiCHd-9h`5GYT}#Z!gatJSeWmryD5!aKCjKoq*huDy3m(w<=(V;P!d+}JL`rBa`veR2J=_rXMI@15i0Oc?ib zFZT0zagwY_uAPmc`X)UY_BHl1TWA1{(fVcDnGJ0__cp%DwghNzZ@eZZ#G{kMYB!fv>Wmi{6(ytE1ScH$iXwvu#QtbEOFS0|cU*D8aiX2?AaNb=qUj%t(q08t#CgRdc7P{q=tBz}G>~4W7EG)ZByQYK_-h zbhz!SY`o0~ZBX_+-oz?zVgj1&@bZJW$97iEh+G8>%*I4f*^8SEHRmBo@73)AD@D@= zpjvB{X7&(&rU`4CWh#YQgQ_YiNClb%?=cO(s{|9$a8%8@$~1hbB9>FBP2pItrdy~H zxw4TdY1H_E>%=BuyYH~`a*2MfjKR7WnftbPx-_Y!Uz19}(8XM25p}lpG7*&I<;Bz9 z%Ub2YvvKd`X6(UPcf`{~2V;u(V$5WX6uYV;tH89wp3Ba&Me&hR($+L1AKHOO^ny)t%>5JD$~MpA#jT5K-u1TcQ67CcpT<%@{2=?ath;J(3ka zkiQHPaPr5aM^TJkDgNHOMyF^|k(zJM%m7~_7Rit@Bb5fCaqW_A&kUKz!JIXdwr%FR zN$Xa1gbreQ4IX4nC8nNl4`8UXN79NoD$-poWW2^BdmoUL zAuNGTvx$MI9wWwaCDmEHvG-OLt*4P(*J{B1_TXfuQen_gWCn6x{b-F(pe{iMXdccQ z*%hyDG9P|7fOe8m&~+^?Q=nuGD$M-6*@y<>>|mh0-t?D=lBrk8My4lll~S|VR@r9J zZpQP9cA8-}gxMp_fX#Q|ocYI$b&yyA>Y>}w1sGsdL7nd!1fmsICia6_DVvZ5|BO$x zFXLK9dn9$SLPE8uX<6#c2hZoveRdb>hrds~V@2|;cs19h*&(2(0gZL(r7$feW{ zNfb|t9dE-jfpKe5E|t`V)z0z)mo(a1#Y_of4Yioziw!~Patao^99Gn>*?2dWWPBx` ziAZ3cj1s4R>20NlWMovb*ZPbf)WAwkz#oz=@~uBLw-&4!8Xu9Szk@bk#5jX>&x{wx zrZ7mbz-4AY#(VGL!v)$m()P^`V~8>55mXXK)aC7o%DhG@){9oP&%@5&tfK_)@&)dPo8AP6ud*jjENSC zE3ec@BP@`1DWu}c2^c9o84RQkPfwj2P;D8o$=+wcgz8nbuMNZ*xHXK)#@j~BiWHt< zb*HPiyoU|MwvkIAG!wfq&gMR(GKRVLE~whFYby8kC4zC7fUPu>9d7m5J2c#?@atf< z@!L&14I(|ppfL-z5C<~jG_%}-`4lr$dLM!bMz3bsaFO@xH!^x!x*!^xZ3r$B%w6hA zu14;_cc^5?xDn0DHJ6f!*~Q+)z9Tq_pf;#1(70%y-kutagSI7jVX!G_JtnG0(D{(+ zi}~1KC@kT%u`+HG8jJHzY)!Kol^wI~{T+LSR|$y`FVM@RhE=VyL9{s`xK$!4A?-jx zypXhIZkB~{MwQH>IW*$;-civV{6hoMzxmY^>^WDNoM(2nygmrxHo1mv;B|d$MkqBTlPu9w z<0bNjl3r)#U1+Fell(YF1y1X=L#LN>HZtHeHAIglW@5@qG?Yrt|2rP1hcG5_qIo(R; zUF?ABoE|_AiaN4q&k%R5DI07yG@R*(2TP`k*HOFK1J!fzQKQj{DlVpM+Rr?S$L!%2 z+an62Y{13tU4`odWeQD;k&%_pIIV`6_GFh6+6pOakVNc%J z8mq3wOuPL~ZKaz+KxzOZOqgYPDxKbY=Y*-Uv5WSb=;;wUmrVOz-I-G|`8B1}2U5pn zhx*Vt6oP{<8+CqHB7bl`bJWY`eU#A_4J1O(glWcWB_cNy&Vgt&+c`M;%#)G3?hZk_ zs=eWhBep%f?G3-F$TrxzqV3^3uV{OC?87|?M64a77z3usMzg}NFym& z?i}RR+Au!nAWS-(P&Av{tJ?3xV-n;;L%+}@n_J3pm}}HYiNQH7PaPIRM^|Y0tp;GtfWL3fqzRnY|N?_nbSB-R9P< z-EhTP?L!aG9;GNIBnGPZV_|HF+>T{d>y40Qn5o5OwmKsTl@9WdYqI{#vxBi8IX7?6 zFvvgc!j6j}17+7w3&{OUZ=;*f-?$KaI}r-8CIIC9v>qrTBeX1dLaeD>n7J7n*NsWoA)d;ivuOH8-g2q^?K+yKHfY2q z(xztPB*$0gGcUCHh|Ch?7w)CVx5bzqYy12tNR6I{TWHqWr)?CTz`puSmIYB- z+HVT%WP#t1NDJI|j((ka5M145!k)-?qYXY1WV`O0sCT{21Q0#wDuTEJu0HdDsSShf z?7t``gG1`I`PA+1Y(3nRZ!?UfXE0*q7-qnmC(qfp`IVRyyNhAB?~H60e#>a?Q+?^e zfx*=qH!k$i4bN*f16SPX+A(Yk z=TvYz$TK80gYEve*j(M3wc8_G3VbcLC!Q0V8SaieqnnNY+4tX{%Ths8)Q`RYt(va9 zL=KrbT&UsO`YUVqw0BUu z?COI9L?f{Uk-Qm@CBzerMv2|5xkVz}vxinh>Md0-N(WYN7`jSZUaf-Gcy*c?0L!eM zmj`a_K3OyjQz2m@&>f1s+s~TbH);tJAx`Ghp;IfAN;7Cp&*Y%kj?J5!hT;rgqizCX zUowFF1`958`h9YoEq|JOOqN;4H*o-KnUu+spllj*V__{@>eu8uHkQ?{uD(`K7_g5O zlyX0c4g_Y7+LegQ5K{HF+}!fIaXUCIc<*BOlfUXAb7NJU){!z#RS zvX;#xkywC+FEcp^LV5poz{8Bnx}tm5w)*i$b6%0Yl=%>}syiu7lApRUZNpf0?kX|J z`rd)bV0_LV{gH&JKz9ZQAFr0ao>3GxJZzV)+)W3^RkQB-^&3MnQ zwc}LKNPK$8pK;?PxdKNfkp+qs2`U4Fo?g`?7{ko`0Pd^dGY6|Ooj7XVx|CDIt;@yq zlVP`zOLyJ6$#iY;{8WcozH!*M4B+Tkc%a8X(dSufm|mtR0%IfSn)_2)hzVuOb>>(%7^Tb^ayCZBY7{eqBwS2Zwi{vp zD=MZoFjCh{O0rgk(! z828TNbKjf@x@0wSQ79Q3P~I&2VhKWCDf+|hdh4>f> zng4c$MyqU0Dj!VJwBYn-U$1bQUWXr<+k7CY*?_Cyx7J!!+ygcd&K>A%Pgif`Bh3_^ zU<0e;;}&WHlVoXVaglG`n#W6+DWi&jE0nawM+&+ryCMcPi0XB%mJojlT z1y!ZbL_wVN_2_{)tSj#|S|e%D9>+O%q50zX1Fg1>WcBO zd_?2AwO6el;u{&+grckpzGIM^UNpIgu@}M?qxaVnns|tn%^4USxyTB!G0pJFV%27` zb=&w|+&u)hW)Z8JV`Vl1+iirr=10+u9hB@GPntj(}mWMQc-D6V= z5kt5e17K$mwgn51!MTG@2UB5AuBlJmXS{-H!4#*E2z&HdP-z^t3?Mazh8E~fk{n&3 z0l;I$eV0I(;b)xw=Ck$86WRDrR4=l3Wun> zaY1~Wq}K6S5Q}D-;~hijn<~!O2wwz2>)#kY2O_ILqf0yjKg_sKng%x08HOSOz)o_K z27H}51aUiO5*Z^Q%+u`EkVA|~G}mw}YQUZ33kdRNWrHi|@ECdbUj;vtvC63kPFV8oTHNL(b<0(0JrR9w!6vh++f)oMg@`<=l)OYna-+EOQC%QbX?`1u@7`b*g+_BoPkZBA zW*P)Oxl5kb(gioiVW_YRdE6UDVDyE);HkP;GTyAU!sILOh(|QZW~zR z*I`Se64)g4Qjfk!H336Qh$^%$!k!_mf{lF}F&X)cjsN3K0gv#otZX#t3-va-%!y<) zn0`+& z#ksQ*;_Z#jO(`WKRZbWwvnD$j$@njDQ-yxfSE2L^ zk(lBd_!>!J&^}zpX=mPZzD}|j3)IH4`z|ytOrdsXXGYQ;s$`$9(6T|4EykefG$#xR zh1Ou8n>$1D%V--4YwHs8+Z~Gai`G2_!%d?|H%Y2lrU$-(5W*GutIZ~RZMdm8^=yXO zV;srKeQx@eNqb7&Oj0drG!W81HM%s&9($d#ZhYN#%VYnV{xRLZ_#Qdm`NpkKG9 z@hW+sD+9iVuuVmGhpC^;jJmERJ&eV3!NpXNRqZY)ea!^DAjFDh@#cl$oKse+j7x0E z#VjTsUK}G)$Sx+yhv&B+ENE6B_qmhxX5CMC=wiQSyD|2&FP;iezb)<#(kmlrMb%)(~CFR z@1cMe>w7go7mz*c{E7rP$uEPWhaeq)XULhaKWrF6Pq0vMjOpRFksmMZK%8Y{)ze6J z*z}}%eML^}-3W)6)B-T_ai6z;qs1nyJj9o-pt9_q!xQootkt{$-S5|92=iDG7H66k zdPkSdThW_dNn7WlZ*b-oSLyRD@+#WbTdcSFoN%&({T5t1mBz1eAkuA-Dz?@8Bo8pprfk!`JsZwuaAr`W2(Ho0>dS5)+CvFJ% zZZ}lXeU@!&c8=-9V_I!Re2_Aa9YR4}&s7yQmNYh=d;wAjoeY(p7S0|~ zrHL_>jB@9s-Vz@*5!K$>%Jo?{S|lDQj2lduLY$9uS8uvXs|M10HitE7*}}Mva(Z{- zQIxq7vhR=kTB8fdL)`xQi;6jE9Yx{QouVJSkAWrUCQ%R?`8ws45>aWlX7K$XrUk>t zVCGJe#dh~Dj_s4nt9xYr55zoJR@kKJoDeG?g<&|v>R8A6hhuhVA{);8znGou3KibR z++_BRnYCMTU#Af(JorZrQXi4+JO0l7W#1i{33W zEdYxzl3th$ud*d+Rs4${>^58?tPov@H?NJsdMcDSSv^SexW0kwa`(@1!okPo>rv@D zSRh~NVHX`dMG2QJoQ)AzW5X=d^Q4Xx1{vB~d#XhwI0l88S!eUvq=vg|dF=#C4Q!?% zOrpaCZSX|umI|yLp5beJ@`jxCVK~;Us>p%=OTLF_H45t*5Wr2K1r9FdiQ(n^E+pF|(qGNSR z-+(^mD?pfluVxDbDl9LX8(g#r=4O^i7!?w}T1d+@GOjm~sN#5nTIU0g-nZ4NX*&|o z=`*)Z)W?FNBSe+xgoG`JkXoC})QB^;2s1bFdgs`IG{Oxtd8%^#6G9&^1~x+&4jgtv zeyM{|iETWm8fQ^R?I+E~WR%e%R7pDPRKTf}Ub z4@^^Ed$bP(?Uw8-5p7FfqwYw_g#P2h7=&tfqN{KOirH7h=7XMi)ijYI)}B%U)m?E1 z1J~%FzrpZDCvMWPWm8w8jXYqVo@S=pr!M~kO2 zE~qyU*f1Sta`I7JePZLV9aBsEZEcf!c2%esRbhn2!u+|FQ454TL~5}@lu?o8Cd44K zeN-YmNXc_S_VbnB#@E$8ZD?--cIF&RpgPro`T;6AzN`OAc;EJ^L@B7c6m zp;jqmfm^a@&^t8V%o`H|gXTUNB)Ij3)^s~}XD$@kZhK`Ir?zg0A}pEznY_zMOey+I zXY8|8YUf#T>}-4C>O&Zq=9z>l7*g8SC2Tc7iI@*%2&9qgLpE5_8lYU|e|;!P_3d4H ziPx{Kjg{C^XVwA_K67O=T7jH9qWi^yRZiQ8B+jbRL1{0qk1qa29+&PayCet7QPbPk zL%`z*6RW}8M>MdoKuc|m`)MH@V!0J839TL2(-JQZ!P2a;^^jCvxeiaf8KWIv!cudo z<`!0%O~Hmm%2Bg2c@%Pz2-8E`*=d$I)xr>ZBn}#pvwi3gz4Isv$V8c-_0_wU+%M6dY6{Y(jlUWxaKV`Irn%>C?$SA%bY6&;iDnc1K~?n z=6y0KkfK9&5*JgVZ)^(}y~T{F=z8@Dc>0>C62AS^p42Bh|F~9;=`;#*SsN?6DzkHm zJoPxLdbdOu1T~QhxMzzu+f2>Kp6?M<5_ExJA;advjJ9v3;#;+_@LW?6Y(jx)uAG?wnk@1|||yjkBwsuYeKibrvdA&pl~M zYj76klUq#LJjtWEvT9eA@UBRvxNvG)y9E zmwM^OP%y7#)meD1k0X?ZY$A8gc#xH%@f_b1w&jD@iSjfr&1a_D+JaGniB_J==q6UA zS8ooyj>6l_rM!L^Ba+stk#X7h9S_;Y+PcELos6U{1fq(;tirj_Vmm~FGo!h!Q%B(~+bGCRT+htE5lWHr2=rX1Xx{{stQiXXmPZ@eS?KAD2rF6zV zP>Z|J&Zl-2(X}PDv81H+O{UO=7$*fdhK=`TDWaNMaw}}#%BMa?_MpuHtpxF=Hi!yj z92HSHH*U@8k2aqciz78V-(Y%` zoMd55t_{nMxrSWn+u_L4QDsbI@yYpA?u9Qf4}jgu@(#10WTQRQ>K*meCO&p{5mUoZ zAHxJbqL~M_`l#+{#>d%_DqD;$H$h_t)dIDE!DuZ<^`d=_FGx$)5Umo%7Fj8q6NzrE z5Rx^tEgxPH_H^(-3IbO6NN3aY%vhEi_|!BoIJ)2>wPk#ns_Txi#Wu9nr>H%MMTP7j zz7cw1-9n}`l17$#K3zuGS_4N1G}+B~o{i$S3Yvz6HSfdd_>`(@?*ZJ17tn`_t z-SGwaIyE1iL~Bnq6}n5On9#8xh}aG7C-I0Orp274d9&Twh^}aRvB{75GAL5*nip{Gg2^iH^vamKHT#sBRBxMZ(Hn8F zBeQ4JQH3yq)ub|?raRR7WR{EFmm!!^M0h>yP5#Udza`z`MB z4lB{d_y*Dbb}#M&^s5-uurmu+%Neb4V`AFOqLkUajxsA!i6*!Xe_WBsE*zm6_t9zy zZ4Ys$tLbqC5TN7Xv6MV2LT@ zDvG<8Z1YW}iW+%mvXoenYS?@yVHm|3ps3!)P-@LAl=2mg0|XsDkcb9Tyoz@a&D|af zrL#Q(H9>hDzB;TsNZ;dw*b9hH?a`2CA!;)^n>#iyArvh6Nn&{vWdP7=xz-L0r-Mcn z<1vds?cK)WIwpw2a#dr3+h}}WWgd3AX3xM7ioYp-G7c$Z)_FByQ*2ZD@}t_F65#`K zQqW>s#3|(96f+gVm5tzE?iFp(jpmXzS0s%ge(Lv4H^F_V(8Vyk=Xm1HQdZYn&}MHLaehq~;C~PjazkZ{wP%%xJIkOLERfm!$E_ za{_f{ zF-N#Xh(eX;gE-l+sjd7WumDp&1Kr~)7C-j|e*MV~n|;X79YFB-6@m@TCZP&WQbyonoFw`1g5WZa3v3WP37Vhy zVKe>^U(5g2C+f6WfQvp~%{l1$!YJVTNK87WRjAv8|nASl)6OKx8qiUlLMW)2flhS=oe^}v*rWi~u{Mb6bh zPsQh57i+(|&D3@vpxGa=Q!6pOg*6Q*Tyrup&xT4d6uzD$2GyYkAh!7&XjthpZSe`2 z95ngkJybq8CT@v|_2yP!Ov`IEz|+^CPo|;)GV~3p>U_5J9!-(U#LT%-1*G2=7OCB#7X0W9M&ZF2_?#8~X{JdQoi!hkYu>fIO))@Az zdSn!lN!)WaKY($y!N8cSGre`tCccf|=p5ZVp=@F;;nVG%2j!6j(QDWcSyE8j;=6~s4i2OlP zNCW%$`1zEb*hu??=Vx(}VX{?N%V(97Xql=peOHx!y@V>b`cMK#+~a{apm+Mhdq-vZ zM`$sr$jllJu;&Dl&3#FkhjSBtL$O*qW5m&6!}5c8Nug!LBFLqx=vzt^gM6Y!59tux zqnI7v0jw#v=rS4&^TqNDN3vqLI|3opU+P;IFHS9!^iIz`<30!XA;@m96IqXM1}@OT zu~2)F1Pt93#AY_w*iy{_mt;Q^Cv*s7!3KOlSRPYVnRSX|BttYSh_h@seFy=xStPu= zgEagvHKbFV^FyT{TBtccW^YQWAWk2n(`}%Vfk|H#qu)Z%crM1m&zR`P3Q&QsM3Tlo z?Cs7R?)E;TWnF9NZuZ9vpPMrT{afboOi{^=){&K1y-Ek_mPv@!u?K$-sOLqN%XAufyW$#J~@1ug|}s zmd1_*C(_RHpfjrRTq=q^oW}tl(ns}AiCf4e@!G5qW=}<^sEAaAa&b&83{K-{Jr`XT z_(bjkFng7=d&^qDUaD$f4H&}FQHfHb&hQL51FXgpAwnn8J0VwqQX_rcEs2`NC%MM0 zNB{#Agw@UBjrhzL0oWR1aDZFocnZnS;mOoyf#L%rI|R+Pb(Y|94_Oscc72t>3E?)a zKc&LJxSBmA&hxWhBLAu&U&iRpUG5@#@M%uXT!>`XP$fwQ;rnbB$oM;joY8U<3+Xn$ zkb!|K-a_EaB61j&sDPri1)#&#!MtqAe0g^usqzxwkvt)5*rtfH<+SD`%FF_W3};=H z8yJB@LT?vUB|Iy7)tV7_(r%9i^AnmlR1#jVCL>BqK#;=4<-{46TPZ-Mu4QRCN}TlL zX*e*4g%|HNi4zn~oDRWb$g`Exr7X~bmqwX>aSl&sAkC-kV&PWrQw?ggsUZ-TPx+j!(sI zeWjdqB13yk24+L#{T8?;<4Gz%FN}i5cCEucN|p`6d1ulI?|Gqk^yd&2j zU{VZ}PD@$7?gr8(b4nx-9HEjVnXYbsZ74ys%_~UOfjO~gFJgMK8IayLsx-?`$5{!-slY0Ys-Cn_@ t0DjQkAJ)J7%CHl}Aw5jtxd*|hKgemL-q$Da$_`!XvfU7=n(K8k{RPu}5mo>I literal 0 HcmV?d00001 diff --git a/locale/de/LC_MESSAGES/bittorrent.po b/locale/de/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..0aa66b8 --- /dev/null +++ b/locale/de/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2945 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +# translation of de.po to German +# Georg Schuster , 2005. +# translation of bittorrent.po to German +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-11 06:32-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: St0fF \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installieren Sie Python 2.3 oder neuer" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 oder neuer ist erforderlich" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Geben Sie die URL für den Torrent ein:" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Geben Sie die URL einer Torrent-Datei ein, um sie zu öffnen:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "DFÜ" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/Kabel ab 128k" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/Kabel ab 256k" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL ab 768k" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maximale Upload-Geschwindigkeit:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Alle laufenden Torrents anhalten" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Download fortsetzen" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Angehalten" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Keine Torrent-Dateien" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Normaler Betrieb" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Hinter einer Firewall/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Neue %s Version ist verfügbar" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Eine neuere Version von %s ist verfügbar.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Sie benutzen %s, die neue Version ist %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Sie können jederzeit die neueste Version von \n" +"%s erhalten" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "_Später herunterladen" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "_Jetzt herunterladen" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "Später _erinnern" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Über %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Version %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "%s konnte nicht geöffnet werden" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Spenden" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Aktivitäten-Logdatei" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Logdatei speichern in:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "Logdatei gespeichert" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "Logdatei geleert" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Einstellungen" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Speicherung wird ausgeführt" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Neue Downloads speichern in:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Ändern..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Jedes Mal nachfragen, wo der Download gespeichert werden soll" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Download wird ausgeführt" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Zusätzliche Torrents werden manuell gestartet:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Immer den _letzten laufenden Torrent stoppen" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Immer den Torrent _parallel starten" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "Jedes Mal _nachfragen" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Seed-Vorgang" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Komplette Torrents seeden: bis entweder die Verteilrate [_] Prozent beträgt " +"oder [_] Minuten abgelaufen sind." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Auf unbestimmte Zeit seeden" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Letzten fertig gestellten Torrent seeden: bis die Verteilrate [_] Prozent " +"beträgt." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Netzwerk" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Nach einem verfügbaren Port suchen:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "Bei folgendem Port beginnen: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP-Adresse, die dem Tracker übermittelt wird:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Dies funktioniert nur, wenn Sie sich\n" +"im selben lokalen Netzwerk wie der Tracker befinden)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Der Text in der Fortschrittsanzeige ist immer schwarz\n" +"(erfordert Neustart)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Sonstiges" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"WARNUNG: Änderungen an diesen Einstellungen können dazu führen,\n" +"dass %s nicht richtig funktioniert." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Option" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Wert" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Erweitert" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Standard-Downloadverzeichnis wählen" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Dateien in \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Übernehmen" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Zuweisen" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Niemals herunterladen" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Verringern" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Erhöhen" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Dateiname" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Länge" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peers für \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP-Adresse" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Client" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Verbindung" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s Download" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s Upload" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB heruntergeladen" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB hochgeladen" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% fertig" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s - geschätzte Downloadgeschwindigkeit vom Peer" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Peer-ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interessiert" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Gedrosselt" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Abgewiesen" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistischer Upload" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "entfernt" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokal" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "fehlerhafter Peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d OK" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d fehlerhaft" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "verboten" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "OK" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Information für \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrent-Name:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(trackerloser Torrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URL bekannt geben:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", in einer Datei" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", in %d Dateien" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Gesamtgröße:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Teile:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Informationshash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Speichern in:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Dateiname:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Verzeichnis öffnen" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Dateiliste zeigen" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "Ziehen, um neu zu ordnen" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "Rechtsklick, um das Menü zu öffnen" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent-Informationen" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Torrent entfernen" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Torrent abbrechen" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", wird verteilt für %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", wird für unbestimmte Zeit verteilt." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Fertig, Share-Verhältnis: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Fertig, %s hochgeladen" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Fertig" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent-_Informationen" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Ordner öffnen" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Datei-Liste" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Peer-Liste" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "Ort _ändern" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Für unbestimmte Zeit verteilen" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "_Neu starten" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Fertig stellen" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Entfernen" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Abbrechen" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Sind Sie sicher, dass Sie \"%s\" entfernen wollen?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Ihr Share-Verhältnis für diesen Torrent ist %d%%. " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Sie haben %s zu diesem Torrent hochgeladen. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Diesen Torrent entfernen?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Fertig gestellt" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "In die Liste ziehen, um zu verteilen" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Fehlgeschlagen" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "In die Liste ziehen, um fortzufahren" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Warten" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Aktiv" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Momentaner Upload: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Momentaner Download: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Vorhergehender Upload: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Vorhergehender Download: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Share-Verhältnis: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s Peers, %s Seeds. Insgesamt vom Tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Verteilte Kopien: %d; Nächste: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Teile: %d insgesamt, %d fertig, %d teilweise, %d aktiv (%d leer)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d fehlerhafte Teile + %s in verworfenen Anfragen" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% fertig, %s verbleibend" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Download-Rate" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Upload-Rate" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Nicht verfügbar" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s gestartet" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Torrent-Datei öffnen" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Torrent-_URL öffnen" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "_Neuen Torrent erstellen" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Anhalten/Abspielen" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Beenden" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "_Fertige Torrents einblenden/ausblenden" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Fenstergröße ändern" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Log" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Einstellungen" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Hilfe" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Über" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Spenden" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Datei" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Ansicht" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Torrent-Dateien suchen" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(gestoppt)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(mehrfach)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Das Installationsprogramm für %s wird bereits heruntergeladen" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Neue %s jetzt installieren?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "" +"Möchten Sie %s beenden und statt dessen die neue Version %s installieren?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Die Hilfe für %s befindet sich hier:\n" +"%s\n" +"Möchten Sie sie jetzt aufrufen?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Wollen Sie die Onlinehilfe besuchen?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Es ist ein fertiger Torrent in der Liste. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Möchten Sie ihn entfernen?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Es sind %d fertige Torrents in der Liste. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Möchten Sie sie alle entfernen?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Alle fertigen Torrents entfernen?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Keine fertigen Torrents" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Es gibt keine fertigen Torrents, die entfernt werden können." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Torrent öffnen:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Speicherort ändern für " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Datei existiert bereits!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "" +"\"%s\" existiert bereits. Möchten Sie einen anderen Dateinamen auswählen?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Speicherort für " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Das Verzeichnis ist bereits vorhanden!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" ist bereits vorhanden. Soll ein identisches zweites Verzeichnis " +"innerhalb des vorhandenen Verzeichnisses erstellt werden?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globale Meldung): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Fehler" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Es sind mehrere Fehler aufgetreten. Klicken Sie auf OK, um die " +"Protokolldatei anzusehen." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Aktiven Torrent stoppen?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Sie sind im Begriff, \"%s\" zu starten. Wollen Sie auch den letzten " +"laufenden Torrent stoppen?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Haben Sie gespendet?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Willkommen zu der neuen Version von %s. Haben Sie gespendet?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Danke!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Danke für Ihre Spende! Um noch einmal zu spenden, wählen Sie \"Spenden\" aus " +"dem Menü \"Hilfe\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "Abgelehnt, nicht verwenden" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Das Erstellen oder Senden des Befehls durch die bestehende " +"Kontrollschnittstelle ist fehlgeschlagen." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "" +"Durch das Schließen aller Fenster von %s kann das Problem unter Umständen " +"behoben werden." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s wird bereits ausgeführt" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "" +"Das Senden des Befehls durch das vorhandene Kontroll-Socket ist " +"fehlgeschlagen." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "" +"TorrentQueue konnte nicht gestartet werden, siehe die Fehlermeldungen oben." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s Torrent-Datei wird erstellt von %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Torrent-Datei für diese/s Datei/Verzeichnis erstellen:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Wählen..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Verzeichnisse werden zu Batch-Torrents)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Teil-Größe:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "_Tracker benutzen:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "_DHT benutzen:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Knoten (optional):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Kommentare:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Erstellen" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Torrents werden erstellt..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Größe der Dateien wird überprüft..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Seeden starten" + +#: maketorrent.py:540 +msgid "building " +msgstr "Torents werden erstellt" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Fertig." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Fertig mit dem Erstellen der Torrents." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Fehler!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Fehler beim Erstellen der Torrents: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d Tage" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 Tag %d Stunden" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d Stunden" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d Minuten" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d Sekunden" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 Sekunden" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Hilfe" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Häufig gestellte Fragen (FAQ):" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Los" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Wählen Sie einen vorhandenen Ordner aus..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Alle Dateien" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Neuen Ordner erstellen..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Datei wählen" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Ordner wählen" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Gespeicherter Status konnte nicht geladen werden: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Zustand der Benutzeroberfläche konnte nicht gespeichert werden: " + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Unzulässiger Inhalt der Status-Datei " + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Fehler beim Zugriff auf die Datei " + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "Status kann nicht vollständig wiederhergestellt werden " + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Ungültige Status-Datei (doppelter Eintrag) " + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Fehlerhafte Daten in " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", konnte Torrent nicht wiederherstellen ( " + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Ungültige Status-Datei (fehlerhafter Eintrag)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Status-Datei für Benutzeroberfläche fehlerhaft" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Falsche Version der Status-Datei für die Benutzeroberfläche" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Version der Status-Datei für die Benutzeroberfläche wird nicht unterstützt " +"(von einer neueren Client-Version?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Zwischengespeicherte %s Datei konnte nicht gelöscht werden: " + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Dies ist keine gültige Torrent-Datei. (%s) " + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "" +"Dieser Torrent (oder einer mit dem gleichen Inhalt) ist bereits aktiv. " + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Dieser Torrent (oder einer mit dem gleichen Inhalt) wartet schon. " + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent in unbekanntem Zustand %d " + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Datei konnte nicht geschrieben werden " + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "Torrent wird beim Neustart des Clients nicht korrekt neu gestartet" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Nicht mehr als %d Torrents können gleichzeitig aktiviert werden. Weitere " +"Informationen finden Sie im Bereich für häufig gestellte Fragen unter %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Der Torrent wird nicht gestartet, da schon andere Torrents auf den Start " +"warten und dieser Torrent bereits die eingestellten Voraussetzungen zum " +"Abruch des Seed-Vorgangs erfüllt." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Der Torrent wird nicht gestartet, da er bereits die eingestellten " +"Voraussetzungen erfüllt, bei denen der Seed-Vorgang für den letzten " +"vollständigen Torrent gestoppt wird." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Letzte Version von %s konnte nicht abgerufen werden" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Neue Versions-Zeichenkette von %s konnte nicht ausgewertet werden" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Es konnte kein geeigneter Speicherort für das %s %s Installationsprogramm " +"gefunden werden." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Keine Torrent-Datei für das %s %s Installationsprogramm verfügbar." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s Installationsprogramm scheint defekt zu sein oder fehlt." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "" +"Das Installationsprogramm kann auf diesem Betriebssystem nicht gestartet " +"werden" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"Verzeichnis, in dem veränderliche Daten wie Schnellwiederaufnahme-" +"Informationen und der Status der Benutzeroberfläche gespeichert werden. " +"Vorgegeben ist das Unterverzeichnis \"Data\" im \"config\"-Ordner von " +"BitTorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"Zeichencodierung, die im lokalen Dateisystem verwendet wird. Bei fehlender " +"Angabe erfolgt automatische Erkennung. Die automatische Erkennung " +"funktioniert nicht mit Python-Versionen, die älter sind als Version 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "ISO-Sprachen-Code, der benutzt werden soll" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP-Adresse, die an den Tracker übermittelt wird (funktioniert nicht, wenn " +"Sie sich nicht im gleichen lokalen Netzwerk wie der Tracker befinden)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"Global sichtbare Port-Nummer - falls nicht mit der Port-Nummer identisch, " +"auf der der Client lokal lauscht" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"Niedrigster Port, auf dem gelauscht werden soll (falls nicht verfügbar, wird " +"der nächste gewählt)" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "Höchster Port, auf dem gelauscht werden soll" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP-Adresse, die lokal verwendet werden soll" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "Sekunden zwischen dem Auffrischen der angezeigten Informationen" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "Anzahl der Minuten, bevor weitere Peers angefordert werden" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "" +"Mindestanzahl der Peers, ab der keine weiteren Verbindungen angefordert " +"werden" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "" +"Anzahl der Peers, ab der keine neuen Verbindungen mehr eingeleitet werden" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maximale Anzahl erlaubter Verbindungen, ab der neu eingehende Verbindungen " +"sofort geschlossen werden" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "Sollen Hashes auf dem Datenträger überprüft werden?" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "Maximale Upload-Geschwindigkeit in KB/s; 0 bedeutet unbegrenzt" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "Die Anzahl der Uploads mit besonders optimistischen Unchokes." + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"Maximale Anzahl der gleichzeitig geöffneten Dateien bei einem Torrent mit " +"mehreren Dateien. Dies wird verwendet, um einen Mangel an Dateideskriptoren " +"zu vermeiden; 0 bedeutet unbegrenzt." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Trackerlosen Client initialisieren. Diese Option wird zum Herunterladen " +"trackerloser Torrents benötigt." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "Länge der Pause in Sekunden zwischen Keepalive-Anfragen" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "Anzahl der Bytes, die pro Anfrage abgefragt werden." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"Maximal akzeptierte Vorspannlänge der Verbindung - höhere Werte führen zum " +"Verbindungsabbruch." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"Sekunden, die abzuwarten sind, bis die Sockets geschlossen werden, die " +"nichts empfangen haben" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"Sekunden, die nach dem Timeout von Verbindungen verstreichen müssen, bevor " +"eine erneute Überprüfung gestartet wird" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"Maximale Paketlänge, die an Peers gesendet wird; Verbindung schließen,wenn " +"eine darüber hinausgehende Anfrage eingeht" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"Maximaler Zeitraum, nachdem die aktuellen Upload- und Download-Raten " +"geschätzt werden" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "Maximaler Zeitraum zur Schätzung der aktuellen Seed-Rate" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"Maximaler Zeitraum, der abgewartet wird, bevor Ankündigungen erneut gesendet " +"werden, nachdem sie fehlgeschlagen sind" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"Sekunden, die auf über eine Verbindung hereinkommende Daten gewartet wird, " +"bevor angenommen wird, dass es sich um eine zeitweise gedrosselte Verbindung " +"handelt" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"Anzahl der Downloads, ab der die Downloadreihenfolge nicht mehr vom Zufall " +"gesteuert, sondern das seltenste Teil zuerst geladen wird" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "" +"Anzahl der Bytes, die gleichzeitig in Netzwerkpuffer geschrieben werden." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"Weitere Verbindungen zu Adressen mit defekten oder absichtlich bösartigen " +"Peers, die inkorrekte Daten senden, abweisen" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "" +"Keine Verbindung zu mehreren Peers herstellen, die dieselbe IP-Adresse haben" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"TOS-Option für Peer-Verbindungen auf diesen Wert einstellen, wenn nicht " +"gleich null" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"Umgehung für einen Fehler in der BSD libc einschalten, der die Dateizugriffe " +"sehr verlangsamt." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "Adresse des zu benutzenden HTTP-Proxy-Servers für Tracker-Verbindungen" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "Verbindungen mit RST schließen und TCP TIME_WAIT-Status vermeiden" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Steuert die Verwendung der \"Twisted\"- Netzwerkbibliotheken für " +"Netzwerkverbindungen: 1 - Twisted verwenden, 0 - Twisted nicht verwenden, -1 " +"- automatische Auswahl mit Vorzug für Twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"Dateiname (für einzelne Torrents) oder Verzeichnisname (für Batch-Torrents), " +"unter dem der Torrent zu speichern ist; übergeht den Standardnamen im " +"Torrent. Schauen Sie auch unter --save_in nach; wenn nichts festgelegt ist, " +"wird der Benutzer nach dem Speicherort gefragt" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "Erweiterte Benutzeroberfläche anzeigen" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"Maximale Anzahl der Minuten, bis der Seed-Vorgang für einen kompletten " +"Torrent gestoppt wird" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"Minimales Upload/Download-Verhältnis in Prozent, das erreicht werden soll, " +"bevor der Seed-Vorgang gestoppt wird. 0 = unendlich" + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"Minimales Upload/Download-Verhältnis in Prozent, das erreicht werden soll, " +"bevor der Seed-Vorgang für den letzten Torrent gestoppt wird. 0 = unendlich." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Seed-Vorgang für jeden fertigen Torrent auf unbestimmte Zeit fortsetzen (bis " +"er vom Benutzer abgebrochen wird)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Seed-Vorgang für den letzten Torrent auf unbestimmte Zeit fortsetzen (bis er " +"vom Benutzer abgebrochen wird)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "Downloader im Pausemodus starten" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"Gibt an, wie die Anwendung reagieren soll, wenn der Benutzer versucht, einen " +"anderen Torrent manuell zu starten: \"ersetzen\" = aktiven Torrent immer " +"durch neuen Torrent ersetzen; \"hinzufügen\" = aktiven Torrent immer " +"parallel ergänzen; \"fragen\" = immer Benutzer fragen" + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"Dateiname (für Einzel-Torrents) oder Verzeichnisname (für Batch-Torrents), " +"unter dem Torrents gespeichert werden. Dies überschreibt den Standardnamen " +"im jeweiligen Torrent. Siehe auch unter --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"Legt die maximale Zahl der gleichzeitig erlaubten Uploads fest. Eine \"1\" " +"bedeutet eine (hoffentlich) sinnvolle Anzahl von Uploads, basierend auf --" +"max_upload_rate. Die automatischen Werte sind nur dann von Bedeutung, wenn " +"ein Torrent zur Zeit läuft." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"Lokales Verzeichnis, in dem der Inhalt des Torrents gepeichert wird. Die " +"Datei (Einzel-Torrents) oder das Verzeichnis (Batch-Torrents) werden in " +"diesem Verzeichnis unter Benutzung des in der Torrent-Datei vorgegebenen " +"Standardnamens erstellt. Siehe auch unter --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"Legt fest, ob der Benutzer nach einem Speicherort gefragt wird, an dem die " +"Download-Dateien gespeichert werden" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"Lokales Verzeichnis, in dem die Torrents gespeichert werden, unter Benutzung " +"eines Namens, der von --saveas_style festgelegt wird. Wenn keine Angabe " +"vorhanden ist, wird jeder Torrent im Verzeichnis der entsprechenden Torrent-" +"Datei gespeichert" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "" +"Legt fest, wie oft das Torrent-Verzeichnis neu gescannt werden soll (in " +"Sekunden)" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Legt fest, wie die Torrent-Downloads benannt werden sollen: 1: Namen DER " +"Torrent-Datei verwenden (ohne \".torrent\"); 2: Namen verwenden, der IN der " +"Torrent-Datei enthalten ist; 3: Verzeichnis mit dem Namen DER Torrent-Datei " +"erstellen (ohne \".torrent\") und die Daten in diesem Verzeichnis unter " +"Benutzung des Namens speichern, der IN der Torrent-Datei enthalten ist; 4: " +"Wenn der Name DER Torrent-Datei (ohne \".torrent\") und der Name, der IN der " +"Torrent-Datei enthalten ist, identisch sind, diesen Namen verwenden (Stil " +"1/2); ansonsten ein Zwischen-Verzeichnis wie in Stil 3 erstellen; ACHTUNG: " +"Bei den Optionen 1 und 2 besteht die Möglichkeit, dass Dateien ohne Warnung " +"überschrieben werden und Sicherheitsprobleme entstehen" + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"Legt fest, ob der volle Dateipfad oder die Torrent-Inhalte für jeden Torrent " +"angezeigt werden" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "Verzeichnis, in dem nach .torrent-Dateien gesucht wird (semi-rekursiv)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "" +"Legt fest, ob Statusinformationen auf der Standardausgabe angezeigt werden " +"sollen" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "Legt fest, auf welche Zweierpotenz die Teilgröße gesetzt wird" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "Standard-Tracker-Name" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"Wenn falsch, dann trackerlosen Torrent erzeugen, anstatt die URL " +"anzukündigen; zuverlässigen Knoten in Form von : oder eine leere " +"Zeichenkette verwenden, um Knoten von der Routing-Tabelle zu ziehen" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "Download abgeschlossen!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "fertig in %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "Download erfolgreich" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB Upload/ %.1f MB Download)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB Upload/ %.1f MB Download)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d zur Zeit sichtbar, und %d verteilte Kopien (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d verteilte Kopien (nächste: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d zur Zeit sichtbar" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "FEHLER:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "Wird gespeichert:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "Dateigröße:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "Prozent fertig: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "Verbleibende Zeit: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "Herunterladen nach: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "Download-Datenrate: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "Upload-Datenrate: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "Verteilungs-Bewertung: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "Seed-Status: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "Peer-Status: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Sie können nicht beides angeben: --save_as und --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "Wird heruntergefahren" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Fehler beim Zugriff auf die Konfiguration: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Fehler beim Zugriff auf die .torrent-Datei: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "Sie müssen eine .torrent-Datei angeben" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Textmodus-Initialisierung der grafischen Benutzeroberfläche schlug fehl. Es " +"kann nicht fortgesetzt werden." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Diese Download-Oberfläche benötigt das Standard-Python-Modul \"curses\", " +"welches leider für Windows direkt nicht verfügbar ist. Es wäre aber für den " +"Cygwin-Port von Python, der auf allen Win32-Systemen verfügbar ist (www." +"cygwin.com), erhältlich." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "" +"Sie können immer noch die \"Bittorrent-Console\" zum Herunterladen benutzen." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "Datei:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "Größe:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "Ziel:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "Fortschritt:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "Status:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "Herunterlade-Geschwindigkeit:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "Hochlade-Geschwindigkeit:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "sharing:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "Verteilungen:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "Peers:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d zur Zeit sichtbar, plus %d verteilte Kopien(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "Fehler:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "Fehler:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Hochladen Herunterladen Komplett " +"Geschwindigkeit" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "Download von %d Teilen, davon %d fragmentiert, %d von %d Teile fertig" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Diese Fehler traten während der Ausführung auf:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Benutzung: %s TRACKER_URL[TORRENTDATEI [TORRENTDATEI ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "alte Ankündigung für %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "keine Torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTEMFEHLER - AUSNAHME ERZEUGT" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Warnung: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " ist kein Ordner" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"Fehler: %s\n" +"Starten Sie ohne Argumente für eine Erklärung der Parameter" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"AUSNAHME:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" +"Sie können immer noch \"btdownloadheadless.py\" zum Herunterladen benutzen." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "Verbinde mit Peers" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Geschätzte Ankunft in %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Größe" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Heruntergeladen" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Hochgeladen" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Gesamt:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +" (%s) %s - %s Peers %s Verteilungen %s vert. Kopien - %s hoch %s herunter" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "Fehler: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"Starten Sie ohne Argumente für eine Erklärung der Parameter" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "Optionaler klarlesbarer Kommentar für .torrent-Datei" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "Optionale Zieldatei für Torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - dekodiere %s Metainformationsdateien" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Benutzung: %s [TORRENTDATEI [TORRENTDATEI ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "Metainformationsdatei: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "Informations-Hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "Dateiname: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "Dateigröße:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "Dateien: " + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "Verzeichnisname: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "Archivgröße:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "Tracker-Ankündigungs-URL: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "Trackerlose Knoten:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "Kommentar:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Konnte keine Kontrollverbindung erstellen:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Konnte keinen Befehl senden:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Konnte keine Kontrollverbindung erstellen: bereits in Verwendung" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Konnte Dateinamen einer alten Kontrollverbindung nicht löschen:" + +# Anmerkung Georg: Mutex kann nicht übersetzt werden, +# weil es bereits in der Programmierersprache verankert ist. +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Ein globaler Mutex wurde schon erstellt." + +# Fachbegriff Port ist gebräuchlich. +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Konnte keinen offenen Port finden." + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Konnte das Datenverzeichnis der Anwendung nicht erstellen." + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Konnte keine globale Mutex-Sperre für die Socket-Steuerdatei erhalten." + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" +"Eine frühere Instanz von BitTorrent war nicht sauber beendet. Setze fort." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "ungültige kodierte Zeichenfolge" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "ungültiger kodierter Wert (Daten nach gültigem Präfix)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Benutzung: %s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"Wenn ein Argument ohne Optionen vorhanden ist, wird es als Wert der\n" +"torrent_dir Option angenommen.\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Wenn ein Argument ohne Optionen vorhanden ist, wird es als Wert der \n" +" torrent_dir Option angenommen. \n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPTIONEN] [TORRENTDATEIEN]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPTIONEN] [TORRENTDATEI]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPTION] TRACKER_URL DATEI [DATEI]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "Argumente sind -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(standardmäßig" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "unbekannter Schlüssel" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "am Ende übergebener Parameter ohne Wert" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "Kommandozeilenüberprüfung fehlgeschlagen bei" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Option %s wird benötigt." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Es sind mindestens %d Angaben erforderlich." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Zuviele Angaben - %d sind maximal erlaubt." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "Falsches Format von %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Konnte Optionen nicht dauerhaft speichern:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Tracker-Ansage ist nach %d Sekunden immer noch nicht abgeschlossen" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" +"Problem sich mit den Tracker zu verbinden. Die Funktion gethostbyname ist " +"fehlgeschlagen -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problem beim Verbinden zum Tracker - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "fehlerhafte Daten vom Tracker - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "vom Tracker zurückgewiesen - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Der Torrent wird abgebrochen, da er vom Tracker zurückgewiesen wurde, weil " +"er zu keinem Peer verbunden ist. " + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Nachricht vom Tracker: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "Warnung vom Tracker - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Konnte nicht auf das Verzeichnis zugreifen " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Keine Statistik möglich " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "entferne %s (wird erneut hinzugefügt)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**Warnung** %s ist ein doppeltes Torrent für %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**Warnung** %s hat Fehler" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... erfolgreich" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "entferne %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "Überprüfung fertiggestellt" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "Server-Anschluss verloren" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Fehler bei Behandlung der akzeptierten Verbindung: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Programm wird beendet, weil der TCP-Stack überlaufen ist. Bitte schauen Sie " +"in die FAQ bei %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Zu spät, um die RawServer-Basis umzuschalten, %s wurde schon benutzt." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Mo" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Di" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Mi" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Do" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Fr" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sa" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "So" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mär" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Aug" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Okt" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dez" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Komprimiert: %i Unkomprimiert: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Sie können keinen .torrent-Dateinamen angeben, während der gleichzeitigen " +"Erstellung von Mehrfach-Torrents" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" +"Die Dateisystemkodierung \"%s\" wird von dieser Version nicht unterstützt" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Konnte Datei-/Verzeichnisnamen \"%s\" nicht umwandeln in utf-8 (%s). " +"Entweder die angenommene Dateisystemkodierung ist falsch \"%s\" oder der " +"Dateiname enthält ungültige Bytes." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Datei-/Verzeichnisname \"%s\" enthält reservierte Unicodewerte, die keinem " +"Zeichen entsprechen." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "fehlerhafte Daten in der Antwortdatei - insgesamt zu klein" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "fehlerhafte Daten in der Antwortdatei - insgesamt zu groß" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "prüfe existierende Datei" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 oder Schnellwiederaufahme-Information entspricht nicht dem " +"Dateistatus (fehlende Daten)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" +"Fehlerhafte Schnellwiederaufahme-Informationen (Dateien enthalten mehr Daten)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Fehlerhafte Schnellwiederaufahme-Informationen (unerlaubter Wert)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" +"fehlerhafte Daten auf der Festplatte - haben Sie vielleicht zwei Instanzen " +"gestartet?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Konnte auf Schnellwiederaufahme-Daten nicht zugreifen: " + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"Datei in der Start-Mitteilung zwar komplett, der Teil hat die Hash-Prüfung " +"aber nicht bestanden" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Datei %s gehört zu einem anderen laufenden Torrent" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Datei %s existiert schon, aber ist keine reguläre Datei" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Kurzer Lesevorgang - hat vielleicht etwas die Dateien verkürzt?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Nicht unterstütztes Schnellwiederaufahme-Dateiformat - vielleicht von einer " +"anderen Version des Programms?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Eine andere Anwendung hat wahrscheinlich die Datei verschoben, umbenannt " +"oder gelöscht." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Eine andere Anwendung hat die Datei anscheinend verändert." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Eine andere Anwendung hat die Größe der Datei anscheinend verändert." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Konnte keinen Signal-Trainer setzen: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "verloren: \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "hinzugefügt: \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "warte auf Hash-Prüfung" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "lade herunter" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "neues Einlesen der Konfigurationsdatei" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Konnte nicht auf %s zugreifen" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Konnte\n" +"%s\n" +"weder herunterladen noch öffnen.Versuchen Sie, die .torrent-Datei mit einem " +"Web-Browser herunterzuladen." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Dies scheint eine alte Python-Version zu sein, die die Dateisystemkodierung " +"nicht selbständig erkennen kann. 'ASCII' wird angenommen." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python konnte die Dateisystemkodierung nicht automatisch feststellen. " +"'ASCII' wird stattdessen benutzt." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Die Dateisystemkodierung '%s' wird nicht unterstützt. 'ASCII' wird " +"stattdessen verwendet." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Dateipfadkomponente ungültig: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Diese .torrent-Datei wurde mit einem defekten Hilfsprogramm erstellt und " +"enthält fehlerhaft kodierte Dateinamen. Einige oder alle Dateinamen könnten " +"anders sein, als der Autor dies plante." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Diese .torrent-Datei wurde mit einem defekten Hilfsprogramm erstellt und " +"enthält ungültige Zeichen. Einige oder alle Dateinamen könnten anders sein, " +"als der Autor dies plante." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Diese .torrent-Datei wurde mit einem defekten Hilfsprogramm erstellt und " +"enthält fehlerhaft kodierte Dateinamen. Die verwendeten Namen könnten immer " +"noch korrekt sein." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Der Zeichensatz des lokalen Dateisystems (\"%s\") unterstützt nicht alle " +"Zeichen, welche in den Dateinamen dieses Torrents vorkommen. Die Dateinamen " +"wurden entsprechend verändert." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Das Windows-Dateisystem kann einige Zeichen aus den Dateinamen dieses " +"Torrents nicht darstellen. Die Dateinamen wurden entsprechend verändert." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Diese .torrent-Datei wurde mit einem defekten Hilfsprogramm erstellt und " +"enthält mindestens eine Datei mit fehlerhaftem Datei- oder Verzeichnisnamen. " +"Da diese Dateien behandelt werden als ob sie jeweils eine länge von 0 Bytes " +"hätten, werden sie einfach ignoriert." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Python 2.2.1 oder neuer benötigt" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" +"Es können keine zwei separate Instanzen des selben Torrents heruntergeladen " +"werden." + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport ist kleiner als minport - keine Ports zum Überprüfen" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Konnte keinen Port zum Lauschen öffnen: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Konnte keinen Port zum Lauschen öffnen: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Überprüfen Sie Ihre Einstellungen zum Port-Bereich." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Erstes Starten" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Kann Daten für schnelle Wiederaufnahme nicht laden:%s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Führt komplette Hash-Prüfung durch." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" +"Dateiteil %d wurde bei der Hash-Prüfung als fehlerhaft erkannt, es wird neu " +"heruntergeladen." + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Downloadversuch eines trackerlosen torrents starten, obwohl der trackerlose " +"Client ausgeschaltet ist." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "Download fehlgeschlagen:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Eingabe/Ausgabe-Fehler: kein Platz auf Datenträger oder konnte keine so " +"große Datei erstellen:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "abgebrochen durch Eingabe/Ausgabe-Fehler:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "abgebrochen durch Betriebsystem-Fehler:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "abgebrochen durch interne Ausnahmebedingung:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Zusätzlicher Fehler beim Schließen aufgrund von Fehler:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" +"Konnte die Datei zur schnellen Wiederaufnahme nach Fehler nicht entfernen:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "Seeding" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Konnte Daten für schnelle Wiederaufnahme nicht schreiben:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "beenden" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "falsche Metainfo - kein Wörterbuch" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "falsche Metainfo - falscher Teile-Schlüssel" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "Fehlerhafte Metainformation - ungültige Teil-Grösse" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "Fehlerhafte Metainformation - fehlerhafter Name" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "Name %s ist aus Sicherheitsgründen nicht erlaubt" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "Einzel-/Mehrfachdateimix" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "Fehlerhafte Metainformation - fehlerhafte Länge" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "Fehlerhafte Metainformation - \"dateien\" ist keine Liste von Dateien" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "Fehlerhafte Metainformation - fehlerhafter Dateiwert" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "Fehlerhafte Metainformation - fehlerhafter Pfad" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "Fehlerhafte Metainformation - fehlerhaftes Verzeichnis" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "Pfad %s ist aus Sicherheitsgründen nicht erlaubt" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "Fehlerhafte Metainformation - doppelter Pfad" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"Fehlerhafte Metainformation - Name sowohl als Datei-, als auch als " +"Verzeichnisname benutzt" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "Fehlerhafte Metainformation - falscher Objekttyp" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "Fehlerhafter Metainformation - kein Ankündigungs-URL-Text" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "ein nicht textbasierender Fehlergrund" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "eine nicht textbasierende Warnmeldung" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "Ungültiger Eintrag in der Peer Liste 1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "Ungültiger Eintrag in der Peer Liste 2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "Ungültiger Eintrag in der Peer Liste 3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "Ungültiger Eintrag in der Peer Liste 4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "Ungültige Peer-Liste" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "Ungültiges Aufrufintervall" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "Ungültiges min. Aufrufintervall" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "Ungültige Tracker-Id" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "Ungültiger Peer-Zähler" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "Ungültiger Seed-Zähler" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "Ungültiger \"letzter\" Eintrag" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Port, auf dem gelauscht wird." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "Datei, in der kürzliche Downloader-Informationen gespeichert werden" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" +"Die Zeitgrenze für das Schließen der Verbindungen ist überschritten worden" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "Sekunden zwischen dfile speichern" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "Sekunden zwischen dem Verfallen der Downloader" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "Sekunden, die Downloader zwischen Wiederankündigungen warten sollen" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"legt die Zahl der Peers fest, an die eine Info-Nachricht geschickt wird, " +"wenn der Client nicht die Anzahl bestimmt" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"Zeit, die gewartet werden soll, bis wieder überprüft wird, ob Verbindungen " +"abgelaufen sind" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"Anzahl der Versuche des Überprüfens, ob ein Downloader hinter einer NAT ist " +"(0=nicht überprüfen)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" +"Legt fest, ob Einträge in die Protokolldatei für NAT-Check-Ergebnisse " +"gemacht werden sollen" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "Minimaler Zeitabstand zwischen dem letzten und dem nächsten entfernen" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "Minimaler Zeitabstand in Sekunden bevor ein Cache betrachtet wird" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"Nur Downloads für Torrents in diesem Ordner (und in Unterordnern von Ordnern " +"die selbst keine .torrent-Dateien haben) erlauben. Wenn ausgewählt, werden " +"Torrents in diesem Ordner auf der Infoseite angezeigt, ob sie Peers haben, " +"oder nicht" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"erlaube spezielle Schlüssel in Torrents in dem erlaubten_Order um Tracker " +"Zugang zu erlangen" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" +"ob die Protokolldatei beim Empfang des HUP-Signals wieder geöffnet werden " +"soll" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"ob eine Informationsseite angezeigt werden soll wenn das Hauptverzeichnis " +"des Trackers geladen ist" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "Eine URL, wohin die Info-Seite weitergeleitet werden soll" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "Legt fest, ob Namen der erlaubten Ordner angezeigt werden sollen" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"Datei die X-Icon-Daten enthält um sie zurückzuschicken wenn der Browser " +"favicon.ico anfordert" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignoriere die IP GET-Parameter von Maschinen, die keine lokalen Netzwerk IPs " +"haben (0 = nie, 1 = immer, 2 = ignorieren wenn NAT Kontrolle nicht aktiv " +"ist). HTTP Proxy Headers, die die Adresse des ursprünglichen Klienten " +"wiedergeben, werden genauso behandelt wie --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "Datei um Trackerlogs zu speichern, benutze - für stdout (Standard)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"verwende mit erlaubten_Ornder; fügt eine /Datei?hash={hash} URL hinzu welche " +"es Benutzern erlaubt die Torrentdatei herunterzuladen" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"behalte tote Torrents nachdem Sie ungültig werden (Sie werden dennoch " +"angezeigt in deiner /scrape und Web-Seite). Nur von Bedeutung wenn der " +"Erlaubte_Ornder nicht gesetzt ist" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "Scrape Zugang erlaubt (kann keiner, spezifisch oder vollständig sein)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "Maximale Anzahl von Peers, die mit jeder Anfrage gesendet werden" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"Ihre Datei mag irgendwo im Universum existieren,\n" +"aber leider nicht hier\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**Warnung** angegebene favicon-Datei -- %s -- existiert nicht." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**Warnung** Statusdatei %s defekt, sie wird zurückgesetzt" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Logdatei gestartet: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**Warnung** konnte stdout nicht zur Logdatei umleiten: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Logdatei wiedergeöffnet:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**Warnung** Konnte die Protokolldatei nicht wiedereröffnen" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "Bestimmte Scrapefunktion ist nicht verfügbar auf diesen Tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "Vollständige Scrapefunktion ist auf diesen Tracker nicht verfügbar." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "Die Hol-Funktion ist bei diesem Tracker nicht verfügbar." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"Angeforderter Download ist nicht zur Benutzung dieses Tracker berechtigt." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "ohne Argumente ausführen um Parameter-Erklärungen zu erhalten" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Herunterfahren: " diff --git a/locale/en/LC_MESSAGES/bittorrent.po b/locale/en/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..e69de29 diff --git a/locale/es/LC_MESSAGES/bittorrent.mo b/locale/es/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..968e05dd960334c7281bd11d913e7aab3e39ff88 GIT binary patch literal 63064 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 z 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 literal 0 HcmV?d00001 diff --git a/locale/es/LC_MESSAGES/bittorrent.po b/locale/es/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..cbfae78 --- /dev/null +++ b/locale/es/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2910 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (translations) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-15 14:02-0800\n" +"Last-Translator: Matt Chisholm \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Instale Python 2.3 o superior" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Se requiere PyGTK 2.4 o superior" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Introduzca la dirección URL del torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Introduzca la dirección URL del archivo torrent a abrir:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "acceso telefónico" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cable de hasta 128k" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cable de hasta 256k" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL de hasta 768k" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Velocidad máxima de subida:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Detener temporalmente todos los archivos .torrent activos" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Reanudar descarga" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pausado" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "No hay torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Ejecutándose normalmente" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Protegido/Sin acceso" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nueva versión %s disponible" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Hay una nueva versión de %s disponible.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Usted está usando %s, y la nueva versión es %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"En cualquier momento puede obtener la versión más reciente de \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Descargar _después" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Descargar _ahora" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Recordármelo después" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Acerca de %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versión %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "No pudo abrirse %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Donar" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Registro de actividades" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Guardar registro en:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "registro guardado" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "registro borrado" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Configuración" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Guardando" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Guardar descargas nuevas en:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Cambiar..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Preguntar dónde guardar cada descarga nueva" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Descargando" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Iniciando archivos .torrent adicionales manualmente:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Siempre detener el _último archivo .torrent activo" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Siempre iniciar el archivo .torrent en _paralelo" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Preguntar cada vez" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Compartiendo" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Compartir los torrents completados: hasta que la proporción compartida " +"alcance [_] por ciento, o por [_] minutos, lo que suceda primero." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Compartir indefinidamente" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Compartir el último torrent completado: hasta que la proporción compartida " +"alcance [_] por ciento." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Red" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Buscar un puerto disponible:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "empezando en puerto:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP debe reportar al rastreador:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Sólo tiene efecto si Ud. está en la\n" +"misma red local del rastreador)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"El texto en la barra de avance siempre es\n" +"negro (requiere reiniciar)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Misc" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ADVERTENCIA: Cambiar esta configuración puede\n" +"impedir que %s funcione correctamente." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opción" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valor" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avanzado" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Escoger directorio predeterminado de descarga" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Archivos en \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Aplicar" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Asignar" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nunca descargar" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Disminuir" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Incrementar" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nombre del archivo" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Longitud" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Personas para \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Dirección IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Cliente" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Conexión" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s descarga" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s subida" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB descargados" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB subidos" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% completado" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s est. descarga de la persona" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID de Persona" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interesado" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Ahogado" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Detenido" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Subida optimista" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "remoto" + +#: bittorrent.py:1358 +msgid "local" +msgstr "local" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "persona indebida" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d malo" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "prohibido" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informacion para \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nombre del archivo .torrent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent sin rastreador)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Anunciar url:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", en un archivo" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", en %d archivos" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Tamaño total:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Piezas:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Trozo de Información:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Guardar en:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nombre de archivo:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Abrir directorio" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Mostrar lista de archivos" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "arrastre para reordenar" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "click derecho para mostrar menú" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Información del torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Borrar el torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Cancelar torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", se compartirá por %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", se compartirá indefinidamente." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Finalizado, proporción de compartimiento: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Finalizado, %s subido" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Finalizado" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Información de torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Abrir directorio" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Lista de archivos" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Lista de personas" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Cambiar ubicación" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Compartir indefinidamente" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Re_iniciar" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Finalizar" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "Bo_rrar" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Cancelar" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "¿Está seguro de querer borrar \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Su proporción de uso compartido para este torrent es %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Ha subido %s a este torrent." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "¿Borrar este torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Terminado" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "arrastrar a la lista para compartir" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Falló" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "arrastrar a la lista para reanudar" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Esperando" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Ejecutando" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Actual Subido: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Actual Descargado: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Anterior Subido: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Anterior Descargado: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Proporción compartida: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s personas, %s compartidos. Totales del rastreador: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Copias distribuidas: %d; Siguiente: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Piezas: %d total, %d completos, %d parciales, %d activos (%d vacíos)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d piezas malas + %s en peticiones descartadas" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% finalizado, %s restante" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Velocidad de descarga" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Velocidad de subida" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "ND" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s iniciado" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Abrir archivo .torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Abrir _URL torrent " + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Hacer _nuevo .torrent " + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pausa/ Reanudar" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Salir" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Mostrar/Esconder .torrent _terminados" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Cambiar a tamaño óptimo de ventana" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Registro" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Configuración" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "A_yuda" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "A_cerca de" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Donar" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Archivo" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Ver" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Buscar torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(detenido)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(múltiple)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Ya se está descargando el %s instalador" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "¿Instalar nuevo %s ahora?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "¿Desea salir de %s e instalar la nueva versión, %s, ahora?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Ayuda de %s está en \n" +"%s\n" +"¿Desea ir ahí ahora?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "¿Visitar la página de ayuda?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Hay un torrent finalizado en la lista." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "¿Desea eliminarlo?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Hay %d torrents finalizados en la lista." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "¿Desea eliminarlos todos?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "¿Borrar todos los .torrent terminados?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "No hay .torrent terminados" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "No hay .torrent terminados que eliminar." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Abrir .torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Cambiar ubicación para guardar de" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "¡El archivo ya existe!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "" +"El archivo \"%s\" ya existe. ¿Desea elegir un nombre de archivo distinto?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Ubicación para guardar" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "¡El directorio existe!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" ya existe. ¿Está intentando crear un directorio idéntico, duplicado " +"dentro del directorio existente?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(mensaje global) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Error" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Se han producido múltiples errores. Haga click en OK para ver el registro de " +"errores." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "¿Detener el torrent activo?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Está a punto de iniciar \"%s\". ¿Desea también detener el último torrent " +"activo?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "¿Ha donado Ud.?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bienvenido a la nueva versión de %s. ¿Ha donado Ud.?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "¡Gracias!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"¡Gracias por donar! Para donar nuevamente, seleccione \"Donar\" en el menú " +"\"Ayuda\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "Comando obsoleto, no lo use" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"No se pudo crear o enviar comando a través del control de socket existente." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Cerrar todas las ventanas %s puede solucionar el problema." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s ya está activo" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "No se pudo enviar comando a través del control de socket existente." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "No se pudo iniciar la \"TorrentQueue\", vea los errores arriba." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "creador %s de archivo torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Hacer archivo torrent para este archivo/directorio:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Elegir..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(los directorios se convertirán en torrentes por lotes)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Tamaño de las piezas:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Usar el _rastreador:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Usar _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Nodos (opcional):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Comentarios:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Hacer" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Puerto" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Construyendo torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Revisando el tamaño de los archivos..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Comenzar a compartir" + +#: maketorrent.py:540 +msgid "building " +msgstr "construyendo" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Finalizado." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Construcción de torrents finalizada." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "¡Error!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Error al construir los torrents:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d días" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 día %d horas" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d horas" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutos" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d segundos" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 segundos" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Ayuda" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Preguntas Frecuentes:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Ir" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Elegir una carpeta existente..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Todos los archivos" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Archivos Torrent" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Crear una nueva carpeta..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Seleccionar archivo" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Seleccionar carpeta" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "No se pudo cargar el estado guardado:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "No se pudo guardar el estado UI (Interface del Usuario):" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Contenidos inválidos del archivo de estado" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Error al leer el archivo" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "No se puede restaurar completamente el estado" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Archivo de estado inválido (entrada duplicada)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Datos corruptos en" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", no se puede restaurar el archivo .torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Archivo de estado inválido (entrada errónea)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Archivo de estado de UI (Interface del Usuario) incorrecto" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Versión del archivo de estado de UI (Interface del Usuario) incorrecta" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versión no soportada del archivo de estado de UI (Interface del Usuario) " +"(¿De una versión nueva del cliente?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "No se pudo borrar el archivo %s cacheado:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Este no es un archivo .torrent válido (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Este .torrent (o uno con el mismo contenido) ya se está ejecutando." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Este .torrent (o uno con el mismo contenido) ya está esperando a ser " +"ejecutado." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent en estado desconocido %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "No se pudo escribir el archivo" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"el .torrent no será reiniciado correctamente cuando se reinicie el cliente" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"No se pueden ejecutar más de %d torrents simultáneamente. Para más " +"información vea las Preguntas Frecuentes en %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"No se inició el torrent debido a que existen otros torrents en espera de ser " +"ejecutados, y este ya cumple con la configuración para cuándo parar de " +"compartir." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"No se inició el torrent debido a que ya cumple con la configuración para " +"cuándo parar de compartir el último .torrent completado." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "No se pudo obtener la última versión desde %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "No se pudo descifrar la cadena de la nueva versión desde %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"No se pudo encontar un destino temporal apropiado para guardar el instalador " +"de %s %s" + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "" +"No hay ningún archivo de torrent disponible para el instalador de %s %s" + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "El instalador de %s %s parece estar corrupto o no existe." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "No se puede cargar el instalador en este Sistema Operativo" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"el directorio en se han guardado datos variables, como la información de " +"reanudado rápido y estado de GUI. Se usará por defecto el subdirectorio " +"'data' del directorio deconfig de bittorrent. " + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codificación de caracteres usada en el sistema de archivos local. Si se deja " +"vacío, se autodetectará. Autodetección no funciona con versiones anteriores " +"a python 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Codigo ISO del lenguaje a usar" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP debe reportar al rastreador (no tiene efecto a menos que está en la misma " +"red local que el rastreador)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"número de puerto visible al mundo si es distinto al que el cliente escucha " +"localmente" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "puerto mínimo para escuchar, se incrementa si éste no está disponible" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "puerto máximo para escuchar" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP al que se debe ligar localmente" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "segundos entre actualizaciones de la informacion exhibida" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minutos de espera entre peticiones de más personas" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "número mínimo de personas para no hacer una repeción de la petición" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "" +"número de personas en el que se debe dejar de iniciar nuevas conexiones" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"número máximo de conexiones permitidas, después de este las nuevas " +"conexiones de entrada serán cerradas de inmediato." + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "si se debe verificar o no los trozos en el disco" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "máximo de kB/s de subida, 0 significa sin límite" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "número de subidas que llenar con desahogos adicionales optimistas " + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"número máximo de archivos abiertos a la vez en un multi-archivo .torrent, 0 " +"significa ilimitados. Se usa para evitar que se agoten los descriptores de " +"archivos. " + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicializa un cliente sin rastreador. Esta opción debe habilitarse para " +"descargar torrents sin rastreador." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "número de segundos de pausa entre envíos de revividores (keepalives)" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "número de bytes a solicitar por cada petición." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"longitud máxima del prefijo de codificación que aceptará sobre el cable - " +"valores grandes pueden hacer caer la conexión." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "segundos de espera entre cierres de sockets que no han recibido nada" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"segundos de espera entre verificaciones de conexiones excedidas del tiempo " +"límite" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"longitud máxima de la porción a enviar a las personas, cerrar la conexión si " +"se recibe una petición mayor" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"Intervalo de tiempo máximo para la estimación de las velocidades actuales de " +"subida y bajada." + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"Intervalo de tiempo máximo para la estimación de la velocidad actual de " +"compartido." + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"tiempo máximo de espera entre la repetición de avisos si continúan fallando" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"segundos de espera para la entradad de datos antes de asumir que está casi " +"permanentemente ahogada" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"número de descargas al cual se cambiará de aleatorio a más raro primero" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "" +"cantidad de bytes a escribir en los almacenadores (buffers) de red a la vez." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"rechazar más conexiones de direcciones incompletas o personas " +"intencionalmente hostiles que envían datos incorrectos" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "no conectarse a varias personas con la misma direccion IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"si es distinto a cero, fije la opción TOS para las conexiones de persona a " +"este valor" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"permitir solución alternativa para un error en BSD libc que hace la lectura " +"de archivos muy lenta." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "direccion del proxy HTTP para usar en la conexiones con el rastreador" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "cerrar conexiones con RST y evitar el estado TIME_WAIT de TCP" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Utilizar librerías de red Trenzadas para las conexiones de red. 1 significa " +"uso de trenzadas, 0 significa no usar trenzadas, -1 significa autodetectar, " +"y de preferencia trenzadas" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nombre del archivo (para .torrents de un solo archivo) o nombre del " +"directorio (para .torrent en lotes) donde guardar el .torrent, " +"sobreescribiendo su nombre original. Ver también --save_in, si no se " +"especifican se le preguntará al usuario en qué ubicación quiere guardar" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "mostrar interfaz de usario avanzado" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"número máximo de minutos que se compartirá un torrent completado antes de " +"detenerse" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"la velocidad mínima de subida/bajada, en porcentaje, antes de parar de " +"compartir del torrent. 0 significa ilimitada." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"la velocidad mínima de subida/bajada, en porcentaje, antes de parar de " +"compartir el último torrent. 0 significa ilimitada." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Compartir cada torrent completado indefinidamente (hasta que el usuario lo " +"cancele)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Compartir el último torrent indefinidamente (hasta que el usuario lo cancele)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "iniciar el programa de descarga en estado pausado" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"especificar cómo debe comportarse la aplicación cuando el usuario trata de " +"iniciar manualmente otro torrent: \"reemplazar\" significa siempre " +"reemplazar el torrent activo por el nuevo, \"agregar\" significa siempre " +"agregar el torrent activo en paralelo, y \"preguntar\" significa preguntar " +"al usuario cada vez." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nombre de archivo (para torrents de un solo archivo) o nombre de directorio" +"(para torrents en lotes) donde guardar el torrent, sobreescribiendo el " +"nombre predeterminado en el torrent. Vea también --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"número maximo de subidas permitidas a la vez. -1 significa (deseablemente) " +"unnúmero razonable basado en la velocidad máxima de subida. Los valores " +"asignados automáticamente sólo son perceptibles cuando se descarga un " +"torrent a la vez." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"directorio local donde se guardará el contenido del torrent. El archivo " +"(para torrents de un solo archivo) o directorio (para torrents en lotes) " +"será creado bajo este directorio usando el nombre predeterminado " +"especificado en el archivo .torrent. Vea también --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"si se debe o no preguntar el lugar en donde guardar los archivos descargados" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"el directorio local en donde se guardarán los torrents, usando un nombre " +"determinado por --saveas_style. Si se deja en blanco, cada torrent se " +"guardará en el directorio del archivo .torrent correspondiente " + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "" +"con qué frecuencia volver a escanear el directorio de torrents, en segundos" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Cómo nombrar las descargas de torrents: 1: utilice el nombre DEL archivo " +"torrent (menos .torrent); 2:utilice el nombre codificado EN el archivo " +"torrent; 3: cree un directorio con el nombre DEL archivo torrent (menos ." +"torrent) y guárdelo en ese directorio utilizando el nombre codificado EN el " +"archivo torrent; 4: si el nombre DEL archivo torrent (menos .torrent) y el " +"nombre codificado EN el archivo torrent son idénticos, utilice ese nombre " +"(estilo 1/2), si no, cree un directorio intermedio como en el estilo 3; " +"CUIDADO: las opciones 1 y 2 tienen la habilidad de sobreescribir archivos " +"sin avisar y pueden presentar problemas de seguridad." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"si se debe mostrar o no la ruta completa o el contenido del torrent por cada " +"torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "directorio en donde buscar archivos .torrent (semi-recursivo)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "si se debe mostrar o no información de diagnóstico en stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "a qué potencia de dos configurar el tamaño de la pieza" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nombre predeterminado del rastreador" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"si es falso entonces haga un torrent sin rastreador, en lugar de la URL de " +"announce utilice un puerto seguro de la forma : o una cadena " +"vacía para tirar algunos nodos de su tabla de enrutamiento" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "¡descarga completa!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "terminando en %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "descarga existosa" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB sub / %.1f MB desc)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB sub / %.1f MB desc)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d vistas ahora, más %d copias distribuidas (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d copias distribuidas (siguiente: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d vistas ahora" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ERROR:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "guardando:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "tamaño del archivo:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "porcentaje hecho:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tiempo restante:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "descarga en:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "ratio de descarga:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "ratio de subida:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "Calificación por compartir:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "estado de compartido:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "estado de la persona:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "No puede especificar ni --save_as ni --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "cerrando" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Error leyendo configuración:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Error al leer el archivo .torrent:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "debe especificar un archivo .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Fallo en la inicialización de la IGU (GUI)en modo texto, imposible seguir." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Esta interfaz de descarga necesita el módulo estándar de Python \"curses\", " +"que desafortunadamente no está disponible para el puerto nativo de Windows " +"de Python. De cualquier modo, está disponible para el puerto Cygwin de " +"Python, que se ejecuta en todos los sistemas Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Todavía debes usar la consola de bittorrent para descargar." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "archivo:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "tamaño:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "dest:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progreso:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "estado:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "velocidad de la descarga:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "velocidad de la subida:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "compartiendo:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "compartidos:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "personas:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d vistas ahora, más %d copias distribuidas(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "error(es):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "error:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Subida Descarga Completado Velocidad" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" +"descargando %d piezas, tiene %d fragmentos, %d de %d piezas completadas" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Estos errores se han producido durante la ejecución:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s TRACKER_URL[ARCHIVOTORRENT[ARCHIVOTORRENT ...]]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "announce antiguo para %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "no hay torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERROR DEL SISTEMA - SE HA GENERADO UNA EXCEPCIÓN" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Advertencia:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "no es un directorio" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"error: %s\n" +"ejecute sin argumentos para una explicación de los parámetros" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEPCIÓN:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Todavía puede utilizar \"btdownloadheadless.py\" para la descarga." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "conectando a personas" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tiempo Estimado de Llegada (ETA) en %d:%02d:%02d " + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Tamaño" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Descarga" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Subida" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totales:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s)%s - %s peers %s compartidos %s copias dist. - %s desc %s sub" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "error:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"ejecute sin argumentos para una explicación de los parámetros" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "comentario opcional legible por humanos para poner en el .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "archivo objetivo opcional para el torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodifica %s archivos de metainfo" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s [ARCHIVOTORRENT[ARCHIVoTORRENT ...]]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "archivo de metainfo: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "trozo de info:%s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nombre de archivo: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "tamaño de archivo:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "archivos:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nombre del directorio: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "tamaño de archivo:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "rastreador de url announce: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "nodos sin rastreador:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "comentario:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "No fue posible crear control de socket:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "No fue posible enviar el comando:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "No fue posible crear control de socket: ya está en uso" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" +"No fue posible quitar el control de socket antiguo del nombre de archivo:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Ya se ha creado el mutex global." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "¡No se ha podido encontrar ningún puerto abierto!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "¡No se ha podido crear el directorio de datos de la aplicación!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"¡No se ha podido adquirir bloqueo de mutex global para el archivo de " +"controlsocket!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" +"Una instancia anterior de BT no fue cerrada correctamente. Continuando." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "No es una secuencia válida bencoded" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "Valor bencoded no válido (datos después del prefijo válido)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Uso: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPCIONES][DIRECTORIOTORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Si uno de los argumentos no es una opción, se tomará como el valor\n" +" de la opcion directorio_torrent.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPCIONES] [ARCHIVOSTORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPCIONES] [ARCHIVOTORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPCION] ARCHIVO URL_TRACKER[ARCHIVO]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "los argumentos son -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(por defecto" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "clave desconocida" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parámetro pasado al final sin ningún valor" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "el procesado de la línea de comandos falló en" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Se requiere la opción %s." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Debe proveer al menos %d argumentos." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Demasiados argumentos - %d máximo" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "formato equivocado de %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "No fue posible guardar permanentemente las opciones:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" +"Anuncio del rastreador no ha sido completado %d segundos después de " +"comenzarlo" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problema conectándose al rastreador, el comando gethostbyname falló -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problema conectando al rastreador -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "datos erróneos provinientes del rastreador" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "rechazado por el rastreador -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Abortando el archivo .torrent puesto que fue rechazado por el rastreador " +"porque no estableció conexión con ninguna persona." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Mensaje del rastreador:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "Advertencia del rastreador -" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "No se ha podido leer el directorio" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "No se pudo verificar" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "eliminando %s (se añadirá luego)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**atención** %s es un torrent duplicado para %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**advertencia** %s contiene errores" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "...exitoso" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "eliminando %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "comprobación completa" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "socket del servidor perdido" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Error manejando conexión aceptada:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Se debe salir por un error en el apilado de TCP. Por favor, consulte " +"Preguntas Frecuentes en %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" +"Demasiado tarde para cambiar los backends de RawServer, %s ya ha sido " +"utilizado." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Lun" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Mié" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Jue" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Vie" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sáb" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Dom" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Ene" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Abr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "May" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Ago" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Oct" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dic" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Comprimido: %i Sin Comprimir: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"No se puede especificar el nombre del archivo .torrent al generar varios " +"torrents simultáneamente" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "El juego de caracteres \"%s\" no está soportado en esta versión" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"No se puede convertir el nombre del archivo/directorio \"%s\" a utf-8 (%s). " +"O el nombre de archivo \"%s\" es incorrecto o contiene caracteres no válidos." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"El nombre de archivo/directorio \"%s\" contiene valores unicode reservados " +"que no se corresponden con caracteres." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "Datos erróneos en el archivo de respuesta - El total es muy pequeño" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "Datos erróneos en el archivo de respuesta - El total es muy grande" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "revisando archivo existente" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 o la información de resumido rápido no coincide con el " +"estado del archivo (faltan datos)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" +"Información errónea de resumido rápido (Los archivos contienen más datos)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Información errónea de resumido rápido (valor no válido)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "Datos corruptos en el disco - ¿tal vez posees dos copias activas?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "No se logró leer los datos de resumido rapido:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "El archivo se completó al inicio, pero falló en el chequeo de trozos " + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "El archivo %s pertenece a otro archivo .torrent en funcionamiento" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "El archivo %s ya existe, pero no es un archivo regular" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lectura corta - ¿algo truncó los archivos?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formato sin apoyo del archivo de resumido rápido, ¿tal vez otra versión del " +"cliente? " + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Parece que otro programa ha movido, renombrado o eliminado el archivo." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Parece que otro programa ha modificado el archivo." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Parece que otro programa ha cambiado el tamaño del archivo." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "No se ha podido establecer el manipulador de señal:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "eliminado \"%s/\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "añadido \"%s/\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "esperando la comprobación de trozos" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "descargando" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "releyendo el archivo de configuración" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "No se pudo verificar %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"No se pudo descargar o abrir \n" +"%s\n" +"Intente utilizar un explorador web para descargar el archivo torrent." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Ésta parece ser una versión antigua de Python que no soporta la detección de " +"la codificación de los archivos del sistema. Se asume 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python falló en autodetectar la codificación del sistema de archivos. Usando " +"'ascii' en su lugar." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"La codificación del sistema de archivos '%s' no está soportada. Usando " +"'ascii' en su lugar." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componente erróneo de la ruta del archivo:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Este archivo .torrent ha sido creado con una herramienta quebrada y tiene " +"nombres de archivo incorrectamente codificados. Algunos o todos los nombres " +"de archivo pueden aparecer diferente del lo que el creador del archivo ." +"torrent quiso." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Este archivo .torrent ha sido creado con una herramienta quebrada y contiene " +"valores de caracteres erróneos que no corresponden a ningún carácter real. " +"Algunos o todos los nombres de archivo pueden aparecer diferente de lo que " +"el creador del archivo .torrent quiso." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Este archivo .torrent ha sido creado con una herramienta quebrada y tiene " +"archivos codificados incorrectamente. Los nombres pueden ser todavía " +"correctos." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"El conjunto de caracteres usados en el sistema de archivos local (\"%s\") no " +"puede representar todos los caracteres usados en el nombre de archivo de " +"este torrent. Los nombres de archivo han sido cambiados del original." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"El sistema de archivos de Windows no puede manejar algunos caracteres usados " +"en el nombre de archivo(s) de este torrent. Los nombres de archivo han sido " +"cambiados del original." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Este archivo torrent ha sido creado con una herramienta quebrada y tiene " +"cuando menos 1 archivo con un nombre inválido de archivo o directorio. Sin " +"embargo puesto que tales archivos fueron marcados como si tuviesen una " +"longitud de 0 esos archivos son simplemente ignorados." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "se requiere Python 2.2.1 o una versión más nueva" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "No se puede comenzar dos instancias separadas del mismo torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport es menor que minport - no hay puertos a comprobar" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "No pudo abrirse un puerto de escucha: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "No pudo abrirse un puerto de escucha: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Compruebe la configuración de su rango de puertos" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Arranque inicial" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "No se ha podido cargar los datos de reanudación rápida: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Se llevará a cabo una comprobación completa de trozos." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" +"la pieza %d no superó la comprobación de trozos, descargándola de nuevo" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"El intento de descargar un torrent sin rastreador con un cliente sin " +"rastreador fue suspendido." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "la descarga falló:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Error de E/S: No hay espacio suficiente en el disco, o no es posible crear " +"un archivo tan grande:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "terminado por un error de E/S:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "terminado por un error de SO:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "terminado por una excepción interna:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Error adicional cuando se cerraba debido al error:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" +"No se pudo eliminar el archivo de reanudación rápido después del fallo:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "compartiendo" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "No se han podido escribir los datos de reanudación rápida:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "cerrar" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo errónea - no es un diccionario" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo errónea - partes malas de la clave" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo errónea - longitud de parte no válida" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo errónea - nombre erróneo" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "Nombre %s rechazado por motivos de seguridad" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "única/múltiple combinación de archivo(s)" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo errónea - longitud errónea" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo errónea - \"archivos\" no es una lista de archivos" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo errónea - valor de archivo erróneo" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo errónea - ruta errónea" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo errónea - ruta del directorio errónea" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "ruta %s rechazada por motivos de seguridad" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo errónea - ruta duplicada" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "metainfo errónea - el archivo y el subdirectorio usan el mismo nombre" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "metainfo errónea - tipo de objeto erróneo" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo errónea - no hay anuncio de secuncia URL" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "razón del fallo no textual" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "mensaje de advertencia no textual" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "entrada no válida en la lista de personas1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "entrada no válida en la lista de personas2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "entrada no válida en la lista de personas3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "entrada no válida en la lista de personas4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "lista de personas no válida" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "anuncio de intervalo no válido" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "anuncio de intervalo de minutos no válido" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "id del rastreador no válida" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "número de personas no válido" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "número de compartidas no válido" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"última\" entrada no válida" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Puerto a la escucha." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "archivo para almacenar información reciente de descarga" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tiempo de espera para cerrar conexiones" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "segundos entre guardados del dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "segundos entre descargas a punto de expirar" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "segundos que deben esperar los descargadores entre reanuncios" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"Número por defecto de personas a las que enviar el mensaje de información si " +"el cliente no ha especificado uno." + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"tiempo de espera entre comprobaciones de conexiones que han superado el " +"tiempo de espera (timeout)" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"cuántas veces comprobar si el descargador está detras de una NAT (0 = no " +"comprobar)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "añadir entradas al registro sobre resultados de comprobaciones de nat" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "tiempo mínimo de espera entre desague(flush) y desague" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"tiempo mínimo de espera antes de considerar un cache atorado y desaguarlo" +"(flush)" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"sólo permitir descargas de .torrents en este directorio (y en subdirectorios " +"que no contengan archivos .torrent). Si se establece, los torrents en este " +"directorio se mostrarán en la página de información aunque no tengan personas" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permitir claves especiales a torrents en el allowed_dir (directorio " +"permitido) que puedan afectar al acceso del rastreador." + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "reabrir o no el archivo log cuando se recibe una señal HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"mostrar o no una página de información cuando se carga el directorio raíz " +"del rastreador" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "un URL a donde redireccionar la página de información" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "mostrar o no nombres dentro del directorio permitido (allowed_dir)" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"archivo que contiene los datos en formato x-icon a devolver cuando el " +"navegador pide el favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorar el parametro GET del ip de máquinas que no estén dentro de la red ip " +"local (0 = nunca, 1 = siempre, 2= ignorar si la comprobacion de NAT está " +"deshabilitada). Las cabeceras de proxy HTTP que dan la direccion del cliente " +"original son tratadas como en --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"archivo en donde escribir los logs del tracker, usar - for stdout(por " +"defecto)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"utilizar con directorio permitido (allowed_dir); agrega un /file? hash=" +"{hash} url que permite a los usuarios descargar el archivo torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"mantén los torrents muertos hasta después de que expiren (de manera que " +"éstos se muestren en tu página de peticiones (scrape URL) / y página web). " +"Solo importa si el directorio permitido (allowed_dir) no ha sido configurado." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "acceso a petición permitido ( puede ser ninguno, específico, o total)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "número máximo de personas para dar con cualquier solicitud" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"tu archivo puede existir en cualquier parte\n" +"del universo, excepto aquí\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**atención** el archivo favicon especificado -- %s -- no existe." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**atención** archivo de estado (statefile) %s corrupto; reconfigurando" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Registro iniciado:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**atención** no se puede redireccionar la salida estándar al archivo de " +"registro:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Registro reiniciado" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**atención** no se puede reabrir el archivo de registro" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" +"la función específica de la petición no se encuentra disponible con este " +"rastreador." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" +"la función de petición total no se encuentra disponible con este rastreador." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "la función \"obtener\" no se encuentra disponible con este rastreador." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"La descarga solicitada no se encuentra autorizada para su uso con este " +"rastreador." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "ejecútese sin argumentos para explicaciones de parámetros" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Cerrando" diff --git a/locale/es_MX/LC_MESSAGES/bittorrent.mo b/locale/es_MX/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..df943d5ff16f7201568d11358597fe41ad2a9336 GIT binary patch literal 63290 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 literal 0 HcmV?d00001 diff --git a/locale/es_MX/LC_MESSAGES/bittorrent.po b/locale/es_MX/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..7ffb883 --- /dev/null +++ b/locale/es_MX/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2921 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (translations) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-15 14:02-0800\n" +"Last-Translator: Matt Chisholm \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Instale Python 2.3 o superior" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Se requiere PyGTK 2.4 o superior" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Introducir dirección URL del torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Introducir la dirección URL del torrent que se abrirá:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "acceso telefónico" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cable de hasta 128k" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cable de hasta 256k" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL de hasta 768k" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Velocidad máxima de subida" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Detener temporalmente todos los torrent" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Continuar descarga" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pausado" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Sin torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Funcionando normalmente" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Protegido/Sin acceso" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nueva %s versión disponible" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Una nueva versión de %s está disponible.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Estás usando %s, y la nueva versión es %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Siempre puedes obtener la nueva versión de \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Descargar_después" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Descargar_ahora" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Recordarme después" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Acerca de %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versión %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "No se puede abrir %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Donar" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Registro de eventos" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Guardar registro en:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "registro guardado" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "registro borrado" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Configuracion " + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Guardando" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Guardar nuevas descargas en:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Cambiar..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Preguntar dónde guardar cada nueva descarga" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Descargando" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Iniciando manualmente torrents adicionales:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Siempre detener el _ultimo torrent activo" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Siempre iniciar el torrent en _paralelo" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Preguntar cada vez" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Compartiendo" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Comparir los torrents completados: hasta que el ratio llegue a [_] por " +"ciento, o a [_] minutos, cualquiera que pase primero." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Compartir indefinidamente" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Compartir el último torrent descargado: hasta que el ratio llegue a [_] por " +"ciento." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Red" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Buscar un puerto disponible:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "Comenzando del puerto:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP a reportar al rastreador:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(No tiene efecto en caso de estar\n" +"en la misma red del rastreador)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Texto de la barra de progreso siempre en\n" +"negro (requiere reinicio)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Misceláneo" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ADVERTENCIA: El cambio de estos ajustes puede\n" +"impedir el funcionamiento apropiado de %s." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opción" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valor" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avanzado" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Escoger el directorio de descargas original" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Archivos en \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Aplicar" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Asignar" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nunca descargar" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Disminuir" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Incrementar" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nombre del archivo" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Longitud" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Personas para \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Dirección IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Cliente" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Conexión" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s descarga" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s subida" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB descargados" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB subidos" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% completado" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s est. descarga de la persona" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID de la persona" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interesado" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Ahogado" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Detenido" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Subida optimista" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "remoto" + +#: bittorrent.py:1358 +msgid "local" +msgstr "local" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "Mala persona" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d malo" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "prohibido" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informacion para \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nombre del archivo .torrent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(archivo .torrent sin rastreador)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Anunciar url:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", en un archivo" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", en %d archivos" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Tamaño total:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Partes:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Información de trozos:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Guardar en:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nombre de archivo:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Abrir directorio" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Mostrar lista de archivos" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "arrastre para reordenar" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "click derecho para mostrar el menú" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informacion del Torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Borrar el torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Cancelar torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", se compartirá por %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", se compartirá por tiempo indefinido." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Finalizado, tasa de compartimiento: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Finalizado, subido %s" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Finalizado" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Informacion del torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Abrir directorio" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Lista de archivos" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Lista de peers" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Cambiar ubicación" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Compartir indefinidamente" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Reiniciar" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Finalizar" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "Borrar" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "Cancelar" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "¿Está seguro de querer borrar \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Su proporción de compartimiento para este torrent es de %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Ha subido %s a este torrent." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "¿Borrar este torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Finalizado" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "arrastrar a la lista para compartir" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Fallado" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "arrastrar a la lista para continuar" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Esperando" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Ejecutando" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Subido actualmente: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Bajado actualmente: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Subido anterior: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Bajado anterior: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Tasa de compartimento: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s personas, %s compartidos. Totales desde el rastreador: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Copias distribuidas: %d; Siguiente: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Partes: %d total, %d completos, %d parciales, %d activos (%d vacios)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d partes malas + %s con pedido de descarte" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% finalizado, %s restante" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Tasa de descarga" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Tasa de subida" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "No disponible" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s iniciado" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Abrir archivo .torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Abrir dirección _URL del torrent" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Hacer archivo .torrent _nuevo" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pausa/ Abrir" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Salir" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Mostrar/Esconder archivos .torrent _terminados" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Cambiar a tamaño óptimo de ventana" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Registro" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "Ajustes" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Ayuda" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Sobre" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Donar" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "Archivo" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Ver" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Buscar torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(detenido)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(múltiple)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Ya se está descargando el instalador de %s" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "¿Instalar nuevo %s ahora?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "¿Desea salir de %s e instalar la nueva versión, %s, ahora?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Ayuda de %s está en \n" +"%s\n" +"¿Desea ir ahí ahora?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "¿Visitar la página de ayuda?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Hay un torrent finalizado en la lista." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "¿Desea eliminarlo?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Hay %d torrents finalizados en la lista." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "¿Desea eliminarlos todos?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "¿Borrar todos los archivos .torrent terminados?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "No hay archivos .torrent terminados" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "No hay archivos .torrent terminados que remover." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Abrir archivo .torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Cambiar ubicación de guardados para" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "¡Archivo existente!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "" +"El archivo \"%s\" ya existe. ¿Desea elegir un nombre de archivo distinto?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Guardar ubicación para" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "¡Ya existe el directorio!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"Ya existe \"%s\". ¿Desea crear un duplicado idéntico del directorio dentro " +"del directorio existente?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(mensaje global) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Error" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Se han producido múltiples errores. Haga click en Aceptar para ver el " +"registro de errores." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "¿Detener el torrent activo?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Ud. esta por activar \"%s\". ¿Desea también detener el último torrent activo?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "¿Ud. ha donado?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bienvenido a la nueva versión de %s. ¿Ud. ha donado?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "¿Gracias!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"¡Gracias por donar! Para donar nuevamente, seleccione \"Donar\" en el menú " +"\"Ayuda\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "estructura obsoleta, no usar" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"El intento de crear o enviar un comando a través de un identificador(Socket) " +"existente ha fallado." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Cerrando todas las ventanas de %s puede solucionar el problema. " + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s ya está activo" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "" +"El intento de enviar un comando a través de un identificador (Socket) " +"existente ha fallado." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "" +"No se pudo iniciar \"TorrentQueue\", consulte lo anterior para ver si hay " +"errores." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "creador %s de archivo torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Hacer archivo torrent para este archivo/directorio:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Elegir..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(los directorios se convertirán en torrentes por lotes)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Tamaño de las partes:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Usar el _rastreador:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Usar _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Notas (opcional):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Comentarios:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Hacer" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Puerto" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Construyendo torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Revisando el tamaño de los archivos..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Empezar a compartir" + +#: maketorrent.py:540 +msgid "building " +msgstr "construyendo" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Hecho." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Finalizada la construcción de los torrents." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "¡Error!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Error al construir los torrents:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d días" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dia %d horas" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d minutos" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutos" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d segundos" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 segundos" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Ayuda" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Preguntas Frecuentes:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Ir" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Elegir una carpeta existente..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Todos los archivos" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Archivos Torrent (Torrents)" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Crear una nueva carpeta..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Seleccionar archivo" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Seleccionar carpeta" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "No se pudo cargar el estado guardado:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "No se pudo guardar el estado UI (Interfaz del Usuario):" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Estado inválido del contenido de los archivos" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Error leyendo el archivo" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "No se puede restaurar el estado completamente" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Estado inválido del archivo (entrada duplicada)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Datos corruptos en" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , no se puede restaurar el archivo .torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Estado inválido del archivo (Entrada Errónea)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Mal archivo del estado de UI (Interfaz del Usuario)" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Mala versión del archivo del estado de UI (Interfaz del Usuario)" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versión sin apoyo del archivo del estado de UI (Interface del Usuario) (¿De " +"una version nueva del cliente?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "No se pudo borrar el archivo %s cacheado:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Este no es un archivo .torrent válido (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "" +"Este archivo .torrent (o uno con el mismo contenido) está funcionando ya." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Este archivo .torrent (o uno con el mismo contenido) está esperando para ser " +"ejecutado." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "El archivo .torrent está en un estado desconocido %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "No se puede escribir el archivo" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"el archivo .torrent no será recomenzado correctamente cuando reinicie el " +"cliente" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"No se puede ejecutar más de %d torrents simultáneamente. Para más " +"información revise Preguntas Frecuentes en %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"No se puede descargar el torrent debido a que existen otros torrents " +"esperando para ser ejecutados, y éste coincide con los ajustes para cuando " +"se pare de compartir." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"No se comenzará este archivo .torrent ya que tiene los requisitos para parar " +"de compartir el último archivo .torrent completado." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "No fue posible obtener la versión más reciente de %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "" +"No fue posible quebrantar la secuencia de caracteres de la nueva versión de %" +"s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"No fue posible encontrar un ubicación temporal adecuada para guardar el " +"instalador de %s%s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "No hay archivo torrent disponible para el instalador de %s%s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "El instalador de %s%s parece estar dañado o desaparecido." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "No se pudo activar el instalador en este Sistema Operativo" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"el directorio en que datos como el de resumido rapido y el estado de GUI han " +"sido guardados. Regresa a los 'datos' originales al subdirectorio del " +"directorio bittorrent de config. " + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codificación de caracteres usados en el sistema de archivos local. Si fue " +"dejada vacía, se autodetecta. La autodetección no funciona en versiones de " +"python anteriores a 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Codigo ISO del lenguaje a usar" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"Reportar IP al rastreador (no tiene efecto a menos que se encuentre en la " +"misma red de área local que el rastreador)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"puerto visible al mundo si es diferente del que el cliente enlista localmente" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"puerto mínimo que se debe enlistar, la cuenta incremente si no está " +"disponible" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "puerto máximo que se debe enlistar" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP que se debe atar localmente" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "segundos entre actualizaciones de la información exhibida" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minutos que se deben de esperar entre peticiones de más personas" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "numero mínimo de personas al que no se debe rehacer la petición" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "número de personas al cual se debe detener nuevas conexiones" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"número máximo de conexiones permitidas, después de esta conexión que se " +"aproxima serán cerradas inmediatamente" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "si se deben comprobar los trozos del disco o no" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "máximo número de kB/s al cual se debe subir, 0 significa sin limite" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "número de subidas que se debe llenar con optimismo extra de desahogos " + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"número máximo de archivos .torrent que se deben quedar abiertos a la vez en " +"un multi-archivo .torrent, 0 significa sin límite, Usado para evadir el " +"agotamiento de descriptores de archivos. " + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicializa un cliente sin rastreador. Debe activarse para poder descargar " +"torrents sin rastreador." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "número de segundos que se debe pausar entre enviados de revividores" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "cuántos bytes a preguntar por cada petición." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"el prefijo máximo de la longitud que le codifica que se aceptará sobre el " +"alambre - valores más grandes consiguen que la conexión caiga." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"segundos a esperar entre el cierre de zócalos en donde no se ha recibido " +"nada." + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "segundos a esperar entre el chequeo de conexiones fallidas" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"slice máximo de la longitud a enviar a las personas, cerrar conexión si se " +"recibe una petición más grande" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"intervalo de tiempo máximo en el cual se estiman las tasas actuales de " +"subida y descarga" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"intervalo de tiempo máximo en el cual se estima la tasa actual de compartido" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"tiempo máximo que se debe esperar entre repetición de anuncios si continuan " +"fallando" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"segundos a esperar por datos a llegar sobre una conexion antes de asumir que " +"esta ahogada parcialmente permanente" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"número de descargas al cual se debe cambiar de al azar a más raro primero" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "" +"cantidad de bytes al que se debe escribir en la red de almacenadores " +"intermediarios a la vez" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"rechaza conexiones futuras de las direcciones con personas quebradas u " +"hostiles que envían datos incorrectos a propósito y con mala intención" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "no conectarse a varias personas con la misma dirección IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"si es distinto a cero, fije la opción de la TOS para las conexiones de " +"personaa este valor" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"permitir una forma de evadir un error en BSD libc que hace que los archivos " +"sean leídos a una velocidad muy lenta." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "" +"dirección de HTTP proxy que se debe usar para las conexiones del rastreador" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "cerrar conexiones con RST y evitar el estado TIME_WAIT de TCP" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Usar bibliotecas de red Trenzada para las conexiones de red. 1 significa " +"usar trenzadas, 0 no trenzadas y -1 autodetectar y preferir trenzadas" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nombre del archivo (para archivos .torrents de un solo archivo) o nombre del " +"directorio (para archivos .torrent hornados) donde se guardará el archivo ." +"torrent, eliminar el nombre original en el archivo .torrent. Ver también -" +"guardar_en. si no se especifica ninguno se le pedirá al usuario una " +"ubicacion donde guardar" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "exhibir la interfaz de usuario avanzado" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"número de minutos máximos que se debe compartir el fichero .torrent antes de " +"detenerse" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"tasa mínima de subida/bajada, en porcentaje, para alcanzar antes de parar de " +"compartir el torrent. 0 se usa para sin límite." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"tasa mínima de subida/bajada, en porcentaje, para alcanzar antes de parar de " +"compartir el último torrent. 0 se usa para sin límite." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Compartir cada archivo torrent terminado indefinidamente (hasta que el " +"usuario lo cancele)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Compartir el último archivo torrent indefinidamente (hasta que el usuario lo " +"cancele)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "iniciar el programa en estado pausado" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"especificar cómo debe comportarse la aplicación cuando el usuario trata de " +"iniciar manualmente otro torrent: \"reemplazar\" quiere decir reemplazar el " +"torrent activo por el nuevo, \"agregar\" quiere decir agregar el torrent en " +"paralelo, y \"preguntar\" se usa para preguntar al usuario cada vez." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nombre de archivo (para torrents de un solo archivo) o nombre de directorio" +"(para torrents por lotes) para guardar como, sobreescribiendo el nombre por " +"defecto especificado en el torrent.Vea también --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"el número permitido de subidas a la vez.-1 (ojala) significa un número " +"razonable basandose en la --tasa de_subida_máxima. Los valores automáticos " +"son sensibles únicamente cuando se activa un archivo torrent a la vez." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"directorio local donde el contenido del torrent se guardará. El archivo(para " +"torrents de 1 solo archivo) o directorio(para torrents por lotes) serán " +"creados en este directorio usando el nombre por defecto especificado en el " +"archivo .torrent. Ver tambien --save_as" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"para determinar si preguntar o no el lugar en donde guardar los archivos " +"descargados" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"el directorio local en donde guardar los torrents, usando un nombre " +"determinado por --saveas_style. Si se deja en blanco, cada torrent se " +"guardará en el directorio donde se encuentra el correspondiente archivo ." +"torrent" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "cada cuándo volver a detectar el directorio de torrents, en segundos" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Cómo nombrar las descargas de torrents: 1: utilice el nombre DEL archivo " +"torrent (menos .torrent); 2:utilice el nombre codificado EN el archivo " +"torrent; 3: cree un directorio con el nombre DEL archivo torrent (menos ." +"torrent) y guardelo en ese directorio utilizando el nombre codificado EN el " +"archivo torrent; 4: si el nombre DEL archivo torrent (menos .torrent) y el " +"nombre codificado EN el archivo torrent son idénticos, utilice ese nombre " +"(estilo 1/2),si no, cree un directorio intermedio del estilo 3; PRECAUCIÓN: " +"opciones 1 y 2 tienen la habilidad de sobreescribir archivos sin avisar y " +"esto puede presentar problemas de seguridad." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"mostrar o no la ruta completa o el contenido del torrent por cada torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "directorio en donde buscar por archivos .torrent (semi-recursivo)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "mostrar o no informacion de diagnóstico en stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "a qué potencia de dos configurar el tamaño de las partes" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nombre por defecto del rastreador" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"si es falso entonces haga un torrent sin rastreador, en lugar de la URL de " +"announce utilice un puerto seguro de la forma : o una cadena " +"vacía para tirar algunos nodos de su tabla de enrutamiento" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "¡descarga completa!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "terminando en %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "descarga existosa" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB sub / %.1f MB desc)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB sub / %.1f MB desc)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d vistas ahora, más %d copias distribuidas (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d copias distribuidas (siguiente: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d vistas ahora" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ERROR:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "guardando:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "tamaño del archivo:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "porcentaje hecho:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tiempo restante:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "descarga en:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "ratio de descarga:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "ratio de subida:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "Calificación por compartir:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "estado de compartido:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "estado de la persona:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "No puede especificar ni --save_as ni --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "cerrando" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Error leyendo configuración:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Error al leer el archivo .torrent:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "debe especificar un archivo .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Fallo en la inicialización de la IGU (GUI)en modo texto, imposible seguir." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Esta interfaz de descarga necesita el módulo estándar de Python \"curses\", " +"que desafortunadamente no está disponible para el puerto nativo de Windows " +"de Python. De cualquier modo, está disponible para el puerto Cygwin de " +"Python, que se ejecuta en todos los sistemas Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Aún puede usar la \"consola-bittorrent\" para descargar." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "archivo:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "tamaño:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "dest:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progreso:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "estado:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "velocidad de la descarga:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "velocidad de la subida:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "compartiendo:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "compartidas:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "personas:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d vistas ahora, más %d copias distribuidas(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "error(es):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "error:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Subida Descarga Completado Velocidad" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" +"descargando %d piezas, tiene %d fragmentos, %d de %d piezas completadas" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Estos errores se han producido durante la ejecución:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s TRACKER_URL[ARCHIVOTORRENT[ARCHIVOTORRENT ...]]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "announce antiguo para %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "no hay torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERROR DEL SISTEMA - SE HA GENERADO UNA EXCEPCIÓN" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Advertencia:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "no es un directorio" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"error: %s\n" +"ejecute sin argumentos para una explicación de los parámetros" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEPCIÓN:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Todavía puede utilizar \"btdownloadheadless.py\" para la descarga." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "conectando a personas" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tiempo Estimado de Llegada (ETA) en %d:%02d:%02d " + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Tamaño" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Descarga" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Subida" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totales:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s personas %s compartidos %s copias dist - %s descarga %s subida" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "error:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"ejecute sin argumentos para una explicación de los parámetros" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "comentario opcional legible por humanos para poner en el .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "archivo objetivo opcional para el torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodifica %s archivos de metainfo" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s [ARCHIVOTORRENT[ARCHIVoTORRENT ...]]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "archivo de metainfo: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "trozo de información:%s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nombre de archivo: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "tamaño de archivo:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "archivos:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nombre del directorio: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "tamaño de archivo:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "rastreador de url announce: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "nodos sin rastreador:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "comentario:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "No fue posible crear control de socket:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "No fue posible enviar comandos:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "No fue posible crear control de socket: ya está en uso" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" +"No fue posible quitar el control de socket antiguo del nombre de archivo:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Ya se creó el mutex global." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "No se pudo encontrar un puerto abierto." + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "No se pudo crear un directorio de datos de las aplicaciones." + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"No se pudo adquirir bloqueo de global mutex para el archivo de controlsocket." + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "No se limpió bien una instancia anterior de BT. Continuando." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "No es una secuencia válida bencoded" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "Valor bencoded inválido (datos después del prefijo válido)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Uso: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPCIONES][DIRECTORIOTORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Si uno de los argumentos no es una opción, se tomará como el valor\n" +" de la opcion directorio_torrent.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPCIONES] [ARCHIVOSTORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPCIONES] [ARCHIVOTORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPCION] ARCHIVO URL_TRACKER[ARCHIVO]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "los argumentos son -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(por defecto a" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "clave desconocida" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parámetro pasado al final sin ningún valor" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "el procesado de la línea de comandos falló en" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Se requiere la opción %s." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Debe dar almenos _%d de argumentos." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Demasiados argumentos - %d máximo." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "formato equivocado de %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "No fue posible guardar permanentemente los opciones:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" +"El anuncio del rastreador no ha sido completado %d segundos después de " +"comenzarlo" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problema conectándose al rastreador, falló gethostbyname -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problema conectando al rastreador -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "datos erróneos provenientes del rastreador" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "rechazado por el rastreador -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Abortando el archivo .torrent puesto que fue rechazado por el rastreador " +"porque no estableció conexión con ninguna persona." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Mensaje del rastreador:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "Advertencia del rastreador -" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "No se ha podido leer el directorio" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "No se pudo verificar" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "eliminando %s (se añadirá luego)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**atención** %s es un torrent duplicado para %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**advertencia** %s contiene errores" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "...exitoso" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "eliminando %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "comprobación completa" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "zócalo perdido del servidor" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Error manejando conexión aceptada:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Se debe salir ya que el apilado de TCP forma escamas hacia fuere. Favor vea " +"las preguntas comunmete preguntadas en %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" +"Demasiado tarde para cambiar a terminaciones de RawServer, %s ya se ha " +"utilizado" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Lun" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Mié" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Jue" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Vie" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sáb" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Dom" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Ene" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Abr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "May" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Ago" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Oct" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dic" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Comprimido: %i Sin Comprimir: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"No se puede especificar el nombre del archivo .torrent al generar varios " +"torrents simultáneamente" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "El juego de caracteres \"%s\" no está soportado en esta versión" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"No se puede convertir el nombre del archivo/directorio \"%s\" a utf-8 (%s). " +"O el nombre de archivo \"%s\" es incorrecto o contiene caracteres ilegales." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"El nombre de archivo/directorio \"%s\" contiene valores unicode reservados " +"que no se corresponden con caracteres." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "Datos erróneos en el archivo de respuesta - El total es muy pequeño" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "Datos erróneos en el archivo de respuesta - El total es muy grande" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "revisando archivo existente" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--comprobar_trozos 0 o la información de resumido rápido no coincidió con el " +"estado de algún archivo (Faltan Datos)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" +"Información errónea de resumido rápido (Los archivos contienen más datos)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Información errónea de resumido rápido (Valor Ilegal)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "Datos corruptos en el disco - ¿tal vez posees dos copias activas?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "No se logró leer los datos de resumido rápido:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"El archivo se completó al inicio, pero fallo en la comprobación de trozos" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "El archivo %s pertenece a otro archivo .torrent en funcionamiento" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "El archivo %s ya existe, pero no es un archivo regular" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lectura corta - ¿algo truncó a los archivos?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formato sin apoyo del archivo de resumido rápido, ¿tal vez otra versión del " +"cliente? " + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Parece que otro programa ha movido, cambiado el nombre o borrado el archivo." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Parece que otro programa ha modificado el archivo. " + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Parece que otro programa ha cambiado el tamaño del archivo." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "No se ha podido establecer el manipulador de señal:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "eliminado \"%s/\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "añadido \"%s/\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "esperando la comprobación de trozos" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "descargando" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "releyendo el archivo de configuración" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "No se pudo verificar %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"No se pudo descargar o abrir \n" +"%s\n" +"Intente utilizar un explorador web para descargar el archivo torrent." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Ésta parece ser una versión antigua de Python que no soporta la detección de " +"la codificación de los archivos del sistema. Se asume 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python falló en autodetectar la codificación del sistema de archivos. Usando " +"'ascii' en su lugar." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"La codificación del sistema de archivos '%s' no está soportada. Usando " +"'ascii' en su lugar." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componente erróneo de la ruta del archivo:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Este archivo .torrent ha sido creado con una archivo incorrectamente " +"codificados. Algunos o todos los nombres de archivo pueden aparecer " +"diferente de lo que el creador del archivo .torrent quiso." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Este archivo .torrent ha sido creado con una herramienta quebrada y contiene " +"valores de caracteres erróneos que no corresponden a ningun caracter real. " +"Algunos o todos los nombres de archivo pueden aparecer diferente de lo que " +"el creador del archivo .torrent quiso." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Este archivo .torrent ha sido creado con una herramienta quebrada y tiene " +"archivos codificados incorrectamente. Los nombres pueden ser todavía " +"correctos." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"El conjunto de caracteres usados en el sistema de archivos local (\"%s\") no " +"puede representar todos los caracteres usados en el nombre de archivo de " +"este torrent. Los nombres de archivo han sido cambiados del original." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"El sistema de archivos de Windows no puede manejar algunos caracteres usados " +"en el nombre de archivo(s) de este torrent. Los nombres de archivo han sido " +"cambiados del original." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Este archivo torrent ha sido creado con una herramienta quebrada y tiene " +"cuando menos 1 archivo con un nombre inválido del archivo o directorio. Sin " +"embargo puesto que tales archivos fueron marcados como si tuviesen una " +"longitud de 0 esos archivos son simplemente ignorados." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Se requiere Python 2.2.1 o una versión más nueva" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "No se puede comenzar dos instancias separadas del mismo torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport es menor que minport - no hay puertos a comprobar" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "No pudo abrirse un puerto de escucha: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "No pudo abrirse un puerto de escucha: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Compruebe la configuración de su rango de puertos" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Arranque inicial" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "No pudo cargar datos de resumido rápido: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Se llevará a cabo una comprobación completa de trozos." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" +"la pieza %d no superó la comprobación de trozos, descargándola de nuevo" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Intento de descargar archivo torrent sin rastreador con un cliente sin " +"rastreador fue apagado/terminado." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "la descarga falló:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Error de E/S: No hay espacio suficiente en el disco, on no es posible crear " +"un archivo tan grande:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "terminado por un error de E/S:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "terminado por un error de SO:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "terminado por una excepción interna:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Error adicional cuando se cerraba debido al error:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" +"No se pudo eliminar el archivo de reanudación rápido después del fallo:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "compartiendo" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "No se ha podido escribir los datos de reanudación rápida:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "cerrar" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo errónea - no es un diccionario" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo errónea - piezas malas de la llave" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo errónea - longitud ilegal de la pieza" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo errónea - nombre erróneo" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "Nombre %s rechazado por questiones de seguridad" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "combinación única/multiple de archivo(s)" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "matainfo errónea - longitud errónea" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo errónea - \"archivos \" no es una lista de archivos" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo errónea - valor de archivo erróneo" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metaifo errónea - destinación errónea" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo errónea - destinación del directorio errónea" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "destinación %s rechazada por questiones de seguridad" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo errónea - destinación duplicada" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo errónea - el nombre está siendo usado como ambos nombre del archivo " +"y nombre del subdirectorio" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "metainfo errónea - tipo de objeto erróneo" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo errónea - no hay anuncio de secuencia URL" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "la razón de la falla es no-textual" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "mensaje de advertencia no-textual" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "entrada inválida en la lista de personas1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "entrada inválida en la lista de personas2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "entrada inválida en la lista de personas3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "entrada inválida en la lista de personas4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "lista inválida de personas" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "anuncio inválido de intervalo" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "anuncio de intervalo inválido de min" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "id del rastreador inválida" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "cuenta inválida de personas" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "cuenta inválida de compartidas" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"última\" entrada inválida" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Puerto a la escucha." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "archivo para almacenar información reciente de descarga" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tiempo de espera para cerrar conexiones" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "segundos entre guardados del dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "segundos entre descargas a punto de expirar" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "segundos que deben esperar los descargadores entre reanuncios" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"número automático de personas al cual se les enviará un mensaje de " +"información si no especifica un número el cliente " + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"tiempo de espera entre comprobaciones por conexiones que han superado el " +"tiempo de espera (timeout)" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"cuántas veces comprobar si el descargador está detras de una NAT (0 = no " +"comprobar)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "añadir entradas al registro sobre resultados de comprobaciones de nat" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "mínimo tiempo a esperar entre limpieza(flush) y limpieza" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"mínimo tiempo en segundos a esperar antes de considerar un cache atorado y " +"limpiarlo" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"sólo permitir descargas de .torrents en este directorio (y en subdirectorios " +"que no contengan archivos .torrent). Si se establece, los torrents en este " +"directorio se mostrarán en la página de información aunque no tengan personas" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permitir claves especiales afectar el acceso al tracker en torrentes dentro " +"del directory permitido (allowed_dir)" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" +"reabrir o no el archivo de bitacora(log) cuando se recibe una señal HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"mostrar o no una pagina de información cuando el directorio raíz del " +"rastreadores cargado" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "un URL a donde redireccionar la página de información" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "mostrar o no nombres dentro del directorio permitido (allowed_dir)" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"archivo que contiene los datos en formato x-icon a devolver cuando el " +"navegador pide el favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorar el parámetro GET del ip de máquinas las cuales no estén dentro de la " +"red ip local (0 = nunca, 1 = siempre, 2= ignorar si la comprobación de NAT " +"esta deshabilitada).Las cabeceras de proxy HTTP que dan la dirección del " +"cliente original son tratadas como en --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"archivo en donde escribir la bitácora del rastreador, usar - para usar stdout" +"(por defecto)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"utilizar con _dir permitido; agrega un /archivo? hash={hash} url que permite " +"a los usuarios descargar el archivo torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"mantén los torrents muertos hasta despúes de que expiren (de manera que " +"estos se muestren en tu página de peticiones (scrape URL) / y página web). " +"Solo importa si el _dir permitido no se encuentra listo." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "acceso a petición permitido ( puede ser ninguna, específica, o total)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "número máximo de personas para dar con cualquier solicitud" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"tu archivo puede existir en cualquier otra parte del universo\n" +"pero por lo menos, no aquí\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**atención** el archivo favicon especificado -- %s -- no existe." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**atención** archivo de estado (statefile) %s corrupto; reconfigurando" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Registro Iniciado:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**atención** no se puede redireccionar la salida estandar al archivo de " +"registro:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Registro reiniciado" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**atención** no se puede reabrir el archivo de registro" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" +"la función específica de la petición no se encuentra disponible con este " +"tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" +"la función de petición total no se encuentra disponible con este rastreador." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "la función \"obtener\" no se encuentra disponible con este rastreador." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"La descarga solicitada no se encuentra autorizada para su uso con este " +"rastreador." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "ejecútese sin argumentos para explicaciones de parámetros" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Cerrando" diff --git a/locale/fr/LC_MESSAGES/bittorrent.mo b/locale/fr/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..822d4941e0ebe08896d5b250c1355fdcc9f092dd GIT binary patch literal 63355 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 literal 0 HcmV?d00001 diff --git a/locale/fr/LC_MESSAGES/bittorrent.po b/locale/fr/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..0ac3bb3 --- /dev/null +++ b/locale/fr/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2903 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-15 14:04-0800\n" +"Last-Translator: Matt Chisholm \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: French\n" +"X-Poedit-Country: FRANCE\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installez Python 2.3 ou une version supérieure" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 ou plus récent requis" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Entrez l'URL du torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Entrez l'URL d'un fichier torrent à ouvrir :" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "Modem RTC" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/Câble 128kbps et plus" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/Câble 256kbps et plus" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768kbps et plus" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Taux de téléchargement maximum :" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Interrompre momentanément tous les torrents" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Reprendre le téléchargement" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "En pause" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Aucun torrent" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Fonctionnement normal" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Bloqué par le coupe-feu/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nouvelle version %s disponible" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Une nouvelle version de %s est disponible.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Vous utilisez %s, et la nouvelle version est %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Vous pouvez toujours obtenir la dernière version depuis \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Télécharger _plus tard" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Télécharger _maintenant" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Me le rappeler ultérieurement" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "À propos de %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Bêta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Version %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Ouverture de %s impossible" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Faites un don" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Journal d'activité de %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Enregistrer le journal sous :" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "journal enregistré" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "journal effacé" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Réglages de %s" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Sauvegarde en cours" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Sauvegarder les nouveaux téléchargements dans :" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Changer ..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Demander où sauvegarder chaque nouveau téléchargement" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Téléchargement en cours" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Ajout manuel de torrents supplémentaires :" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Toujours interrompre le _dernier torrent en cours" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Toujours lancer le dernier torrent en _parallèle" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Demander à chaque fois" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Essaimage" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Essaimer les torrents finalisés : jusqu'à ce que le taux de partage atteigne " +"[_] pourcent, ou durant [_] minutes, à la première échéance." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Essaimer indéfiniment" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Essaimer le dernier torrent finalisé : jusqu'à ce que le ratio de partage " +"atteigne [_] pourcent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Réseau" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Rechercher un port disponible :" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "démarrage sur le port :" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP à rapporter au tracker :" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(N'a aucun effet si vous n'êtes pas sur le \n" +" même réseau local du tracker)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Le texte de la barre de progression est toujours noir \n" +" (nécessite un redémarrage)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Divers" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"AVERTISSEMENT : L'altération de ces réglages peut\n" +" empêcher %s de fonctionner correctement." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Option" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valeur" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avancé" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Choissir le répertoire de téléchargement par défaut" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Fichiers dans \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Appliquer" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Allouer" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Ne jamais télécharger" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Diminuer" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Augmenter" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nom du fichier" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Longueur" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Pairs pour \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Adresse IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Client" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Connexion" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "Ko/s de téléchargement en aval" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "Ko/s de téléchargement en amont" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "Mo téléchargés en amont" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "Mo téléchargés en aval" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% terminé" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "Téléchargement pair estimé en Ko/s" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID pair" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Intéressé" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Piégé" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Rejeté" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Téléchargement en aval optimiste" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "distant" + +#: bittorrent.py:1358 +msgid "local" +msgstr "local" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "mauvais pair" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d mauvais" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "banni" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Infos sur \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nom du torrent :" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent sans tracker)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URL d'annonces :" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", en un fichier" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", en %d fichiers" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Taille totale :" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Parts :" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Hachage :" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Enregistrer sous :" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nom du fichier :" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Ouvrir le répertoire" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Montrer la liste des fichiers" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "Déplacer pour réarranger" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "Clic droit pour le menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Info du torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Supprimer torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Annuler torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", essaimera jusqu'à %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", essaimera indéfiniment." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Terminé, taux de partage : %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Terminé, %s téléchargés." + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Terminé" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Info du torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Ouvrir répertoire" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Liste des _fichiers" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Liste des _pairs" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Modifier l'emplacement" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Essaimer indéfiniment" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Re_démarrer" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Terminer" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Supprimer" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Annuler" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Êtes-vous sûr de vouloir supprimer \"%s\" ?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Votre taux de partage pour ce torrent est %d%%. " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Vous avez téléchargé %s à ce torrent." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Supprimer ce torrent ?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Terminé" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "déplacer dans la liste pour essaimer" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Échec" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "déplacer dans la liste pour reprendre" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "En attente" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "En cours" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Téléchargement en amont actuel : %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Téléchargement en aval actuel : %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Téléchargement en amont précédent : %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Téléchargement en aval précédent : %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Taux de partage : %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s pairs, %s essaims. Totaux depuis le tracker : %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Copies distribuées : %d ; Suivant : %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Parts : %d entiers, %d complets, %d partiels, %d actifs (%d vides)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d mauvaises parts +%s dans des requêtes écartées" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% effectués, %s restants" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Taux de téléchargement en aval" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Taux de téléchargement en amont" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "NA" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s démarrés" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Ouvrir fichier torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Ouvrir l'_URL du torrent" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Créer un _nouveau torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pause/Lecture" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Quitter" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Afficher/Masquer les torrents _terminés" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Redimensionner la fenêtre pour ajuster" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Journal" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Paramètres" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Aide" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_À propos" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Faire un don" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Fichier" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Afficher" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Rechercher torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(arrêté)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(multiple)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Téléchargement de %s installeur déjà en cours" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Installer le nouveau %s maintenant ?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "" +"Voulez vous quitter %s et installer la nouvelle version, %s, maintenant ?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"L'aide %s\n" +"est à %s\n" +"Voulez-vous vous y rendre ?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Visiter la page Internet d'aide ?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Un torrent terminé est présent dans la liste." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Voulez-vous le retirer ?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Il y a %d torrents terminés dans la liste." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Souhaitez-vous tous les retirer ?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Retirer tous les torrents terminés ?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Aucun torrent terminé." + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Il n'y a aucun torrent terminé à retirer." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Ouvrir un torrent :" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Changer l'emplacement de sauvegarde pour" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Ce fichier existe déjà !" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" existe déjà. Voulez-vous choisir un nom de fichier différent ?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Enregistrer l'emplacement pour" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Ce dossier existe déjà !" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" existe déja. Voulez-vous créer un dossier dupliqué, identique dans le " +"dossier existant ?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(message global) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Erreur" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"De multiples erreurs sont apparues. Cliquez sur OK pour voir le journal des " +"erreurs." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Arrêter le torrent en cours ?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Vous allez lancer \"%s\". Voulez-vous aussi arrêter le dernier torrent en " +"cours ?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Avez-vous fait un don ?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bienvenue dans cette nouvelle version de %s. Avez-vous fait un don ?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Merci !" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Merci pour votre don ! Pour donner à nouveau, sélectionnez \"Faire un don\" " +"depuis le menu \"Aide\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "obsolète, ne pas utiliser" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Échec de création ou d'envoi de commande sur l'accès de contrôle existant." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Fermer toutes les fenêtres de %s devrait résoudre le problème." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s est déjà en cours." + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Échec d'envoi de commande sur l'accès de contrôle existant." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "" +"Démarrage de la file d'attente TorrentQueue impossible, voir ci-dessus pour " +"les erreurs. " + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s créateur de fichier torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Créer un fichier torrent pour ce fichier/répertoire :" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Choisir..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Les répertoires deviendront des torrents en lots)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Taille de part :" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Utiliser _tracker :" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Utiliser _DHT :" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Nœuds (optionnel) :" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Commentaires :" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Faire" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Hôte" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Création de torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Vérification des tailles de fichiers..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Lancer l'essaimage" + +#: maketorrent.py:540 +msgid "building " +msgstr "en construction" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Terminé." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Construction des torrents terminée." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Erreur !" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Erreur de construction des torrents :" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d jours" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 jour %d heures" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d heures" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutes" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d secondes" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 seconde" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "Aide %s" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Foire aux questions" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Aller" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Choisir un répertoire existant..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Tous les fichiers" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Créer un nouveau répertoire..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Sélectionner un fichier" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Sélectionner un dossier" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Échec de téléchargement de l'état sauvegardé :" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Sauvegarde de l'état UI impossible :" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Contenus du fichier d'état invalides" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Erreur de lecture du fichier" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "Restauration complète de l'état impossible" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Fichier d'état invalide (entrée double)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Données corrompues dans" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", restauration du torrent impossible (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Fichier d'état invalide (mauvaise entrée)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Mauvais fichier d'état UI" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Mauvaise version du fichier d'état UI" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Version du fichier d'état UI non supportée (provient d'une nouvelle version " +"du client ?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Ne peut pas supprimer le fichier %s caché :" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Ceci n'est pas un fichier torrent valide. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Ce torrent (ou un avec un contenu identique) est déjà en cours." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Ce torrent (ou un avec un contenu identique) est déjà en attente." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent dans un état inconnu %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Écriture du fichier impossible " + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "le torrent ne sera pas relancé correctement au redémarrage du client" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Impossible de gérer simultanément plus de %d torrents. Pour plus d'infos, " +"lire la FAQ à %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Le torrent ne démarre pas à cause d'autres torrents en attente, et il " +"correspond déjà aux critères d'arrêt de l'essaimage." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Le torrent ne démarre pas car il correspond déjà aux critères d'arrêt de " +"l'essaimage du dernier torrent complété." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Impossible d'obtenir la dernière version depuis %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Impossible d'analyser la chaîne de la nouvelle version depuis %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Impossible de trouver un emplacement temporaire approprié pour sauvegarder " +"l'installeur %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Aucun fichier torrent disponible pour l'installeur %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "L'installeur %s %s semble être corrompu ou manquant." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Impossible de lancer un installeur sur ce système d'exploitation" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"le repertoire contenant des données variées comme les informations de remise " +"en route rapide et l'état de l'IU est sauvegardé. Il s'agit par défaut du " +"sous-répertoire 'data' du répertoire de configuration BitTorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"encodage des caractères utilisé sur le système de fichier local. Laissé " +"vide, il est autodétecté. L'auto-détection ne fonctionne pas avec les " +"versions python inférieures à 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Code de langue ISO à utiliser" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP à transmettre au tracker (n'a aucun effet si vous n'êtes pas sur le même " +"réseau local que le tracker)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"numéro du port visible universellement s'il est différent de celui sur " +"lequel le client écoute localement" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "port minimal d'écoute, incrémenté si indisponible" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "port maximal d'écoute sur" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP à relier localement" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "intervalle en secondes de mise à jour des informations affichées" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "intervalle en minutes entre les requêtes pour plus de pairs" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "nombre minimum de pairs pour éviter nouvelle requête" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "nombre de pairs auquel limiter l'initiation de nouvelles connexions" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"nombre maximum de connexions autorisées ; au delà, les nouvelles connexions " +"entrantes seront immédiatement fermées." + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "condition de vérification des hachages sur le disque" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "Ko/s maximum pour le téléchargement ; 0 signifie sans limite" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" +"le nombre de téléchargements à desservir avec dépiégeages extra optimistes" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"le nombre maximum de fichiers dans un torrent multi-fichiers à conserver " +"ouverts simultanément, 0 signifiant sans limite. Utilisé pour éviter de " +"manquer de descripteurs de fichiers." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Initialise un client sans tracker. Ceci doit être activé pour télécharger " +"depuis des torrents sans tracker." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"intervalle en secondes entre les envois de message de maintien de connexions" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "quantité d'octets à demander par requête." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"longueur maximale d'encodage du préfixe autorisée via le réseau - des " +"valeurs plus grandes perdront la connexion" + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"intervalle en secondes avant la fermeture des accès sur lesquels rien n'a " +"été reçu" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "intervalle en secondes pour vérifier l'expiration des connexions" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"tranche de longueur maximale à envoyer aux pairs, clôt la connexion si une " +"requête plus importante est reçue" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"intervalle maximal de temps permettant l'estimation les taux de " +"téléchargement en aval et en amont" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"intervalle maximal de temps permettant l'estimation du taux d'essaimage " +"courant" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "intervalle maximal pour réessayer une annonce échouant" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"secondes d'attente de réception de données sur une connexion avant de la " +"définir comme piégée de façon semi-permanente" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"nombre de téléchargements à partir duquel effectuer la commuation " +"d'aléatoire versle plus rare en premier" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "quantité d'octets à écrire simultanément dans le tampon réseau." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"refuse les connexions aux adresses dont les pairs, rompus ou " +"intentionnellement hostiles, envoient des données incorrectes" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "ne se connecte pas à plusieurs pairs ayant la même adresse IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"si non nulle, régler l'option TOS pour les connexions aux pairs à cette " +"valeur" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"active une solution de contournement pour une erreur dans la bibliothèque " +"BSD libc rendant la lecture des fichiers très lente." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adresse du proxy HTTP à employer pour les connexions tracker" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "fermer les connexions avec RST et éviter l'état TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Utiliser les bibliothèques réseaux Twisted pour les connexions réseau. 1 " +"indiquel'emploi de Twisted , 0 ne pas l'utiliser, -1 signifie autodétecte et " +"préfère Twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nom de fichier (pour torrent à fichier unique) ou nom du répertoire (pour " +"torrents en lots) sous lequel enregistrer le torrent, outrepassant le nom " +"par défaut du torrent. Voir aussi --enregistrer_dans, si aucun n'est " +"spécifié, l'utilisateur se verra demandé l'emplacement de la sauvegarde" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "afficher l'interface utilisateur avancée" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"intervalle maximal de minutes pour essaimer un torrent terminé avant " +"d'arrêter l'essaimage" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"le taux minimal de téléchargement en amont/en aval, en pourcentage, à " +"atteindre avant d'interrompre l'essaimage. 0 signifie sans limite." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"le taux minimal de téléchargement en amont/en aval, en pourcentage, à " +"atteindre avant d'interrompre l'essaimage du dernier torrent. 0 signifie " +"sans limite." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Essaimer chaque torrent terminé indéfiniment (jusqu'à annulation par " +"l'utilisateur)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Essaimer le dernier torrent indéfiniment (jusqu'à annulation par " +"l'utilisateur)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "démarrer le téléchargeur en état de pause" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"spécifie le comportement de l'application lorsque l'utilisateur cherche " +"manuellement à démarrer un autre torrent : \"remplacer\" signifie toujours " +"remplacer le torrent par le nouveau, \"ajouter\" signifie ajouter le torrent " +"en cours en parallèle, et \"demander\" signifie demander à l'utilisateur à " +"chaque fois." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nom de fichier (pour torrent simple) ou nom de répertoire (pour torrents en " +"lots) sous lequel enregistrer le torrent, outrepassant le nom par défaut du " +"torrent. Voir aussi --sauvegarder_dans" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"le nombre maximum de téléchargements à autoriser en une fois. -1 signifie un " +"nombre raisonnable calculé à partir de --taux_de téléchargement_max. Les " +"valeurs automatiques ne s'appliquent que lorsqu'un seul torrent à la fois " +"est lancé." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"répertoire local dans lequel le torrent sera sauvegardé. Le fichier (torrent " +"simple) ou répertoire (torrent en lots) sera créé sous ce répertoire " +"utilisant le nom par défaut spécifié dans le fichier .torrent. Voir aussi -- " +"sauvegarder_sous" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "demander ou non l'emplacement pour enregistrer les fichiers" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"répertoire local dans lequel les torrents seront enregistrés, utilisant un " +"nom déterminé par le style \"enregistrer sous\". S'il est vide, chaque " +"torrent sera sauvegardé sous le répertoire correspondant au fichier .torrent." + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "intervalle de rescannage du répertoire en secondes" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Comment nommer les torrents téléchargés : 1 : utiliser le nom DU fichier " +"torrent (sans le .torrent) ; 2 : utiliser le nom encodé DANS le fichier " +"torrent ; 3 : créer un répertoire du nom DU fichier torrent (sans le ." +"torrent) et enregistrer dans ce repertoire en utilisant le nom encodé DANS " +"le fichier torrent ; 4 : si le nom DU fichier torrent (moins .torrent) est " +"identique au nom encodé DANS le fichier, utiliser ce nom (style 1/2), ou " +"créer un répertoire intermédiaire similaire à l'option 3 ; ATTENTION : les " +"options 1 et 2 sont à même d'écraser des fichiers sans avertissement et " +"peuvent présenter des problèmes de sécurité." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"choix d'affichage du chemin complet ou du contenu du torrent pour chaque " +"torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "répertoire où rechercher des fichiers .torrents (semi-récursif)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "choix d'affichage des infos de diagnostic vers stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "choix de deux moyens pour régler la taille de la part à" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nom du tracker par défaut" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"si faux, créer un torrent sans tracker, au lieu d'une URL d'annonce, " +"utilisez un noeud sérieux de la forme : ou une chaine vide pour " +"tirer des noeuds de votre table de routage" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "téléchargement terminé!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "Terminé dans %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "téléchargements réussis" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f Mo téléchargés en amont / %.1f Mo téléchargés en aval)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f Mo téléchargés en amont / %.1f Mo téléchargés en aval)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d vus actuellement, plus %d copies distribuées (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d de copies distribuées (suivant : %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d vus actuellement" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ERREUR :\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "sauvegarde de :" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "taille du fichier :" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "pourcentage effectué :" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "temps restant :" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "télécharger vers :" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "taux de téléchargement en aval :" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "taux de téléchargement en amont :" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "Taux de partage :" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "statut d'essaimage :" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "statut de pairs :" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "" +"Vous ne pouvez spécifier à la fois --enregistrer_sous et --enregistrer_dans" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "en cours d'arrêt" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Erreur de lecture de configuration :" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Erreur de lecture du fichier .torrent :" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "vous devez spécifier un fichier .torrent " + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"L'initialisation du mode texte GUI a échoué, le processus ne peut pas " +"s'exécuter." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Cette interface de téléchargement nécessite le module Python standard " +"\"curses\", lequel n'est malheureusement pas disponible pour le portage " +"windows natif de Python. Il est toutefois disponible pour le portage Cygwin, " +"tournant sur tous les systèmes win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Vous devriez utiliser \"bittorrent-console\" pour télécharger." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "fichier :" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "taille :" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "dest : " + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progression :" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "statut :" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "Vit. de téléchargement en aval :" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "Vit. de téléchargement en amont :" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "partage :" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "essaimages :" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "pairs :" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d vus actuellement, plus %d de copies distribuées(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "erreur(s) :" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "erreur:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Téléchargement en amont Téléchargement en " +"aval Terminé Vitesse" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" +"télécharge %d morceaux, a %d fragments, %d morceaux sur %d sont complètes" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Ces erreurs sont intervenues au cours de l'exécution:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Utilisation: %s URL_TRACKER [FICHIERTORRENT [FICHIERTORRENT ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "vieille annonce pour %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "pas de torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERREUR SYSTÈME - EXCEPTION GÉNÉRÉE" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Attention:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "n'est pas un répertoire" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"erreur: %s\n" +"s'exécute sans arguments pour le detail des paramètres" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEPTION:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" +"Vous pouvez encore utiliser \"btdownloadheadless.py\" pour télécharger." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "connexion aux pairs" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "ETA dans %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Taille" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Télécharger" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Envoyer" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totaux:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s pairs %s sessaimeurs %s copies distribuées - %s sortant %s " +"entrant" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "erreur:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"s'exécute sans arguments pour le detail des paramètres" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "commentaire intelligible optionnel à mettre dans le .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "fichier cible optionnel pour le torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - décode %s fichiers métainfos" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Usage: %s [FICHIERTORRENT [FICHIERTORRENT ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "fichier métainfos: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "info de hachage: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nom de fichier: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "taille du fichier:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "fichiers:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nom du répertoire: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "taille de l'archive: " + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "url d'annonce du tracker: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "noeuds sans tracker" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "commentaires:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Création du socket de contrôle impossible:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Envoi impossible de la commande:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Création impossible du socket de contrôle: déjà en cours d'utilisation" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Impossible d'enlever le nom de fichier de l'ancien socket de contrôle:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Mutex global déjà créé" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Impossible de trouver un port ouvert!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Ne peut pas créer le répertoire de données de l'application!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"N'a pas pu obtenir le verrouillage du mutex global pour le fichier de " +"contrôle des ports!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" +"Une précédente instance de BT n'a pas été terminée correctement. Reprise." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "chaine b encodée invalide " + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "valeur b encodée invalide (donnée à la suite du préfixe valide)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Usage: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPTIONS] [RÉPERTOIRETORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Si un argument pas en option est présent, il sera pris comme la valeur\n" +"de l'option répertoire de torrent.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPTIONS] [FICHIERTORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPTIONS] [FICHIERTORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPTION] FICHIER URL_TRACKER [FICHIER]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "les arguments sont -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(par défaut est " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "clé inconnue" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "le paramètre est arrivé à la fin sans aucune valeur" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "l'analyse de la ligne de commande a échouée à" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "L'option %s est requise." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Vous devez au mimimum fournir %d arguments." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Arguments trop nombreux - le maximum est %d." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "mauvais format de %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Sauvegarde permanente des options impossible:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "L'annonce du tracker reste incomplète %d secondes après son départ " + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problème lors de la connexion au tracker, erreur gethostbyname -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problème de connexion au tracker -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "mauvaises données du tracker -" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "rejeté par le tracker -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Interruption du torrent, rejeté par le tracker alors qu'il n'était connecté " +"à aucun pairs." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Message du tracker:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "avertissement du tracker -" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Lecture impossible du répertoire" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Pas de statistiques" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "retire %s (rajoutera)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**attention** %s est une copie du torrent pour %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**attention** %s contient des erreurs" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... avec succès" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "en cours de retrait %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "vérification faite" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "socket serveur perdu" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Erreur de prise en main des connexions acceptées:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Sortie obligatoire suite à l'endormissement de la pile TCP. Voyez la FAQ à %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Trop tard pour basculer de serveur Raw, %s a déjà été utilisé." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Lun" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Mer" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Jeu" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Ven" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sam" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Dim" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Fév" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Avr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Aoû" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Oct" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Déc" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Compressé : %i Non-compressé : %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Vous ne pouvez spécifier le nom d'un fichier .torrent lorsque vous générez " +"un fichier torrent multiple" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" +"L'encodage des fichiers système \"%s\" n'est pas supporté par cette version" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Conversion impossible du fichier/répertoire \"%s\" en utf-8 (%s). Soit " +"l'encodage \"%s\" du système de fichier est faux, soit le nom du fichier " +"contient des octets illégaux." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Le nom \"%s\" du fichier/répertoire contient des données unicode réservées " +"qui ne correspondent pas aux caractères." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "mauvaises données dans le fichier-réponse - total trop petit" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "mauvaises données dans le fichier-réponse - total trop grand" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "vérification des fichiers existants" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 ou les infos de la reprise rapide ne correspondent pas à " +"l'état du fichier (données manquantes)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" +"mauvaises info de la reprise rapide (le fichier contient plus de données)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Mauvaise info de reprise rapide (valeur illégale)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" +"données endommagées sur le disque - peut-être avez-vous deux copies tournant " +"simultanément ?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Lecture impossible des données de reprise rapide :" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"fichier told complet au démarrage, mais échec de la vérification du hash" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Le fichier %s appartient à un autre torrent en cours" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Le fichier %s existe déjà, mais ce n'est pas un fichier régulier" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lecture courte - fichier tronqué ?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Format de fichier de reprise rapide non-supporté, sans doute d'une autre " +"version du client ?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Un autre programme a déplacé, renommé ou supprimé le fichier." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Un autre programme semble avoir modifier le fichier." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Un autre programme semble avoir modifier la taille du fichier." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Support impossible du réglage signal :" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "annulé \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "ajouté \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "en attente de la vérification, du hachage" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "En téléchargement" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "relecture du fichier config" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "N'a pas pu lire %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"N'a pas pu télécharger ou ouvrir \n" +" %s\n" +"Essayez d'enregister le fichier torrent cible sur le disque dur." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Ceci est une vieille version de Python laquelle ne supporte pas la détection " +"de l'encodage du système de fichier. C'est à dire 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python a échoué à détecter l'encodage du système de fichier. Utilise 'ascii' " +"à la place." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"L'encodage du système de fichier '%s' n'est pas supporté. Utilise 'ascii' à " +"la place" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Mauvais composant du chemin du fichier :" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Ce .torrent a été encodé avec un outil défectueux et a encodé les noms des " +"fichiers incorrectement. Certains ou tous les noms de fichiers peuvent " +"apparaître incorrectement." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Ce .torrent a été créé avec un outil défectueux et possède des valeurs de " +"caractères qui ne correspondent pas aux vrais caractères. Certains ou tous " +"les noms de fichiers peuvent apparaître incorrectement." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Ce .torrent a été créé avec un outil défectueux et a encodé les noms des " +"fichiers incorrectement. Les noms de fichiers peuvent cependant être " +"corrects." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Le jeu de caractère utilisé dans le système de fichier local (\"%s\") ne " +"peut représenter tous les caractères utilisé dans les noms de fichiers de ce " +"torrent. les noms de fichiers ont été modifié par rapport à l'original." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Le système de fichier de windows ne supporte pas certains caractères utilisé " +"pour nommer les fichiers de ce torrent. Les noms des fichiers ont été " +"modifié." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Ce fichier .torrent a été créé avec un outil défectueux et au moins 1 " +"fichier ou un répertoire a un nom incorrect. Toutefois, vu que ces fichiers " +"sont désignés par une longueur de 0, ils seront juste ignorés." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Python 2.2.1 ou plus récent requis" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Ne peut démarrer deux occurences séparées d'un même torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "port maxi inférieur au port mini - aucun port à vérifier" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Impossible d'ouvrir un port d'écoute : %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Impossible d'ouvrir un port d'écoute : %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Vérifiez votre plage de réglage." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Démarrage inital" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Ne peut pas charger les données de reprise rapide: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Va effectuer une vérifiaction complète du hachage." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "vérification du hachage de la pièce %d a échouée-rechargez-la" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Tentative de téléchargement d'un torrent sans tracker avec un client dont la " +"fonctionnalité est désactivé." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "Échec du téléchargement :" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Erreur E/S : Plus assez d'espace disque, ou ne peut créer un fichier aussi " +"grand :" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "tué par une erreur d'E/S" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "tué par une erreur d'OS" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "tué par une exception interne :" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Erreur additionnelle à la fermeture à cause d'une erreur :" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Impossible d'ôter le fichier de reprise rapide suite à une erreur :" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "essaimage" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Écriture impossible de données de reprise rapide :" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "exctinction" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "mauvaise méta-infos - pas un dictionnaire" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "mauvaise méta-infos - mauvaise clé de morceau" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "mauvaise méta-infos - longueur de pièces illégale" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "mauvaise méta-infos - nom incorrecte" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "nom %s refusé pour raison de sécurité" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "mélange de fichier simple/multiple" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "mauvaise méta-info - mauvaise longueur" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "mauvaise méta-info - \"fichiers\" n'est pas une liste de fichiers" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "mauvaise méta-info - mauvaise valeur de fichier" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "mauvaise méta-info - mauvais chemin" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "mauvaise méta-info - mauvais chemin de répertoire" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "chemin %s refusé pour raison de sécurité" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "mauvaise méta-info - chemin dupliqué" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "mauvaise méta-info - nom utilisé dans deux fichiers et sous-répertoire" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "mauvaise méta-info - type d'objet incorrect" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "mauvaise méta-info - aucune chaine d'annonce URL" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "raison d'échec non textuelle" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "message d'alerte non textuel" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "entrée invalide dans la liste 1 des pairs" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "entrée invalide dans la liste 2 des pairs" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "entrée invalide dans la liste 3 des pairs" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "entrée invalide dans la liste 4 des pairs" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "Liste de pairs invalide" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "intervalle d'annonce incorrect" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "intervalle minimum d'annonce incorrect" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "id de tracker incorrecte" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "compte de pairs incorrect" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "compte d'essaim incorrect" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"dernière\" entrée incorrecte" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Port en écoute" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "fichier dans lequel stocker les infos du téléchargeur" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "délai de fermeture de connections" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "secondes entre sauvegarde de dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "secondes entre l'expiration des téléchargeurs" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "le second téléchargeur devraient attendre entre les re-annonces" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"valeur par défaut de pairs où envoyer un message d'information au cas où le " +"client n'ai pas spécifié de valeur" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "délai d'attente entre deux vérifications de fermeture des connections" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"fréquence de vérification si le téléchargeur est derrière un NAT (0=pas de " +"vérification)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "Choix d'ajout des entrées du journal pour vérif des résultats du NAT" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" +"un temps minimum est nécessaire depuis le dernier flush pour en faire un " +"autre" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "durée minimum avant qu'un tampon soit considéré rassis et soit nettoyé" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"Autoriser seulement les téléchargements de .torrents dans ce répertoire (et, " +"recursivement, dans les sous-répertoires des répertoires qui n'ont pas de " +"fichiers .torrent eux-mêmes).Si autorisé, les torrents de ce répertoire " +"seront affiché dans la page info/scrape, qu'ils aient des pairs ou non" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"autoriser les toutches spéciales dans le allowed_dir pour avoir un accès au " +"tracker" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "Choix de réouverture du fichier journal à la réception d'un signal HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"coix de l'afichage d'une page d'info lorsque le répertoire racine du tracker " +"est chargé" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "une URL vers laquelle rediriger la page info" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "choix d'affichage des noms des répertoires autorisés" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"fichier conetnant des données x-icon à renvoyer lorsque le navigateur " +"requiert favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"Ignorer le paramètre IP GET des machines qu ne sont pas sur l'IP du réseau " +"local (0=jamais, 1=toujours, 2=ignorer si la vérif NAT est indisponible). " +"Les en-têtes proxy HTTP donnant l'adresse originale du client sont traitées " +"à l'identique que les --IP." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"Fichier utilisé pour écrire le journal des trackers, utile pour stdout " +"(défaut)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"utilisé avec allowed_dir; ajoute une URL /file?hash={hash} qui permet aux " +"utilisateurs de télécharger le fichier torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"conserver les torrents morts après leur expiration (ils resteront donc " +"affichés dasn le /scrape et pages web). Seulement si allowed_dir n'est pas " +"réglé." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "accès scrape autorisé(s) (peut être aucun, spécifique ou entier)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "maximum de pairs pour une requête" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"votre fichier existe peut-être aillleurs dans l'univers\n" +", mais hélas, pas ici\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**attention** fichier favicon spécifié--%s-- n'existe pas." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**attention** état du fichier %s endommagé; remise à zéro" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Journal Démarré : " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**attention redirection stdout vers fichier journal impossible" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Journal réouvert :" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**attention** réouverture du fichier-journal impossible" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "la fonction scrape spécifique n'est pas disponible avec ce tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "la fonction scrape full n'est pas disponible avec ce tracker." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "la fonction get n'est pas disponible avec ce tracker." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"L'utilisation du téléchargement requis n'est pas autorisé avec ce tracker" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "nécessite aucun arguments comme paramètres d'explication" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Extinction" diff --git a/locale/gr/LC_MESSAGES/bittorrent.mo b/locale/gr/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..67b026e4279260026907e166f091a6325c42e79f GIT binary patch literal 37324 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 literal 0 HcmV?d00001 diff --git a/locale/gr/LC_MESSAGES/bittorrent.po b/locale/gr/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..995b10d --- /dev/null +++ b/locale/gr/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2747 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-10-20 21:34-0700\n" +"Last-Translator: Nikolaos Gryspolakis \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Εγκαταστήστε την Python 2.3 ή μια πιο πρόσφατη έκδοσή του" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Απαιτεί το PyGTK 2.4 ή μια πιο πρόσφατη έκδοσή του" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Δώστε την διεύθηνση (URL) του torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Δώστε την διεύθηνση (URL) για το άνοιγμα αρχείου torrent:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "Σύνδεση μέσω τηλεφώνου" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cable 128k ανέβασμα" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cable 256k ανέβασμα" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k ανέβασμα" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Μέγιστη ταχύτητα αποστολής:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Παύση όλων των torrents" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Eπανέναρξη του κατεβάσματος" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Παύση" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Δεν υπάρχουν torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Σε κανονική λειτουργία" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Πίσω απο πυρότοιχο (Firewalled)/NATted" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Καινούργια διαθέσιμη έκδοση %s" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Υπάρχει νέα διαθέσημη έκδοση του %s. \n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Χρησιμοποιείτε την %s και η νέα έκδoση είναι %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Μπορείτε να βρείτε την νεότερη έκδοση στο \n" +" %s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Αποφόρτωση_αργότερα" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Άμεση Αποφόρτωση" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "Υπενθυμίστε το μου αργότερα" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Σχετικά με %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Δοκιμαστική έκδοση" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Έκδοση %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Δεν ήταν δυνατό το άνοιγμα %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Κάντε δωρεά" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Log ενεργειών" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Αποθήκευση του log στο:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "το log αποθηκεύτηκε" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "το log διεγράφει" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Ρυθμίσεις" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Αποθηκεύεται" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Αποθήκευση νέων αποφορτώσεων στο:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Αλλαγή..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Να ερωτάσθε πού να αποθηκευτεί κάθε νέα αποφόρτωση" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Αποφορτώνει" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Εκκίνηση επιπλέον torrent χειροκίνητα:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Πάντα σταματά το _τελευταίο τρέχον torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Πάντα αρχίζει το torrent _παράλληλα" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Να ερωτώμαι κάθε φορά" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Διαμοίραση / Σπορά" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Διαμοίραση / σπορά torrent: Μέχρι το ποσοστό να φτάσει [_] % ή για [_] " +"λεπτά, όποιο από τα δυο επέλθει πρώτο." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Διαμοίραση/σπορά επ'αόριστον" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "Διαμοίραση/σπορά τελευταίου torrent: Μέχρι το ποσοστό να φτάσει [_] %." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Δίκτυο" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Κοίταξε για διαθέσιμες θύρες:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "αρχίζοντας απο την θύρα:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP για αναφορά στον tracker:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Δεν έχει καμία επίδραση εκτός αν είστε\n" +" στο ίδιο τοπικό δίκτυο με τον tracker)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Το κείμενο ράβδου προόδου είναι πάντα μαύρο\n" +" (απαιτεί επανεκκίνηση)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Διάφορα" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ΠΡΟΣΟΧΗ:Η αλλαγή αυτών των ρυθμίσων\n" +"μπορεί να αποτρέψει %s από το να λειτουργήσει σωστά." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Επιλογή" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Τιμή" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Για προχωρημένους" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Επιλογή προεπιλεγμένου καταλόγου επιφόρτωσης" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Αρχεία στο \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Εφαρμογή" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Διαθέση" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Να μην γίνει ποτέ αποφόρτωση" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Μείωση " + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Αύξηση" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Όνομα αρχείου" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Μήκος" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Χρήστες για \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Διεύθυνση IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Τερματικό" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Σύνδεση" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s κατέβασμα" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s ανέβασμα" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB αποφορτώθηκαν" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB επιφορτώθηκαν" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% πλήρης" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s περίπου αποφόρτωσης ανα χρήστη" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Ταυτότης χρήστη" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Ενδιαφερόμενος" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Πνιγμένος" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Επιπληγμένος" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Αισιόδοξη επιφόρτωση" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "μακρινός" + +#: bittorrent.py:1358 +msgid "local" +msgstr "τοπικός" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "κακή σύνδεση με χρήστη" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d εντάξει" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d κακό" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "αποκλεισμένος" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "εντάξει" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Πληροφορίες για \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Όνομα torrent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent χωρίς ιχνηλάτη)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Ανακοινώστε διεύθηνση (url):" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", σε ένα αρχείο" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", σε %d αρχεία" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Συνολικό μέγεθος:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Κομμάτια:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Πληροφορία hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Αποθήκευση στο:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Όνομα αρχείου:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Άνοιγμα καταλόγου" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Εμφάνιση καταλόγου αρχείων" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "Σύρετε για επαναδιάταξη" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "Kάντε δεξί κλικ για εμφάνιση του μενού" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Πληροφορίες torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Αφαίρεση torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Ακύρωση torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", θα διαμοιράζεται για %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", θα διαμοιράζεται επ'αόριστον." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Ολοκληρώθηκε, μοιραζόμενη αναλογία: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Ολοκληρώθηκε, %s επιφορτώθηκε" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Ολοκληρώθηκε" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Πληροφορίες torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "Άνοιγμα _καταλόγου" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Λίστα αρχείου" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Κατάλογος _Χρηστών" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Αλλαγή τοποθεσίας" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Διαμοίραση/Σπορά επ'αόριστον" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Επαν_εκκίνηση" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "Τέλος" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Αφαίρεση" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Αποβολή" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Είστε σίγουρος ότι θέλετε να αφαιρέσετε το \"%s\";" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Το ποσοστό διαμοίρασης σας του torrent είναι %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Έχετε επιφορτίσει %s σε αυτό το torrent." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Αφαίρεση αυτού του torrent;" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Τέλος" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "σύρατε στην λίστα για διαμοίραση" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Απέτυχε" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "σύρτε στον κατάλογο για επανάληψη" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Αναμονή" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Εν λειτουργία" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Τρέχον πάνω: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Τρέχον κάτω: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Προηγούμενος πάνω: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Προηγούμενος κάτω: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Μοιραζόμενη αναλογία:%0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s χρήστες, %s διαμοιραστές. Σύνολα απο ιχνηλάτη:%s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Διανεμημένα αντίγραφα: %d;Επόμενο: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Κομμάτια: %d σύνολο, %d πλήρης, %d μερικώς, %d ενεργό (%d κενό)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d καταστραμένα κομμάτια+ %s σε απορριπτόμενα αιτήματα" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% ολοκληρώθηκαν, %s απομένουν" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Ρυθμός αποφόρτωσης" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Ρυθμός επιφόρτωσης" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "ΝΑ" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s ξεκίνησε" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Άνοιγμα αρχείου torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Άνοιγμα torrent _URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Δημιουργία _νέου torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Παύση/Αναπαραγωγή" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Έξοδος" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Εμφάνιση/Απόκρυψη_ολοκληρωμένων torrent" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Επαναρύθμιση παραθύρου" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Ιστορικό" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Ρυθμίσεις" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Βοήθεια" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Σχετικά με" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Κάντε δωρεά" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Αρχείο" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Εμφάνιση" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Έρευνα για torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(σταματημένο)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(πολλαπλάσιος)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Ήδη κατεβαίνουν %s του αρχείου εγκατάστασης" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Εγκατάσταση καινούργιας έκδοσης %s τώρα;" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "" +"Θέλετε να τερματίσετε την %s και να εγκαταστήσετε την καινούργια έκδοση, %s, " +"τώρα;" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s βοήθεια είναι στο\n" +"%s\n" +"Θέλετε να πάτε εκεί τώρα;" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Επίσκεψη ιστοσελίδας βοήθειας;" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Υπάρχει ένα ολοκληρωμένο torrent στη λίστα." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Θέλετε να το αφαιρέσετε;" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Υπάρχουν %d ολοκληρωμένα torrent στη λίστα." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Θέλετε να τα αφαιρέσετε όλα;" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Αφαίρεση όλων των ολοκληρωμένων torrents?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Κανένα ολοκληρωμένο torrent" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Δεν υπάρχουν ολοκληρωμένα torrent για αφαίρεση." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Άνοιγμα torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Αλλάξτε την τοποθεσία αποθήκευσης για" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Το αρχείο υπάρχει!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "" +"Το \"%s\" ήδη υπάρχει. Θέλετε να διαλέξετε ένα διαφορετικό όνομα αρχείου;" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Αποθήκευση τοποθεσίας για" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Ο φάκελος υπάρχει!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" ήδη υπάρχει. Σκοπεύετε να δημιουργήσετε ένα πανομοιότυπο, αντίγραφο " +"του φακέλου μέσα στον υπάρχον φάκελο;" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(σφαιρικό μήνυμα): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Σφάλμα" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Πολλαπλά αφάλματα έχουν προκύψει. Πατήστε ΕΝΤΑΞΕΙ για να δείτε το " +"ιστορικόσφάλματος." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Να σταματήσει το torrent;" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Πρόκειται να αρχίσετε το \"%s\". Θέλετε επίσης να διακόψετε τη λειτουργία " +"του τελευταίου torrent;" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Κάνατε δωρεά;" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Καλωσήρθατε στη νέα έκδοση %s. Κάνατε δωρεά;" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Ευχαριστούμε!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Ευχαριστούμε για τη δωρεά! Για να ξανακάνετε δωρεά, επιλέξτε \"Δωρεά\" από " +"το μενού \"Βοήθεια\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "Ανεπιθύμητο. Παρακαλώ μη χρησιμοποιείτε." + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Αποτυχία δημιουργίας ή αποστολής εντολής μέσω της υπάρχουσας υποδοχής " +"ελέγχου." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Το πρόβλημα μπορεί να λυθεί, αν κλείσετε όλα τα %s παράθυρα." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s ήδη σε εξέλιξη." + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Αποτυχία αποστολής εντολής μέσω της υπάρχουσας υποδοχής ελέγχου." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Αποτυχία έναρξης του TorrentQueue, δες παραπάνω για σφάλματα." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s Δημιουργός αρχείου torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Δημιουργία αρχείου torrent για αυτό αρχείο ή κατάλογο:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Επιλέξτε..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Οι κατάλογοι θα γίνουν torrents δέσμης)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Μέγεθος μέρους:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Χρήση _ιχνηλάτη:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Χρήση _DHT (μη κεντρικού δικτύου):" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Δικτυακές συσκευές (προαιρετικό):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Σχόλια:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Εκτέλεση" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Oικοδεσπότης" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Θύρα" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Δημιουργία torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Έλεγχος μεγέθους αρχείων..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Εκκίνηση διαμοίρασης" + +#: maketorrent.py:540 +msgid "building " +msgstr "δημιουργία" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Ολοκληρώθηκε." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Η δημιουργία των torrents ολοκληρώθηκε." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Σφάλμα!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Σφάλμα στη δημιουργία των torrents:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d ημέρες" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 ημέρα, %d ώρες" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d ώρες" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d λεπτά" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d δευτερόλεπτα" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 δευτερόλεπτα" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Βοήθεια" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Συχνές ερωτήσεις:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Εκκίνηση" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Επιλέξτε έναν ήδη υπάρχοντα φάκελο..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Όλα τα αρχεία" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Δημιουργία νέου φακέλου..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Επιλέξτε ένα αρχείο" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Επιλέξτε ένα φάκελο" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Αδυναμία φόρτωσης αποθηκευμένης κατάστασης:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Αδυναμία αποθήκευσης κατάστασης UI:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Άκυρα περιεχόμενα κατάστασης αρχείου" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Σφάλμα ανάγνωσης αρχείου" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "Αδυναμία πλήρους αποκατάστασης της κατάστασης" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Αρχείο άκυρης κατάστασης (διπλή εισαγωγή)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Αλλοιωμένα δεδομένα σε" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", αδυναμία αποκατάστασης torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Αρχείο άκυρης κατάστασης (λανθασμένη εισαγωγή)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Λανθασμένο αρχείο κατάστασης UI" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Λανθασμένη έκδοση αρχείου κατάστασης UI" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Μη υποστηριζόμενη έκδοση αρχείου κατάστασης UI (ίσως από νεώτερη έκδοση του " +"client)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Αδυναμία διαγραφής του cached %s αρχείου:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Αυτό δεν είναι έγκυρο αρχείο torrent. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Αυτό το torrent (ή ένα με τα ίδια περιεχόμενα) είναι ήδη ενεργό." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Αυτό το torrent (ή ένα με τα ίδια περιεχόμενα) ήδη περιμένει να " +"ενεργοποιηθεί." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent σε άγνωστη κατάσταση %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Αδυναμία εγγραφής αρχείου" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"Το συγκεκριμένο torrent δεν θα επανεκκινήσει σωστά με την επανεκκίνηση του " +"client." + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Δεν μπορούν να τρέξουν περισσότερα από %d torrents ταυτόχρονα. Για " +"περισσότερες πληροφορίες δείτε τις Συχνές Ερωτήσεις στο %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Δεν γίνεται η εκκίνηση του torrent επειδή ήδη συμπλήρωσε τις ρυθμίσεις που " +"υπάρχουν για το πότε να τερματίσει την διαμοίραση του και επειδή υπάρχουν " +"ήδη άλλα torrents που περιμένουν στην ουρά για εκκίνηση." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Δεν γίνεται η εκκίνηση του torrent επειδή ήδη συμπλήρωσε τις ρυθμίσεις του " +"για το πότε να στματήσει να διαμοιράζει το πιο πρόσφατο ολοκληρωμένο torrent." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Αποτυχία ανάκτησης της καινούργιας έκδοσης απο %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Αποτυχία προσπέλασης έκδοσης παραμέτρου από %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Αποτυχία εύρεσης κατάλληλης τοποθεσίας αποθήκευσης για τον %s %s εφαρμοστή." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Δεν υπάρχει διαθέσιμο αρχείο torrent για τον %s %s εφαρμοστή" + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "" +"%s %s του αρχείου εγκατάστασης φαίνεται να είναι κατεστραμένο ή λείπει." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Αποτυχία εκκίνησης του εφαρμοστή σε αυτή την πλατφόρμα συστήματος." + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"Ο κατάλογος όπου τα μεταβλητά δεδομένα όπως πληροφορίες γρήγορης εκκίνησης ή " +"η κατάσταση GUI αποθηκεύονται. Προεπιλέγεται στον υποκατάλογου \"δεδομένα\" " +"του καταλόγου διαμόρφωσης bittorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"η κωδικοποίηση χαρακτήρων χρησημοποιείται στο τοπικό σύστημα φακέλων. Αν " +"αφεθεί κενό, θα εντοπιστεί αυτόματα. Ο αυτόματος εντοπισμός δεν λειτουργεί " +"σε εκδόσεις του python παλιότερες της 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "κωδικός γλώσσας ISO για χρήση" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"Διαδυκτιακή διεύθηνση IP προς αναφορά στον διακομιστή (σημαντικό μόνον εάν " +"βρίσκεσται στο ίδιο δίκτυο με τον διακομιστή)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"Αριθμός φανερής θύρας εάν είναι διαφορετικός απο την τοπική θύρα εισόδου του " +"τερματικού" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"η μικρότερη θύρα προς χρήση. Σε περίπτωση που δεν είναι διαθέσιμη θα " +"χρησιμοποιηθεί η επόμενη μεγαλύτερη θύρα" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "Μέγιστος αριθμός θύρας προς χρήση" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "Τοπική διαδικτυακή διεύθηνση" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "Καθυστέριση μεταξύ ανανεώσεων σε δευτερόλεπτα" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "Λεπτά αναμονής πριν την αναζήτηση νέων τερματικών" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "ελάχιστος αριθμός τερματικών για την μή αναζήτηση νέων" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "μέγιστος αριθμός τερματικών" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "Μέγιστος αριθμός επιτρεπόμενων συνδέσεων" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "Έλεγχος εγκυρότητος των εισερχόμενων πληροφοριών στον σκληρό δίσκο" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "Μέγιστος ρυθμός ανεβάσματος kb/δευτ. Για ανέβασμα χωρίς όρια βάλτε 0" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "Αριθμός ανεβασμάτων προς ικανοποίηση" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"Μέγιστος αριθμός ανοικτών αρχείων εντός ενός τόρρεντ. Για την μη επιβολή " +"ορίου βάλτε 0." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "Ενεργοποίηση κατεβάσματος αρχείων χωρίς την χρήση ιχνηλάτη" + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"Αριθμός δευτερολέπτων μεταξύ αποστολής σήματος ότι το τερματικό είναι ενεργό" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "Πόσα bytes να ζητηθούν ανά αίτηση" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"Μέγιστο αποδεκτό μέγεθος κωδικοποίησης. Μεγάλες τιμές μειώνουν την ταχύτητα" + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "Χρόνος σε δευτερόλεπτα μεταξύ κλεισίματος ανενεργών συνδέσεων" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "Χρόνος σε δευτερόλεπτα μεταξύ ελέγχων για νεκρές συνδέσεις" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"Μέγιστο μέγεθος πληροφορίας προς αποστολή στα άλλα τερματικά. Εάν υπάρξει " +"μεγαλύτερη αίτηση η σύνδεση θα κλείσει" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"Περίοδος μεταξύ διαδοχικών υπολογισμών ταχυτήτων ανεβάσματος και κατεβάσματος" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "Μέγιστη περίοδος μεταξύ υπολογισμών ρυθμού σποράς" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "Μέγιστος χρόνος μεταξύ ανακοινώσεων" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"Μέγιστος χρόνος αναμονής πριν την διακύρηξη της σύνδεσης ώς κεκορεσμένης" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"Αριθμός συνδέσεων μετά τις οποίες η προταιρεότητα αλλάζει απο τυχαία σε ανα " +"σπανιότητα" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "πόσα bytes να γράφονται στην λανθάνουσα μνήμη του δικτύου" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "Διακοπή συνδέσεων που αποστέλουν λάθος δεδομένα επανηλλημένως" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "Απαγόρευση σύνδεσης σε πολλαπλά τερματικά που έχουν την ίδια διεύθηνση" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"Ενεργοποίηση λύσης στο πρόβλημα αργής ανάγνωσης απο τον δίσκο στο " +"λειτουργικό σύστημα BSD" + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "Διεύθυνση ενδιάμεσου διακομιστή προς χρήση απο τον ιχνηλάτη" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "Διακοπή συνδέσεων με το RST και αποφυγή τροπη σε TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Χρήση τρεπόμενων δικτύων βιβλιοθηκών για συνδέσεις. 1 για χρήση, 0 για μη " +"χρήση, -1 για αυτόματη χρήση" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"Όνομα αρχείου ή υποκαταλόγου για σώσιμο των τόρρεντ. Εάν μείνει κενό ο " +"χρήστης θα ερωτάται κάθε φορά" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "Προβολή διεπαφής για προχωρημένους " + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "Μέγιστος χρόνος σποράς ενός ολοκληρομένου τόρρεντ" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"Ελάχιστος λόγος ανεβάσματος/κατεβάσματος επι τοις εκατό,προς επίτευξη πριν " +"την παύση της σποράς/διαμοιρασμού. 0 σημαίνει κανένα όριο" + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"Ελάχιστος λόγος ανεβάσματος/κατεβάσματος επι τοις εκατό, προς επίτευξη πρίν " +"την παύση σποράς/διαμοιρασμού του τελευταίου τόρρεντ. 0 σημαίνει κανένα όριο" + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Διαμοιρασμός/σπορά όλων των ολοκληρωμένων τόρρεντ επάπειρον, μέχρις την " +"ακύρωση τους απο τον χρήστη" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Διαμοιρασμός/σπορά του τελευταίου ολοκληρωμένου τόρρεντ επάπειρον, μέχρις " +"την ακύρωση τους απο τον χρήστη" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "Έναρξη με τα τόρρεντ σε παύση" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"Αντικατάσταση: Αντικατάσταση του τρέχωντος τόρρεντ με το νέοΠρόσθεση: " +"Παράλληλη εκτέλεση των τόρρεντΕρώτηση: Ρώτα τον χρήστη κάθε φορά" + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "" + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Χρήση:%s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "λάθος format %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Αρχική εκκίνηση" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Επιπλέον σφάλμα στο κλείσιμο λόγο σφάλματος:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Αδυναμία αφαίρεσης αρχείου γρήγορης επαναφοράς λόγο σφάλματος:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "διαμοίραση" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Αδυναμία εγγραφής δεδομένων επαναφοράς:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "κλείσιμο" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "" diff --git a/locale/hu/LC_MESSAGES/bittorrent.mo b/locale/hu/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..b725f8c09f95233b2cbee078e8c0cd8eb43e01ae GIT binary patch literal 64504 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 literal 0 HcmV?d00001 diff --git a/locale/hu/LC_MESSAGES/bittorrent.po b/locale/hu/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..2fa9ddc --- /dev/null +++ b/locale/hu/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2897 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-15 05:38-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: Hungarian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Kérem telepítse a Python 2.3-as vagy újabb verzióját" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "A PyGTK 2.4-es vagy újabb verziója szükséges" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Torrent URL megadása" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Adja meg a megnyitni kívánt torrent URL-jét:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "analóg telefonvonal" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "ADSL/kábel, 128k-tól" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "ADSL/kábel, 256k-tól" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "ADSL, 768k-tól" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maximális feltöltési sebesség:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Az összes futó torrent ideiglenes leállítása" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "A letöltés folytatása" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Szünetel" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Torrent nincs." + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Normál működés" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Tűzfal vagy NAT aktív" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Új %s-verzió jelent meg" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Megjelent a/az %s egy új változata.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Most ezt használja: %s, és az új verzió: %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"A legújabb változat mindig letölthető innen:\n" +"%sról/ről." + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "_Letöltés később" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Le_töltés most" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Emlékeztetés később" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Névjegy: %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Béta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Verzió: %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Nem sikerült megnyitni: %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Adomány küldése" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Műveletnapló - %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "A napló mentése ide:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "a napló elmentve" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "a napló törölve" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Beállítások: %s" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Mentés" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Új letöltések mentése ide:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Módosítás..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Rákérdezés minden új letöltés helyére" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Letöltés" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "További torrent kézi indítása esetén:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Az _utolsó aktív torrentet leállítja" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Mindig _párhuzamosan indítja a torrentet" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Rákérdezés mindig" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Megosztás" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"A befejezett torrentek maradjanak megosztva: amíg a megosztási arány eléri a" +"(z) [_] százalékot, illetve [_] percig, amelyik előbb bekövetkezik." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Megosztás korlátlan ideig" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Az utolsó befejezett torrent maradjon megosztva: amíg a megosztási arány " +"eléri a(z) [_] százalékot." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Hálózat" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Szabad port keresése:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "Kezdőport: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "A trackernek (követőnek) jelentett IP-cím:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Csak akkor van hatása, ha ugyanazon a helyi hálózaton\n" +"van a gép a követővel)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Az állapotjelző szövege mindig fekete\n" +"(újraindítás szükséges)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Egyéb" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"FIGYELEM: ha megváltoztatja ezeket a/az\n" +" beállításokat, akkor lehet, hogy a/az %s nem fog megfelelően működni." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opció" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Érték" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Magasabb rendű" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Válassza ki az alapértelmezett letöltési könyvtárat" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Fájlok itt: \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Alkalmazás" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Lefoglalás" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Letöltés: soha" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Csökkentés" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Növelés" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Fájlnév" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Hossz" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Partnerek - \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP-cím" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Ügyfél" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Kapcsolat" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s le" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s fel" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB letöltve" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB feltöltve" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% kész" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s becsült letöltés a partnerekről" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Partnerazonosító" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Érdeklődő" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Akadozik" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Teljesen lelassult" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimista feltöltés" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "távoli" + +#: bittorrent.py:1358 +msgid "local" +msgstr "helyi" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "hibás partner" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d OK" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d rossz" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "kitiltva/letiltva" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "OK" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "\"%s\" jellemzői" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrentnév:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(követő nélküli torrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Bejelentési URL:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr "(1 fájl)" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr "(%d fájl)" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Teljes méret:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Darabok:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Hasítóérték:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Ide mentse el:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Fájlnév:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "A könyvtár megnyitása" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "A fájllista megjelenítése" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "átrendezés: húzással" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "a menü előhívásához kattintson a jobb egérgombbal" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrentjellemzők" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Torrent eltávolítása" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "A torrent megszakítása" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", megosztva marad még eddig: %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", korlátlan ideig megosztva marad." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Kész, megosztási arány: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Kész, %s feltöltve" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Kész" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "A torrent _jellemzői" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "A könyvtár _megnyitása" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Fájllista" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Partnerlista" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "A hely mó_dosítása" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "Megosztás _korlátlan ideig" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Új_raindítás" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Befejezés" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Eltávolítás" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "Me_gszakítás" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Feltétlenül el szeretné távolítani ezt: \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "A megosztási arány ennél a torrentnél: %d%% " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "A feltöltés ebbe a torrentbe befejeződött : %s. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Eltávolítja ezt a torrentet?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Befejezve" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "húzza át a listába, ha szeretné megosztani" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Hiba" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "húzza át a listába, ha folytatni szeretné" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Várakozik" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Fut" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Jelenleg fel: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Jelenleg le: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Előző fel: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Előző le: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Megosztási arány: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s partner, %s megosztás. Összesen a követőtől: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Szétosztott másolatok száma: %d, következő: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Darabok: összesen %d, %d kész, %d részleges, %d aktív (%d üres)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d hibás darab + %s az eldobott kérésekben" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% kész, %s van hátra" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Letöltési sebesség" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Feltöltési sebesség" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "-" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "A %s elindult" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Torrentfájl megnyitása" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Torrent URL megny_itása" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Ú_j torrent készítése" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Szünet/Folytatás" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Kilépés" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "A befejezett torrentek m_utatása/rejtése" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "Az ablak méretének ki_igazítása" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Napló" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Beállítások" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Súgó" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Névjegy" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Adomány küldése" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Fájl" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "Né_zet" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Torrentek keresése" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(leállt)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(többszörös)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Már folyik a/az %s telepítő letöltése" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Szeretne most új %s alkalmazást telepíteni?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "" +"Ki szeretne most lépni a(z) %s alkalmazásból, hogy feltelepítse az új %s " +"programváltozatot?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"A/az %s súgó itt érhető el:\n" +"%s\n" +"Meg szeretné nyitni az oldalt?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "A súgóként használható dokumentációs weblapra rá szeretne menni?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Egy befejezett torrent szerepel a listán. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "El szeretné távolítani?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "%d már befejezett torrent szerepel a listán. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "El szeretné távolítani az összeset?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "El szeretné távolítani az összes befejezett torrentet?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Nincs befejezett torrent" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Nincs eltávolítható, már befejezett torrent." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Torrent megnyitása:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "A mentési hely megváltoztatása " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Már van ilyen fájl!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" már van. Szeretne más fájlnevet választani?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Mentési hely: " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Már van egy ilyen könyvtár." + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" már van. Létre szeretne hozni egy ugyanilyen nevű könyvtárat a már " +"létező könyvtáron belül?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globális üzenet): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s-hiba" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Több hiba is történt. Kattintson az OK gombra a hibanapló megtekintéséhez." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Le szeretné állítani a futó torrentet?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"\"%s\" indítására készül. Le szeretné állítani az utolsó futó torrentet is?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Küldött már adományt?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Üdvözöljük a %s új verziójában! Küldött már adományt?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Köszönjük!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Adományát köszönjük! Ha további adományt szeretne küldeni, használja az " +"\"Adomány küldése\" menüpontot a \"Súgó\" menüben." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "elavult, kérjük ne használja" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Nem sikerült létrehozni vagy elküldeni egy parancsot a már létrehozott " +"vezérlőaljazaton keresztül." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Lehet, hogy az összes %s ablak bezárása megszünteti a hibát." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s már fut" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "" +"Nem sikerült elküldeni egy parancsot a már létrehozott vezérlőaljzaton " +"keresztül." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Nem sikerült elindítani a TorrentQueue-t, lásd a fenti hibaüzenetet." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrentfájlkészítő %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Torrentfájl létrehozása ehhez a fájlhoz vagy könyvtárhoz:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Tallózás..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(A könyvtárak több fájlt tartalmazó torrentekhez tartoznak)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Darabméret:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Kö_vető használata:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "_DHT használata" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Csomópontok (opcionális):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Megjegyzések:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Elkészítés" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Gépnév" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Torrentek felépítése..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "A fájlméretek ellenőrzése..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "A publikáció megkezdése" + +#: maketorrent.py:540 +msgid "building " +msgstr "felépítés " + +#: maketorrent.py:560 +msgid "Done." +msgstr "Kész." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "A torrentek felépítése befejeződött." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Hiba!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Hiba történt a torrentek felépítésekor: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d nap" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 nap %d óra" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d óra" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d perc" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d másodperc" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 másodperc" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "Súgó - %s" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Gyakran feltett kérdések:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Ugrás" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Válasszon ki egy könyvtárat..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Minden fájl" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrentek" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Új könyvtár létrehozása..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Fájlválasztás" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Könyvtárválasztás" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Nem sikerült betölteni az elmentett állapotot: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Nem sikerült elmenteni a kezelőfelület állapotát: " + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Érvénytelen tartalmú állapotleíró fájl" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Hiba történt egy fájl olvasásakor " + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "nem lehet teljesen visszatölteni az állapotot" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Érvénytelen állapotfájl (ugyanaz a bejegyzés mégyegyszer)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Hibás adatok itt: " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", nem lehet visszaállítani a torrentet (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Érvénytelen állapotfájl (hibás bejegyzés)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Érvénytelen felületleíró állapotfájl" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "A felület állapotleíró fájlja hibás verziójú" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Nem támogatott verziójú felületállapot-fájl (lehet, hogy egy újabb verziójú " +"klienstől származik)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Nem törölhető a gyorsítótárból a %s fájl:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Ez a torrent-fájl nem érvényes. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Ez a torrent (vagy egy másik, de ugyanezzel a tartalommal) már fut." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Ez a torrent (vagy egy másik, de ugyanezzel a tartalommal) már elő van " +"készítve a futtatáshoz." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "A torrent állapota ismeretlen: %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Nem sikerült írni egy fájlba " + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "a torrent nem fog tudni újraindulni az ügyfél következő indításakor" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Egyszerre legfeljebb %d torrent futhat. Részletesebb információ a FAQ-ban " +"található, itt: %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"A torrent nem lesz elindítva, mert más torrentek várnak elindításra, és ez a " +"torrent már teljesítette a megosztásleállítási feltételeket." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"A torrent nem lesz elindítva, mert már teljesítette az utolsó torrent " +"megosztásleállítási feltételeit." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "A/az %s legújabb verziója nem volt megszerezhető." + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "" +"A/az %sból származó füzér új változatán nem tudott szintaxiselemzést végezni." + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "A/az %s es a %s elmentésére nem talált megfelelő ideiglenes helyet." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "A/az %s %s betelepítő számára nincs torrentfájl." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "A/az %s %s telepítő nem található vagy hibás." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Ezen a rendszeren a telepítőt nem lehet indítani. " + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"ebben a könyvtárban lesznek tárolva az olyan gyakran változó adatok, mint a " +"gyorsfolytatási adatok és a felület állapota. Alapértelmezésű a bittorrent " +"konfigurációs könyvtárának 'data' nevű alkönyvtára." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"a helyi fájlrendszer kódolása. Ha üresen marad, a program megpróbálja " +"automatikusan felismerni, de ez nem működik 2.3-nál régebbi verziójú " +"Pythonnal." + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "A használandó ISO nyelvkód" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"a követő felé jelzett IP-cím (csak akkor van hatása, ha ugyanazon a helyi " +"hálózaton van a követővel)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"kívülről látható portszám, ha eltér attól, amit az ügyfél helyileg figyel" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"a legkisebb figyelt port, ettől felfelé keres a program, ha ez nem elérhető" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "a legnagyobb figyelt port" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "helyi IP-cím" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "a kiírt információk frissítési időköze (másodperc)" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "további partnerek lekérdezéséig eltelt idő (percben)" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "a partnerek minimális száma az újralekérdezés elkerüléséhez" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "a partnerek száma új kapcsolat létesítésének leállításához" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"a kapcsolatok maximális száma, ennek elérése után minden új bejövő kapcsolat " +"azonnal le lesz zárva" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "ellenőrizni kell-e a hasítóértékeket a lemezen" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maximális feltöltési sebesség (kB/s), 0 esetén nincs korlát" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "az optimista akadozásmentesítéssel kitöltendő feltöltések száma" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"egyszerre legfeljebb ennyi fájl lehet megnyitva egy többfájlos torrentben, 0 " +"esetén nincs korlát. A szabad fájlleírók elfogyását gátolja meg." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Követő nélküli ügyfél inicializálása. Ezt engedélyezni kell, ha követő " +"nélküli torrenteket szeretne letölteni." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "keepalive-üzenetek küldési időköze (másodperc)" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "hány bájt legyen lekérve egy kérésben." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"a hálózati előtagkódolás maximális hossza - ennél nagyobb hossz esetén a " +"program bontja a kapcsolatot." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"várakozási idő az üresjáratban működő, adatot nem fogadó aljazatok " +"lezárásához (másodperc)" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"ekkora időközönként ellenőrzi a program a kapcsolatok lejárását (másodperc)" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"a partnereknek küldött szeletek maximális hossza, a program zárja a " +"kapcsolatot ennél nagyobb kérés esetén" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"a jelenlegi feltöltési és letöltési sebesség megbecsléséhez használt " +"időtartam maximuma" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"a jelenlegi megosztási sebesség megbecsléséhez használt időtartam maximuma" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "hibás bejelentés ismétlése esetén a maximális várakozási idő" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"ha egy kapcsolaton ennyi ideig (másodperc) nem jön adat, a program azt " +"akadozónak fogja megjelölni" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"ekkora letöltési szám fölött tér át a program véletlenszerű " +"sorrendkezelésről a prioritásosra" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "egyszerre ennyi bájt írható a hálózati pufferekbe." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"a kapcsolat megtagadása olyan agresszív partner esetén, amely hibás vagy " +"szándékosan elrontott adatokat küld" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "" +"nem kell több olyan további partnerhez csatlakozni, amelynek ugyanaz az IP-" +"címe" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"ha nem nulla, a partnerkapcsolatok TOS opciójának értéke erre lesz beállítva" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"hibajavítás aktiválása egy ismert BSD libc hibára, amely nagyon lassú " +"fájlolvasást eredményezhet." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "a keresőkapcsolatokhoz használt HTTP proxy cím" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "" +"a kapcsolatok zárása RST-vel történjen, a TIME_WAIT nevű TCP-állapot " +"elkerülése" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"A Twisted hálózati programkönyvtárak használata a hálózati kapcsolatokhoz. 1 " +"azt jelenti, hogy twistedet használ, 0 pedig azt, hogy nem használ twistedet " +"- esetén bekapcsolva, 0 esetén kikapcsolva, -1 esetén automatikus detektálás " +"lesz és jobb a twisted használata" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"fájlnév (egy fájlt tartalmazó torrent esetén) vagy könyvtárnév (több fájlt " +"tartalmazó torrent esetén) a torrent mentéséhez, felülbírálva a torrentben " +"megadott alapértelmezett nevet. Lásd még a --save_in paramétert, ha egyik " +"sincs megadva, akkor a program bekéri a mentési helyet" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "szakértőknek szánt, kibővített felhasználói felület megjelenítése" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"befejezett torrent esetén a megosztás max. ennyi ideig folytatódjon (perc)" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"a megosztás leállításához szükséges minimális feltöltési/letöltési arány " +"(százalékban). 0 esetén nincs korlátozás." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"az utolsó megosztás leállításához szükséges minimális feltöltési/letöltési " +"arány (százalékban). 0 esetén nincs korlátozás." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Minden befejezett torrent megosztását korlátlan ideig kell folytatni (amíg a " +"felhasználó be nem zárja)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Az utolsó torrent megosztását korlátlan ideig kell folytatni (amíg a " +"felhasználó be nem zárja)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "a letöltő szünetelt állapotban induljon" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"azt határozza meg, mi történjen, ha a felhasználó új torrentet indít kézzel. " +"\"replace\" esetén az utoljára elindított torrent leáll az új megkezdése " +"előtt, \"add\" esetén az új torrent a meglevőkkel párhuzamosan fog futni, " +"\"ask\" esetén a program mindig megkérdezi, mi történjen." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"a torrent mentéséhez használt fájlnév (egy fájlt tartalmazó torrent esetén) " +"vagy könyvtárnév (több fájlt tartalmazó torrent esetén), felülbírálja a " +"torrentben megadott alapértelmezett nevet. Lásd még: --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"egyszerre legfeljebb ennyi feltöltés engedélyezett: -1 esetén egy " +"automatikusan meghatározott érték lesz a --max_upload_rate érték alapján. Az " +"automatikusan meghatározott érték csak akkor megfelelő, ha egyszerre csak " +"egy torrent aktív." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"a torrent tartalma ebbe a helyi könyvtárba lesz lementve. A tároló fájl (egy " +"fájlt tartalmazó torrent esetén) vagy könyvtár (több fájlt tartalmazó " +"torrent esetén) ebben a könyvtárban lesz létrehozva a torrentfájlban " +"megadott alapértelmezett névvel. Lásd még a --save_as paramétert." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "a program megkérdezze-e, hová kell lementeni a letöltött fájlokat" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"a torrentek tartalma ebbe a helyi könyvtárba fog kerülni, a --saveas_style " +"opcióval megadott néven. Ha ez üresen marad, akkor a megfelelő torrentfájl " +"könyvtárába történik a mentés." + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "a torrentkönyvtár átvizsgálási időköze (másodperc)" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"A torrentletöltések elnevezési módja. 1: a torrentfájl neve a .torrent " +"kiterjesztés nélkül. 2: a torrentfájlban kódolással megadott név. 3: a " +"torrentfájl nevével megegyező alkönyvtárba (a .torrent kiterjesztés nélkül), " +"hozzáfűzve a torrentfájlban megadott nevet. 4: ha a torrentfájl neve (a ." +"torrent kiterjesztés nélkül) és a torrentfájlban megadott név megegyezik, " +"akkor az a név lesz használva, máskülönben alkönyvtár lesz létrehozva a 3. " +"eljárás szerint. FIGYELEM: az 1. és 2. módszer esetén visszajelzés nélkül " +"felülíródhatnak fájlok és biztonsági problémák adódhatnak." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"a teljes elérési út vagy a torrent tartalma megjelenjen-e minden torrentnél" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "a torrentfájlok keresési könyvtára (félig rekurzív)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "a program kiírjon-e diagnosztikai üzeneteket a standard kimenetre" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "2 melyik hatványa legyen a darabméret" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "alapértelmezett követőnév" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"ha az érték hamis, akkor követő nélküli torrent lesz (bejelentési URL " +"nélkül). Ebben az esetben megbízható hálózati csomópont adható meg :" +" alakban - üres sztring esetén a program a routing táblából veszi a " +"csomópont értékét" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "a letöltés befejeződött!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "hátralevő idő: %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "a letöltés sikerült" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB fel / %.1f MB le)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB fel / %.1f MB le)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d látható most, továbbá %d szétosztott másolat (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d szétosztott másolat (következő: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d látható most" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "HIBA:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "mentés:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "fájlméret:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "befejezettség százalékban: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "hátralevő idő: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "letöltés ide: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "letöltési sebesség: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "feltöltési sebesség: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "megosztási sebesség: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "publikálási állapot: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "peer-állapot: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "A --save_as és a --save_in paraméter nem használható együtt" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "lezárás" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Hiba történt a beállítások beolvasásakor: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Hiba történt a torrentfájl olvasásakor: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "meg kell adni egy torrentfájlt" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"A karakteres módú felület inicializálása nem sikerült, nem lehet továbblépni." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"E letöltőfelület működéséhez szükséges a \"curses\" nevű standard Python-" +"modul, amely sajnos nem része a Python standard Windows-os változatának. A " +"Python Cygwin-es változata azonban tartalmazza (ez a változat futtatható " +"minden Win32-alapú rendszeren, lásd www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "A bittorrent-iranyito kozpont tovabbra is hasznalhato letoltesre." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "fájl:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "méret:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "cél:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "előrehaladás:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "állapot:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "letöltési sebesség:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "feltöltési sebesség:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "megosztás:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "publikációk:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "partnerek:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d látható most, továbbá %d szétosztott másolat (%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "hibák:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "hiba:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP-cím Feltöltés Letöltés Befejezve Sebesség" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "%d darab letöltése folyik, %d töredék, %d / %d darab kész" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "A következő hibák történtek a végrehajtás alatt:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Használat: %s KÖVETŐ_URL [TORRENTFÁJL [TORRENTFÁJL ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "régi bejelentés - %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "nincs torrent" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "RENDSZERHIBA - KIVÉTEL TÖRTÉNT" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Figyelem: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " nem könyvtár" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"hiba: %s\n" +"ha argumentum nélkül indítja a programot, megjelenik a paraméterek " +"magyarázata" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"KIVÉTEL:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "A \"btdownloadheadless.py\" használható letöltéshez." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "csatlakozás a partnerekhez" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Várható befejezés: %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Méret" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Letöltés" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Feltöltés" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Összesen:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s partner %s feltöltő partner %s osztott másolat - %s le %s fel" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "hiba: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"ha argumentum nélkül indítja a programot, megjelenik a paraméterek " +"magyarázata" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "opcionális megjegyzés a torrentfájlokba" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "opcionális célfájl a torrenthez" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - %s metainformációs fájl dekódolása" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Használat: %s [TORRENTFÁJL [TORRENTFÁJL ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "metainformációs fájl: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "hasítóérték: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "fájlnév: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "fájlméret:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "fájlok:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "könyvtárnév: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "archívumméret:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "követőbejelentési URL: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "követő nélküli csomópontok:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "megjegyzés:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Nem sikerült létrehozni egy vezérlőaljazatot: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Nem sikerült elküldeni ezt a parancsot: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Nem sikerült létrehozni egy vezérlőaljazatot: már foglalt" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Nem sikerült eltávolítani egy régi vezérlőaljazat-fájlnevet:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "A globális mutex már létre lett hozva." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Nem sikerült nyitott portot találni." + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Nem sikerült létrehozni az alkalmazás adatkönyvtárát." + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"Nem sikerült megkapni a globális mutex zárolást a controlsocket fájlhoz." + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" +"A BitTorrent előző példánya nem lett megfelelően megszüntetve. Folytatás." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "érvénytelen bináris kódolású sztring" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" +"érvénytelen bináris kódolású érték (adat áll az utolsó érvényes utótag után)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Használat: %s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPCIÓK] [TORRENTKÖNYTÁR]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Ha opció nélküli érték van megadva, akkor azt a program a\n" +"torrent_dir opció értékének veszi.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPCIÓK] [TORRENTFÁJLOK]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPCIÓK] [TORRENTFÁJL]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPCIÓ] KÖVETŐ_URL FÁJL [FÁJL]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "az argumentumok -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (alapértelmezés: " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "ismeretlen kulcs " + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "az átadott paraméterhez nincs megadva érték" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "a parancssor feldolgozásában hiba történt itt: " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "A(z) %s opciót kötelező megadni." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Legalább %d argumentumot meg kell adni." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Tul sok parameter - maximalisan %d megengedett." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "hibás formátum: %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Nem sikerült elmenteni a beállításokat: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" +"A követő bejelentése még mindig nem fejeződött be, pedig már %d másodperc " +"eltelt az indítás óta" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" +"Nem sikerült csatlakozni a követőhöz, a gethostbyname függvényhívás nem " +"sikerült - " + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Hiba történt a követőhöz való kapcsolódáskor - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "hibás adatok érkeztek a követőtől - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "a követő elutasította - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"A torrent megszakadt, mert a követő elutasította, és egy partnerrel sem volt " +"kapcsolatban. " + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr " Üzenet a követőtől: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "figyelmeztetés a követőtől - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Nem sikerült olvasni ebből a könyvtárból " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Egy stat művelet nem sikerült " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "%s eltávolítása (újból hozzá lesz adva)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**figyelem**: %s egy duplikált torrent (az eredeti: %s)" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**figyelem**: %s hibákat tartalmaz" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... sikerült" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "%s eltávolítása" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "az ellenőrzés befejeződött" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "elveszett a kiszolgáló aljazata" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Hiba történt az elfogadott kapcsolatok kezelésében: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "Ki kellett lépni a TCP-verem hibája miatt. Olvassa el a FAQ-ot itt: %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Nem lehet RawServer motort cserélni, mert %s már ki lett választva. " + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "H" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "K" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Sze" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Cs" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "P" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Szo" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "V" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "jan." + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "febr." + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "márc." + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "ápr." + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "máj." + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "jún." + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "júl." + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "aug." + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "szept." + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "okt." + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "nov." + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "dec." + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Tömörített: %i, nem tömörített: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"A torrentfájl neve nem adható meg, ha egyszerre több torrent generálása " +"történik" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Ez a programverzió nem támogatja a(z) \"%s\" fájlrendszer-kódolást." + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Nem sikerült átkonvertálni a(z) \"%s\" fájl- vagy könyvtárnevet UTF-8 " +"kódolásra (%s). Vagy hibás a feltételezett fájlrendszer-kódolás (\"%s\") " +"vagy nem megengedett bájtokat tartalmaz a sztring." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"A(z) \"%s\" fájl- vagy könyvtárnév olyan speciális Unicode-karaktereket " +"tartalmaz, melyek nem valódi karaktert reprezentálnak." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "hibás adat a válaszfájlban - túl kicsi az összesített érték" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "hibás adat a válaszfájlban - túl nagy az összesített érték" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "létező fájl ellenőrzése" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 vagy a gyorsfolytatási adatok nem felelnek meg a fájl " +"állapotának (hiányzó adatok vannak)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Hibás gyorsfolytatási adatok (a fájlok több adatot tartalmaznak)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Hibás gyorsfolytatási adatok (nem megengedett érték fordult elő)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "hibás adatok a lemezen - lehet, hogy két programpéldány fut?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "nem sikerült beolvasni a gyors folytatáshoz szükséges adatokat: " + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"indításkor egy befejezettnek jelölt fájlban hibás volt egy hasítási érték" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "A(z) %s fájl egy másik aktív torrenthez tartozik" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Már létezik %s nevű fájl, de nem közönséges fájl, hanem valami más" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Túl rövid olvasás - valami levágta a fájlok végét?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Nem támogatott gyorsfolytatási fájlformátum, lehet, hogy más verziójú " +"klienstől származik" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Egy másik program elmozgatta, átnevezte vagy törölte a fájlt." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Egy másik program megváltoztatta a fájlt." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Egy másik program megváltoztatta a fájl méretét." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Nem sikerült beállítani szignálkezelőt: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "eldobva: \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "hozzáadva: \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "várakozás a hasítóértékek ellenőrzésére" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "letöltés" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "A konfigurációs fájl újraolvasása" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Egy stat művelet nem sikerült %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Nem sikerült letölteni vagy megnyitni: \n" +"%s\n" +"Próbálja meg webböngészővel letölteni a torrentfájlt." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Valószínűleg egy régi Python-verzió van telepítve, mely nem támogatja a " +"fájlrendszer kódolásának lekérdezését. Az 'ascii' kódolás lesz érvényes." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"A Python nem tudta lekérdezni a fájlrendszer kódolását. Az 'ascii' kódolás " +"lesz érvényes." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"A program nem támogatja a(z) '%s' fájlrendszer-kódolást. Az 'ascii' kódolás " +"lesz érvényes." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Hibás komponens az elérési útban: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Ez a torrentfájl hibás eszközzel lett létrehozva, hibás kódolású fájlneveket " +"tartalmaz. A fájlnevek másként fognak megjelenni, mint ahogy azt a " +"torrentfájl készítője akarta." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Ez a torrentfájl hibás eszközzel lett létrehozva, olyan hibás " +"karakterértékeket tartalmaz, amelyek nem felelnek meg valódi karakternek. " +"Egyes fájlnevek másként fognak megjelenni, mint ahogy azt a torrentfájl " +"készítője akarta." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Ez a torrentfájl hibás eszközzel lett létrehozva, hibás kódolású fájlneveket " +"tartalmaz. Ennek ellenére előfordulhat, hogy a nevek nem tartalmaznak hibát." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"A helyi fájlrendszer kódolása (\"%s\") nem tudja az ebben a torrentfájlban " +"található összes fájlnevet helyesen kezelni. A fájlnevek megváltoztak az " +"eredetihez képest." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"A Windows fájlrendszere nem tudja az ebben a torrentfájlban található összes " +"fájlnév karaktereit helyesen kezelni. A fájlnevek megváltoztak az eredetihez " +"képest." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Ez a torrentfájl hibás eszközzel lett létrehozva, legalább egy fájl- vagy " +"könyvtárnév hibás benne. Azonban ezek a fájlok mind 0 hosszúságúnak vannak " +"jelölve, ezért ezt a hibát figyelmen kívül tudja hagyni a program." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "A Python 2.2.1-es vagy újabb verziója szükséges" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Nem indítható két külön példány ugyanazzal a torrenttel" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "a maxport érték kisebb a minportnál, nincs használható port" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Nem sikerült megnyitni egy figyelési portot: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Nem sikerült megnyitni egy figyelési portot: %s. " + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Ellenőrizze a megadott porttartományt." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Kezdeti indulás" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Nem sikerült betölteni a folytatási adatokat: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Teljes ellenőrzés lesz végrehajtva a hasítóértékeken." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "a(z) %d. darab hasítóértéke hibás, újbóli letöltés" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Követő nélküli torrentet próbált letölteni a követő nélküli kliens " +"kikapcsolása mellett." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "a letöltés nem sikerült: " + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"IO-hiba: nem maradt szabad hely a lemezen, vagy nem sikerült ilyen nagy " +"fájlt létrehozni:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "kilépés IO-hiba miatt: " + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "kilépés OS-hiba miatt: " + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "kilépés belső kivétel fellépése miatt: " + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "További hiba történt egy másik hiba miatti lezáráskor: " + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Nem sikerült eltávolítani egy hiba után a gyorsfolytatási adatokat:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "publikálás" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Nem sikerült kiírni a gyorsfolytatási adatokat: " + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "lezárás" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "hibás metainformáció - nem könyvtár" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "hibás metainformáció - hibás darabkulcs" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "hibás metainformáció - érvénytelen darabhossz" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "hibás metainformáció - hibás név" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "a(z) %s név nem engedélyezett biztonsági okokból" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "kevert egyszeres/többszörös fájlok" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "hibás metainformáció - hibás hossz" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "hibás metainformáció - \"files\" nem egy fájllista" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "hibás metainformáció - hibás fájlérték" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "hibás metainformáció - hibás elérési út" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "hibás metainformáció - hibás könyvtár" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "a(z) %s elérési út biztonsági okok miatt nem engedélyezett" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "hibás metainformáció - duplikált elérési út" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"hibás metainformáció - egy név fájlnévként és alkönyvtárnévként is szerepel" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "hibás metainformáció - hibás objektumtípus" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "hibás metainformáció - hiányzik a bejelentési URL sztringje" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "nem szöveges hibaüzenet" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "nem szöveges figyelmeztető üzenet" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "érvénytelen bejegyzés a partnerlista1-ben" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "érvénytelen bejegyzés a partnerlista2-ben" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "érvénytelen bejegyzés a partnerlista3-ban" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "érvénytelen bejegyzés a partnerlista4-ben" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "érvénytelen partnerlista" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "érvénytelen bejelentési időköz" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "érvénytelen minimális bejelentési időköz" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "érvénytelen követőazonosító" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "érvénytelen partnerszám" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "érvénytelen publikációszám" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "érvénytelen \"utolsó\" bejegyzés" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "A figyelt port." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "a legutóbbi letöltések adatainak elmentése ebbe a fájlba" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "várakozási idő kapcsolat zárása előtt" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "a dfájl mentési időköze (másodperc)" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "a letöltők lejárása közötti időköz (másodperc)" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" +"ennyi időt kell várniuk a letöltőknek a bejelentések között (másodperc)" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"az információs üzeneteket alapértelmezés szerint ennyi partnernek kell " +"elküldeni, ha a kliens nem adja meg az értéket" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "várakozási időköz a kapcsolatok lejárásának ellenőrzéséhez" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"ennyiszer kell ellenőrizni, hogy a letöltő NAT mögött található-e (0 = nem " +"kell ellenőrizni)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "bekerüljön-e a NAT-ellenőrzés eredménye a naplóba" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "legalább ennyi időnek kell eltelnie két kiürítés között" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"legalább ennyi időnek kell eltelnie (másodpercben), hogy egy gyorsítótárat " +"elavultnak vegyen a program és kiürítse" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"csak ebbe a könyvtárba lehet torrenteket letölteni (és rekurzívan azokba az " +"alkönyvtárakba, amelyek nem tartalmaznak torrentfájlokat). Ha be van " +"állítva, az ebben a könyvtárban található torrentek megjelennek az " +"információs/scrape lapokon, függetlenül attól, vannak-e partnereik" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"az allowed_dir-ben levő torrentek speciális kulcsainak engedélyezése a " +"keresők elérésnek beállításához" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "újra meg kell-e nyitni a naplófájlt HUP szignál fogadása esetén" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"kell-e információs lapot megjeleníteni a követő gyökérkönyvtárának " +"betöltésekor" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "az információs lap átirányítási URL-je" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "megjelenjenek-e a nevek az engedélyezett könyvtárból" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"ezt az x-icon típusú fájlt kell visszaadni, ha a böngésző lekérdezi a " +"favicon.ico-t" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"Az IP GET paramétert figyelmen kívül kell hagyni olyan gépeknél, amelyek nem " +"a helyi hálózaton vannak találhatók (0 = soha, 1 = mindig, 2 = ha a NAT-" +"ellenőrzés ki van kapcsolva). Az olyan HTTP proxy fejléceket, amelyek az " +"eredeti kliens IP-címét tartalmazzák, ugyanúgy kezeli a program, mint az --" +"ip -t." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"ebbe a fájlba kell írni a követő naplóüzeneteit, '-' esetén a standard " +"kimenet lesz (ez az alapértelmezés)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"az allowed_dir paraméterrel együtt használható; megad egy olyan /fájl?hash=" +"{hasítóérték} URL-t, amely lehetővé teszi a felhasználóknak a torrentfájl " +"letöltését" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"a már nem aktív torrentek megőrzése lejárás után is (hogy továbbra is " +"megjelenjenek a /scrape- és weboldalon). Csak akkor van jelentősége, ha az " +"allowed_dir paraméter nincs megadva." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "engedélyezett scrape-elérés (none, specific vagy full lehet)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "a kérést adható partnerek max. száma" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"lehet, hogy a fájl létezik egy messzi-messzi galaxisban,\n" +"de itt sajnos nincs\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**figyelem**: a megadott -- %s -- favikon-fájl nem létezik." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**figyelem**: a(z) %s állapotfájl megsérült, alapállapotba lesz hozva" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# A napló elkezdve: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**figyelem***: a standard kimenetet nem sikerült átirányítani a naplófájlba: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Napló újból megnyitva: " + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**figyelem***: a naplófájlt nem sikerült újból megnyitni" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "a specific scrape függvény nem érhető el ennél a követőnél." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "a teljes scrape függvény nem érhető el ennél a követőnél." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "a get függvény nem érhető el ennél a követőnél." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "A kért letöltéshez nincs jogosultság ezen a követőn." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "argumentumok nélkül indítva lehet leírást kérni a paraméterekről" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Lezárás: " diff --git a/locale/it/LC_MESSAGES/bittorrent.mo b/locale/it/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..5bb69fca0aa29a9d5cb954432a5449f30f81e49b GIT binary patch literal 61747 zcmds=2Y4OTnfE7jL<MvgSUhC0Y46Qfu96V1iu2# z1Ahx11Rl3MNqWGO!GpoIU| zs9JIwsO#InL%6Y9|Kk1yFjX(9CJ>RoDQx7&j)vbdf%;}>hZaN-vL#wUxLbKzjKr1 zQt)I@{j?L*`*w%($A3H{^jHIx{@LOFi^BQK!~NHRM#rG&{3{?uOMU{r0DRCz-p}s_mETXm zMd0Bpyd5t9M>xL<90K12>ivHO)n6yB^!i=|>iQ_C>(_&7znj4`z>k8u{(DgE_JBdJ z??O=TTL-HBro;7{!4o)t5BNavOCThb`~lRs=!Zz=ffs?I=ZAx;-!ynC_+(J+c5Ar) z9#Hi6DNy6*o1n_^lYoB()vrgcb~-x-)cupd6zl^p05^g2!5cvJ*Xu#`%ZEYr^QXZ3 zgP#ZW{LjMq-Js~}_%)vY$)M`d4T{ds3b-0n`7Q(Z1Fr%#?jH``58MfAJUJnRCQ#*nHFzHQHc8Q21N%y1J%#J2UY+3UFPra0rkFfK=F;;px*loQ02S{yf64FQ0@B; zQ2p|CQ2BlvRQex-hl76wRo_Fmdi_&SbhQ9fyPgk8kixIIaF!DoYKg6{-X&L4uG z29IKJ{s{aw_yO=ES2&$L^TCvz^P?Z)*Bfk%vbeHR5h8x;Lr2x=T`1XbRLfvVRysCrex_1)q6^#PvMNseiA$T14OHj`rIOgqj0;uQagY&^2Q2AX7E(f=R zmw-2b>W?pi%J=)A>iv7L2RyRqeD@qs?K=vp-Jb=jon8;#AN+8@Z-b(bjY{_vc zcpB$hKvcz~33h}32A&Fj0ZhT)gQCad$GyEz1=ar#0+ntt_zZ9hcs%$`@B;An;r`MI ze|{@?KdxU1o)6YQhEVcaP;_?CPJjL+@IcO&f(L=;f@;SV;91~S@TK5WK)ruK*~_yY zypZ$DK(*hEpq_gPDE{>ZQ2qM;aQ(C4{4P-a`+IOTc%Mgjd#?pmpND~Zt_5nGJ`uba zd=7Xh_%%@FybC-S{28cn{tjFZp0Nv_1lGatgU408e18VJI6q|4^S>Xsfb-Kp^~a^4 z+Tlr{@_#z0{(UZZE_fTb82ka)1Kz*t?_CKFaXuZ+-wVE)^FM%t;7v7b3-G((5#R@> zy!}51D*qpW%6Gr3ooHTy-%iI0Fpx*lc@Jz4|gyfP3gRt!6z2W?X zX&+zLgR0+Kz*XQU!L8uYyIsx|!9LDk4XPer0{g)qgUi4ZuJLx=0Iucy1)$P@9aO({ z?eX$01@F)KMc@hGc2MK52I{>xfTI6Tf@gtU*ScI=3F^7k;19qnLDBcBN4mW?3ZBmS z^Fj6Z?V#TKJy7&{*rS|IP6Bm4A5{64f}+!hgOlJRz~jL$gQBZnf};OFfG2|cJ=*)@ zWKeXl1XO;bpvqeZRgPDICxf2=mF_3tIp9gxc|C{0OE`Z4I0}9TR6c92_i-`;>irJ| zb$tvx1Z;pR@1wvYz$bxf$LE2fi`&2pz&C^c1^x<5g^zK1I2z(QnDf)Y8^DF&W#HSv zJHW2TF_yuPf<_eJ1J@Xesw>vy2uv+zkyR~x{EoIeNb1@8cdz#oHp|FS1L zy-$MMIe#Ije18R|;2}@(ao!8Q{yx|lp!)X#PjkNVAaFJ31#k;^3#fAc0Xz-dpGLb7 zTmY(`B~at^I&chpE~xhZW4ONj={~-P0`35LZPEe{2X}+2-xENMr<*~w*XKad=QqOn zVbAdQ9|s=D_4B|ka0Pe-cnR1CUI8uyp9CHTz8O3cyaQDEKM5`ee*+!|E_kND??O=Y zwH{PIZvl1x;ouqIG`JLe8L0Pu9#p%23tRyH5xf*U^+s=(U7*rE0aSf%1eN}U;3?o6 zL6!4U;70JTp!moo&vJUY4m_Ll+rh)ZUkAJ!?C1QjXL~;mfEquK0+sGtpx*a0@F?&P z;1S?K&vAX~Sa1#J=Yz+9j{z&-bHjP^T&IKkfohLUpz^&OJP0g;^TA!<>EJWLGr>25 z_XWQNYJB_(Tna9Jp3B2A@L1CD+iL@;>r-GK_!3b0eGFU-?)PF(w+z&{x*S{% z?grO`uLDJYzXMb7n3s6|%fPES9|d*&^WcNP--9QEC%@Fk!+D_EWi$8ya1VGq_`Goc zwV?Xpec*}U7X$tZRKIu8C>j?>g1UbqC^}dMUIbnaD!&(iqNm$HwfB2KJ@;Yo6!3GP z()}7d13cs=?}ufe(ystT-$US$;6p+6&#r)v2KVFqMo|6!98mRn5vX>3E2#2)A5?$b z4W0v@_ACIB*SkBRB$n9@Kd3z1jO^F?a&!>%jfN9iYlT7S10HUdj1mLAC2Q zz_I-(AE^Ac-sM)ccQm zwf9ResBwE1sP-*@qOTi4mG`XyZx8q$Q2gutpvv=EQ1AIUcqsT+P;`0FYrNd2foi|S z-~r(Ipvt!rTm%k-de7s*lfWm3^H+e9C%1<4+rSN+zY&}V-VM@BN%~sP_cTy+)B~pA z0I2d^2`&MrL6!4Wpwhh!d;<6p@D^~>>%1Jl3;3sie+BiNoDk}tqrfA;6jVO_pxS>W zsPbP79s(A_^-1su&Rd|;KOPi)JRe*MzBpX}2B?1dB`A71^!45k^T7)_9|DKKCxfSg zp8*$uzXproiT~#By$G>={lM!up9fwJ-URCXe*zy49`YvFU&>$?=eL7L zgC7LNH@*bwy}tle&)#>aiIPjB~p9{EmuSzLc5xDGt`UChCO*Mlne7r-sxS3vdW z8Si#F90Juo4*^9l*MjQD=YlHt%fMs6SBLX=fvY+H0H}Nqd5^#6@PMPBo_jl}c6=|W z{5}N^fZqW7!4vLqyL3G$y7)DybbkRw*N48>>EXU$FXtzNo56LU(!T)I__zsFIbID) z-rokQ{k{jPoX5V;`O+0&ALma1E8v?z_1CHIcRnx->iHJ91bi)cF8B@b6!7>veOxUE z)lQqh`QQX7`gs~C`g}epI=ltEFZec4<^3=yzV%s9>AwW3oxTf-j(!sGSD@I0B{AU_FDrg->u+r;6p%_YYIFZd<>}fKLb>M{4=QMJ_oJ< zzXM(g&ikN`>qmpi=Q-d5z*m84w>!b*;2%M?*TVmBe(*3*?eb($?e-dQ9{6GK4Dcsl zH+bBKT<)F^>iWY$_3sU!^7|V2An=F}d-~;|_`^fMgTZl7^{9gC*F7LZFS!-e`>*_n z^SkRn<^L{F{qRHZ{@|~{3&2A^ijD}b1I2f526g|v;DO+mLB02zp!(q_;Q8QR!8d^C ze$3zZV^HmM_{Tlp`QWjf?+DlgkLUcUpz^;7)cf8Js-Hg}@O$7o&VK`*2A=l`*C(z5 z_1yD7(bem~E5LVyUEuMb^mdsC9>RGqxCUGbUIy+4Ro;()``?Fg{weSG>pt!IJsnj0 zyac=mycOIA{s2@vT<{sEw^g9ZF$Asx3*gz{&0sJ1HBfYQ;Ag!*SAsf!76_>%9|O05 z&;A_kN;$p@s@;C^c^_W~e8KtC1HtpSej&IJ+#T@dfS(C?Hz;~K^NUWOmw{^M3aIvb zJa`;x1RLN{Uvqoq@!&a}{|r0F<3pxR~=#fk%SLw_JZYD&S&Jy1>Wb| zF4xWhMVABMed(X=pxS@pJ6?|Gfqk5R0qgu*LaDK)rXx5B#|+K$ZKE;K|?(;1S@fK#ilff=7dQfU3`DK=GfSf-1*v z!GZhGw?Fjq)_>&k@>$?P+l<8 z2>uaNzn=Fqug@dERh+*YRJ!EnPKU>W;y2x(t`C66fSbT7SO8VOPlIa5pMxs@{=e}2 z)`KbMPXiwczBXJx2-|3i@GvA^f> z{}VWQcDxX-KaumD;rD_3zMkVD9O|bRga5^$KbkQ4nEi5}@Mf-ml5^GjnH(jK7jvAy zpX)T2b6;ac<@#rSpTKpso&N6YU~^%I@Ovfq=|Ud_z&~?*nrmvacZ2#n4g3_xd-;6{ z2P`BxA>89<@)v%K2R=$C;ctL<=KmhT$fH^rZ^=r5qpN{Da}zO`PlRbK(3y_fo-i!Es3&$f#a~#Ll zImBP|cRRoJ_ePEt{O$pJ!gK$w8{zNS;M#EgGvV4@r0?e1t2ti~^3kpR_`Q?ke2(|! zt{>0uS91TcN|gKiR!DOn@_Gx`MYF58b_K^X!#yQ`7{?PhzQ?uq{fQq3shnKDj^h%J(>dR+-{2>}Mc`qi`&@YF^YLNuCEWiThyM2GxF!77`3pF< zaJ0B~ILFg{%1a_3(_ zL|HPzZ~YB(r2IY^hVRgxGz*UrI z3CHU={~hNm`Q6W(<2nCjNV5q%ngg+rycWC}9OTg7<2c@~`*!C4!CvieIq%)X@pjG*Ce67V z-{ANm#{pbBmwP|q_ft7u#`zRj2LBA|PqOn79D6w57_R-3Zt!<%IKL7+gM9wTwG+Wx zIe!|zr^Ef%^ZP&!{r!?-E5{Q#7LZnd%Q>FQafeR$dzbP9PYL(m5%ST!J2~F0AK~vy z+`A9Q3pftv+HW`>!S5P)0jR%UfyaQS*%`8e^M(9=D0mac{dmt?Ie#t37)OKSSgzmA zv4i7ZIL_r-{QD2iSBJ9o^83RaZ{y|zxON;zALsgOay*^icZTz-T}1~9=O5?%L;QYE zxPAn`*Yo^;f-AzcrQovgyANE%y)SYMaOf}PSjlld$5%PJc>ZMWoeh2^q&WlJpYtDs zCvjXyy2Ck-e~bAs&GArRLx)!bfn8^(Eor@$n}3V2&4&=0uLm`Tb<^X={?=+s@!qMRT<(!`a z{uz80cqrHP_X-EoUC-nCVy=IfYaive{_Y#nUGJyKig12Fz~6KIgB;%{{Z~2O$M54p z+6d=x{TxmT953bfI*!fZW+h;aYx)}t_%nVl48Qxq4ZQCd@B&K(y@q=_o#Hs1 zxA^^ykl;L?dm+~!&as4JEypCs*&O1?fv=A%6cM z+|%_}hToq7w{w0V&(F`j_qpNz=fOd)Uli_*bAAWMS)Bh9xQ=HZqzuE~&$$-=y7+y6 z(!By)!|_{=S8?d?uR6l-U3P_hNSksT!|@#M9Rj`?ygl6i4!`H|`;(ylPU8L$$JPAa z$gv?@KTkKi)?TrC?Us?D&6@_2u6nDQ?k+cXrqx8dc9O_raeizx>9SDs}pIVQc*c}m#f9v?nXLU*prTzuSuIbOX*a-Hd-l7 z_9yAaQln9rD5c}|+N9lT)(d01O7#I=Qf|;f&9smf%k|P2Z`hN}?{3T|<9ex3+(ScA z^G1KVrk3uhwbF96S*jLQzA^4MOKG8+mWvdsJXWYIOpC3l3ct9XWyd28QrLSfGZj0# zyJDYj+g+fxde_cct--r^ZhX9CZ7^Q0l+r4_xgt3&-B6oIhns~ujY*ySyk4qJm8#*w z@Xl7VX)mS+NYb5j)0^J@Nq7H}@$T-lSgV#6sxj-O$wIkGYVIr>7io|n-MEV0P8X%| zg!ZoXCf&t!v``F?LLOrf$eGHeT&1*)u|mB_57$dqx9G%%5*7=49BJ5kd9)=82$a=R zEnU+b;AzXawoAzyrLkJIXiq?mReEc;U-sV%)2T`e5+&a`@(Ve|2ltg&1AvSNx)(1k zraNn`x?bsLljSO<4x@43Urlv{-MiN~(TB4Hm zdTXkgG7u-r4UuoZvK$<1mZ!_jJ?cfBudUZ>b^W-wRGAVEm#pvX{gEsg-rhrvbSKF~ z#)W3u)!pd2yw<7|jaDn=T^cj#L`}rU_@U`mC_@|G*3~w?`_qvc1%^e~_=sbp+g?aj zL{@q%4nHG3BY$c_s-87r=!iM&E;AxWX`smxl+hg986Tr{doC_$w5278c&wSWsVhUbT2x`Bg1BInJz+G!8JdOOq`$vE zZM4Qb> z{b^Dtu`{kaZ3fXqR^_JUST8*SA}71iJ$dR)ckiUJt;6WcswZKP7OH!ET=u8R8M>jt z2aCnBL^QN+^vT0e$yktm;=mB6jd8mTc?}k)3)HNb3^EMYS-0|w(L}WKU=V3~PEuH9 zS35;^MS|V%X6Tk7ABJ407G$zR$^%@j(oR;J@>Dx2bafh7QoDVS-7U3pt6mvM1|d5Yy@FNOk#AJD{)ZR zotZ_Isx;jBEOSWh{a@8 zt6VV}3j?OXz)n^d!~&$8+RK{sx<+(Nk~YfX;tWH^sfOP=ddE^43xOF~N3R>aOyaJ) z5i>NBO_3Hb3(+af5eIogqg)+pf+Y@K$|0UvDL|n++e5&G5S(N4aI)Gc(mT^ekXVbf z=y1oXBd#a%fUw0I>LOyw-~yY{>AuEUM$+C2J8QcbqpO2jS9RWP>1vf?sqR^u&KFeT zHpOJBV|d)s8hIpW)RS~TV?e*)c8!MAzwUCHZmX($+E=>7CVJ*&r~BV!xscb(pj^ zkz~disG2DSQtC$Pd&oxwQb>1~M$^$c){Yu0$4b-=fxIo#e5H}pMILRm%1w#GRE(%r zFOX|S*^zH48;X?|46}1W#!6oi&F7nI0y3yD_>cxs7Mo6qC~H^H48R<3QR_>A%fH3a zh>fEEi@9|)xxKoOR?zoLQsS%_GjrH`qI~bcE3m7?rDJ(zlW4q3749fD`oJW7soJdU zah_0{GV8gcXtEhQAG0eNZROt`F&1c{rn$vocJR}Cxni( z8|e<&?b%&P=qx>;&yRPzisOVRT8}^sHQe( zU|yn+ftWDdBXP1;hTZHsLfU@ENZmLqCdZUJBcf=`5@{4GO@IEav+g1U#>*44E?Wux zZS#_K3~ZXyLHs+&Bg&W`m~?)<)|%Ma)(ko&On)wizw^1$XtGX2OVrlkGHXoB@Uy+>5R$iz)|A8;Z{>;R zPBe=k3g&!rL3d+8Y@+PR{&btk<^_euSh>u7EGh^_MXHuDi0N(^#BNzn#YLM2N90dg zXD%_5CfE+V9d6oifx^9VvOc&tOyi3EubryGBW4}TAIdjD^Rj~Wc3!wOsQy< zg6W$rLvQ@)CU9fwKp`DwZ|m)w*%>N>Qk<1tb#8;AoT=ZSSY$jWg~FEYkyGS7NZ^pf#p zSDY-Hy%%8lKw2KZca^et?JGMR?${q~udtfSXxJXYIkktTTC!+qFUBWbR^MGFLDWm} zCyUvk{+8*ETs7ocsM581co|K$dT^Wh`r&*=H|Y{9*iwYIC_`%WXt^TCBAtnNuD8Xi z+;mO6DDqU8AIzSV^ISFpIu3L))~5Cj*~*N$bF{fWOP%#KTSu(OD0?B!uWpSOz7RlV`_NB zXK3!Z$3yYd;_jD8x9p*-s_D}HWwLfAOueaRccmb}$xSU765+r_U@t>eDqRlRvv)+# zDEbm@Ro~M)=k4~~#oiN%RdctITvDhem*Abdq*YBWUA3rTW{dx#0R865%1jx*PNQuo zRVSJ|lMS_+8<3fQ&QK^t+Tvz_ zq;-yK@GnfFZKyyKy1cc>E=sCyVGSA z1oASKSH9bR9;dq{7cdgwLE^cnb(mg(PU+T7gUKfMYlDo+tj3&LS4K-DYn+4;Cs(T^ zNvwH87dtARB@fY+k)A**w-vHp`C9WQCu`2G}9}(Gr9!1DrL>xT~4&3q)jBAROIb zl&aCC$e7y%LA|8_+bXi>1T`93W9U<{#$UE*z6_h|TFB6TJbuf?N&lDm$zBRba+R3g2>t~D4mCCS`OFA@nU~9|? zlZ8#D&YfUkis8Sr)@Y9IF$p(rI&OFjhQ%b$D2gP$BV*JBcQcPxP*S>jLR*>kCkmtn zd)AL!3cp(}e#dC1>0*O&FEGQU{Y&U6$Out-a=8GFypWkNsCN8^Le z!Mw0~aMdPOVwQARvNcQz21F#_u&Ch09)9rf$l8sm*;jN*7A26bU%P4T*1?grYm(tY zlLJC3V?)`G%r9gf&v0p?eP3KSzFmyQ9#b)fneo*8j`*-QL4#}5aTYH?muxY)f=q2& zmGrbcV~zC69akYl>SIV7(=C*ru7$Z+rlNM1Nhk(N#yl`yt|NH-Rpxu2^*&13p0i4O z{M};Uv^=?J-h@feG8Aa#&8PM&bF;L2S&L9Kz0dNAOeX)Ddn}YUa7E-?a6%Yn>cY>= z)j>h0lHqoHGTImSFJ8+0K3B~{Ew4!*o+GBNciK3IscL#Ccw1K}-EPaykm zJ7$f5WEkpAhO4d7QJCDYIf#M`@H4#tjW14OMS@@su-X!BLN$^b6u}&M*%%r|tr%It zzeP9(MwTTb!CzUH^G#1^K+broL8@z-ObC_I^*Fu|nBtPW^COEv?D63=5k9NLyOlolomWn@mnTX{ZS5U$Q|N0Q9fB>jA5qN}Z#*F5qprI*vM zib%GErD`E@bq)oI27{Ssiq0BA78z4PHoM)K?d)7(#O}sSqvnT!ZEoSxHP}TG z^aH$|{Gy@j<3(`<-XEr<7oD9K|GVO4QKWm&{!9+oESD#40WvYqU zru`|#xiLK)4yX?57Us%*IvrI>4Ki7%%b&nIAP@~e+#+b*Ov+0}J8|)TQa(c3Dh^+! z{cI%sw<;v-BBPLd_S|T`n^wwERew6Hpb_eDV zfN(KB$K@BuG&=POYE-pI5Lh&0;m<87dp;IbqtuumC0rvU1IJnl#Fd zn^Jcpb2aAyz3p0Ie>!CPCGyLL$n3{g@0lP{(5Gs%#|Q-o;s>TE(j)g}OH)@BF_U)h z-rYZD5B8%{^oDvRDVSP5qVEiz+qK$uw=*WZ&P!zDFqxFp9 zf?Sw%D_#lQ^|(X90ofTH93q26e8}+bV(wlpp$Hs49+gxJf(yo&2gGsHwQ#yF#IpD( zP)9}eQY8v8imA`tndP8z5%{;|voRM>;A8DY+1h<TG89_cy78& zBq1$(vVelj0ENITmjZ>8{X8R|#Dj4IXbOjdDJoX>V4C|mvUPCvrE9m!_D!!G*}Qe@ z+D#+thBmD2JR#~Jy(+yb_uRcni+37dr*zF2+E*!$G7YW3K`Hq0YBWO$PVUF8IZ0d= z`~lh3^v4$>%=}`Q73jFv7oTVwf9^FvnIU>MW)L zgOX=bq(8abT^yi!W0^s^9DVxoQbneX#*gtnEUri}FfS&|Q=0?m@ZDc7CXL-B!bl09 z(^PJQ;2g!F^d}F-%`d^vbgc&_8mXGEGmCJJGm@re>%C^JL>3vD3);o*Ql+vY%hH|f znxT}2Gqb$#8p_*csc9D&k42g(Ucg^5J7$2ehnSq%Uyp+HNIH$%xn;aLqb7)YhP>6p zF(NdwXH&asC{8hFDzHaR9$KvL)Ai~ppvSA z+rm;*Ie)a=4EOsW>qf1D`M`rwZhEK8e1^zTpKsZTxhA)A|J0t@k1=J~w)EWMmPn3$ zq(*0omSSDG*_H(iUzH8wHA7q1u4Z&U_^Ph1Ic{sf4_~#nJM9}+rFnMYY(oE&Vu!^? z8nl`~11rnyavW%-WQUC!h)bb~42Wchn^wt=b?`O+-|bH>NMBEOSUB{Ki*Yk0I}|Ft zV}|R_&tv7q9+MsBep|Gqf{S;D`QQ{Z!cP>9WXEO9xhFgD@L;OJPE1(U?E*%FP>wmo zrwloD*|?I=b`5YT#Aol=j!QTxq+*?T8Gm=6&>Upz9h zMe&i>*o=*cM?5h);c`4NK}(@XHYU)Zca;d*lxY+sSu|)YRjFt*9TcbFQP(lQf<@RS za@I(tawlY4(uz&=btTg3Ej-Fi%ODPM2xd2UF&;i9WE&o7+($WZTk=0jPkG|rC2Yu3 zWl6J$`o46&X+85ZcbUyHSNUr_DW6-fCJ;KuTQ4#Uu+RNrJlr;(##C5I`4;S`%)`wy~JS_F2{T z;+jCaANMIob95tTGS@E3Vmg?e$qgT4&29NW3%4KfneI6b5)@Z}0xcPuNF%1!C{2je z%+~0rZ4<>>o6>A8-;fCLjvaH7Wl{Nlm+t3~gMy27#6nxW|tacymV1OTax4SLRNNm)Fn0-22l`0ct+!u5`NqrMY3VIF8XM&Jkk;I_U zYHM*tRow-p;IiO=$I3c zB~TuxL06KtLFJgot}yr4NuD+f(Y{2%DsfVp6A`KHGTCDTEb0AN6XXq{YHN21M8MEGU6X-Z7>8?Pv zZt~KfoLf@ zRRR-#TTAaqR}HV>Eu&)^t4X5aOf7g0S zdkK`Gs3tYmHGQ^j$0*b4qBwqE%Mk;4&>m-88GDaV5TUYgGmor)SrYzUeog4td}Y- zo~oLkqPJ+CNhQ6YJay5)1#)CwWUg=4f@mH;=w~YGl&pBo*Wn*j+=gl5h<}G4I{EWI9JR}ZlVhG^_8dk6B~hYiP%t%lP&Y* z>d_vn+9hU-wH8?yliFU1JW7Qa09LP(dhl^ zoH2cAkDR>B)9q{Ruj@FSw8T?6{@9!BDwU>ij$`aa5g1yYR9dY+g~^T1XfCrjY0(ht zVO1xZpN*SEfiX%Aj1E1>ZF7}*2Q);56B~b#l^yJ7*o*m!O3h@KEHzu!Nlc_^4yaP? zi;TG07p)I$8Rs<$GDipH8LO!O-)25i3q-+fxvK$dF8fSQ1#NYNG$u)U?uBMR^k2tf z>?|{n)>O>3+e6eeeeRzLAg z8|ogEtND;RbnPwgj=4gEC>_FK%``MVM&T_g)p@A9o5CbPN9I{=saO^#3^!I?%r9#Z z=6Zcc&8P%^TcY}K?bvTCDZdo;=Mx*gL@Wt&6zML-MlwV~#G!ok(RIyWs1Qrm%+iK= zT4x?UwWtz6vI}Sz`D?U!036kdxm$$ZhtrD4T9!V`XAOG{4%Ie~PlLwXKl3#WLK&qB zx>-Zm`FSS-x#!v;B6fyZNE8*KJ{wb(4aJG>vMrSNYVj zlgcb)wD@O6q!nnc*I0p71B61D=F)7D?4nT4tZX(>NJ?KbMw0A~)C$T1anXd{x-Q&E zjY3|AANXjr5KxPZh6HW;B=+&&okb)D*iY18EXPJ?sVITw)zE92yA|b8FCj&2NCZcY zaVbc44=zBsqU=0wD-)})g(I7TgLbwned56SW&L7;H_04sVkIUONo`TG?GDXaT09W5 zwGN9itmXi4%zyTpiynAwerXA)l#nhqL-3b4sWOXx+?u*MVxCNkr?wohTe z$y&#F6VvAUIJLnY!w8T6uDw8Mw)%xLmh zO<#p<4Uw2h)-68S2tHQV)nm*&+DC(8Cp2~xQv9y=SpcMZNlVE+QTuv~#1B3hZpanq z`b4I11g~AYXCnQW#+(sum~J(ljU~xNf+VOJ6Kzm5B7;D=q@9I#E*5h8aYb0stHe*4 zeyQP_8>P8tW51F6R6$ltq*b|@M5-c8Cdj8tjfCx7H2s~aRWcB|i2>~9mL#t=Wi}w_ zVeUun>;7$vHy~`kM>LRmgm@Gwlylc;HW6MP8M{u+17K7^pTtZ}co;X>EGy=QPSMsTq)p1F9~BB@8o3#N-s42*jZ01F&IFG*p#gi}OeY3pr#o9% zRQS9KMRRG%k0?u0t*jMV)vO9h_6V_eX1dA0p_UWL2jWY#BA#JR!KPSQ%}62#`dgkr z3l5-7On#7%DX@D%*s7H|&sy{!ULvdI0ATT&^kEfF!et9@?#3j7J&$y-6IC zaVVNjtQy4jrZr|I@>i!t34vKRTT@s#aZs6e(`bmAxIZ;}Aom6h6D?_JE_(wcJQOT#tHU9}eA^a{4-HNY8 zE;5^N*Ddp-QCo}Z#r`&?D@T~tj7Lcu_|ZT*9~+VAe`dlxiX(&rgsb+hnE?k`6qAIJ zQT}{J-i!>mGUvnaI}JJPHdakYc+AJump#j@N>+tzhPprTvbRZET+@V{X(F%&OQ3-T zFO~9xNf){{QGQW9Y)e}8j!CkDMu`H!V)tgA*126k%dg}r-?VOnQo>ANoldRHTrkY z(fRUKqMfIURKpcgfi8Tc{(rPy2;qn>hU5GscExUhCZISmm<#Y1wIGs_1 z-2kzRX%Evtr zHj0(Nca1;!mKOHk3}@H&pD~ zP9k%ct|~W2!eC$CzqD(stsL*$*qA66`&P9k8hs(sLcre%3dpxD; zzJ)Oei7oCwyMI}~+Lfj}yNiv7SFc|C5cVBj%f`d(A24Bih9Q!#Wm=>@f$EG=CV7ez z27{%{CUV!(?s6(~*^N`Syy)11c$_MiMRWcmlMGz3XcswOnu-V4oY0-`5H{|7N3xII zh*=UZe?~B_1jFo3YkPp%wbicwSd#5*b23(L-g#4dQ)0+mTN0PqIE%eo*;zq?W~@c6 zY{n^&W>2zuXSpSR6`S=jlYl$gDxq03W~CUN{LgB+v|c6@lo7yyAl}1Q*A}w9iYLlQ z0R_>yJ&I;2b1%K~Rq~?Y97DQQDuqN5gsT2cxGEJ_4Ik=Hx3_9#TM9$oSfDZLj12Wm z<`yxB%L1R6;9gnNwz}V$UD%(v^I~{MW2`j6#&iCfsthC(;u*8Ct%j&z1X=P`XW^PyvuW7L* z3$t_WeT%s!F~*dgZ8FSUjb%(c3$0q#+>JcGwuNz(22oE*`J;7H?PjbM1xa_2W~w1` z^{Y*e+Ra#dTlLVN(8#21Yi4iBZ)F@FLQ0L5nZNZc;u$*>8#T|FZP?8ic@v)9N9vC4 zjPa@Rn%ri_yw$dN3ws%}h2~hn>68jbk8rX9@<5f+1_HXNAy%3sULR^>w!>#iYD71u zwoU`L1mvfTv+iZbOKok;FyiW3ZNx-5*zuTp)0d5ONQ0?q%)m-yWTpDJ&tRnfxjbt^eZYN&T#|J&@RWSTchTi97{`K6Vb4= zu{`6hah6P@Y4Z#*Z5kn$RVM?KTT~q-9$1mCWu0QK8M!K9VSy)5S!Vb>O#GpK7; z3ywJRsr)l`FK&h$T^zIoRwHHA|LTf1N1XL6%#MQc0I6jnh=$MSk|s8+da6au_d{lY z>wSI#I}In^%LKZ>dyT2eGe7DyYkg@(b!feXfhhK#oGe7K8d7G2BR4A*MxO$Fnzgz1 zSC(Lrz6=eh{mb}RC17k<09AjihMTjDCsxs+3eX5u7M)oGDr%vOhQ{J=2*bBsuET&~ zm$hUuBb~>JW(`Q7XY~Bm--sc8F@?2dEe*ace!J{djV%-Dqi8 zI7^dhRJK8&af|>{9qCcThRd^JZCd+RCPyXEo&0G<@B2t!{rB{|@7zq#uyvYhe~*tq zQr45q9+c5HSm4gXOw(!_-F^qg!RE-myQ^*BJdBdrC^LO)TFx{JaEP2@f>W;CxP3FK z2YN9kFm^C=dIS?=Ax$uGyvqmM%Nl1 zdb_a(?^jV))2d+BP)KAuIMX-m=nB_hoVT?iYiEsok58bCDybX!jF;8nDN$n>f!^2F z&`>G_R!fFWPw%iCa?+752?^R$obVLleI$Ee(hQ$S{~@InxMR!da(l~ZdcPYZORXkHJw?HifNtDrjGKs-5`hZr9LIz$o(eD<7M>X3FHFjzki=B-{9~+03aF+TUcnq?TJ*}%H#Rcd1 zc&Fe*Z0|iY`OYXIEzbV+`G!M7lox~!av@4!M#ht+`*bAEq(bPxPHsFfvjACg*HTRU zz(YH-42rQT>}4d+0-9Jw%ywpm_msGkCin^zo8(*@s84Eabs{Qt`>14;lC)JYzD-Y) zT3VY@hm>c~o-fO#2~|zlCCZsxBOTSu7@g{XsM;?JT_tNik4HzT~9L}VdTN;r; zN($j%V8)py&73+GPn5gt{vW%VZShT;$!~`ufgrNIzR~AwtM57Q*p}ZNcgkaI@U0nC zwv8<3cK_~llWAvsoSiUoHx6+PQ4Tf%hY@D(p~T&F(P;=@O-l;Ufy&SZyz{-@aWKli z!7O%gdf4M}T+r|GI+j;>uGwXrBWtkHU3f@|V^2nD2D212(XQXb7uil|E)}D2JrtAR zd}Doy_>pPD2pzm5=25qLvgKGisgw+Nwn`tdU#^5QQ-_rqFL|w!5rnJdnJFG?q6RLh zBi~@QWB6LO47csUq|{>r%ThH@m+u@t#JXgBt+~MK}KVy*h)JJ`7jL7!EIExZ9ollvxynIHjK@>v?~he#k}R?2Xj0}2eC-Z zhrAUw2CdEcmRxFo3Ht={wDtErJ>YE-ilF_;E9@DZCk)vI&ZX*ZPURES+|VU)qZ;u)w`&R%)L zq>e;GHxh)nN!tUtPF7jxE9PNb1a~(y6ZAcG(+qu5dYHY%EGbc*?`sZ0D&ANsF#K7% zlT=}InV84M#2;-8<;so;uX6j4!p+y-#2ZW~%&D5{er$oT^^6=UJZa`iTY1@6CbrYL ziYEVw?~zU>EVQP-TUd~o; zERRc**;z;d`Xw2Y2 zvnuSnG;Ehnu*1EsF0YPh_mMA*1VtrmoL<%f5H*kHrMy*prm(omEGH|a+B;p|DVe<* zMs7YyKh7#-Mzbv=ppEEESU2IbRa#fOrw?x5zIN-#+D#7`9LVXco_Elg#7Yb7bgl^u z$&E&B8oMScLBXlw{fe3EzIKWh9S$;mI}^L1kkh;vrL-UmCSyES@$)P&2Q$(AL;q!BCJQ|{zqo1wR zSH*^9UXv478Ox?;x*G2-724b{K`$NZn7Svp)l8&j1KRg+&!*-P^QJ{>P??6J`x8hC zLX=csHm7xlf}Y}hHM5FByevM6)r4$QA9i%tYgx`DQlUg~wkp_BeBp**5d}L{<H~YpfnD*Xr)EQ7BM>GJc|@q?HVsVHiEm)HPMa1rU(KfBVvd-A-x!<-!W~>ca5KJ zvC6@BjW-Pu0Vl7LZ5p4=*JUij?C34InYY(k@rMTBca(?US<-0{;+(+;snCH7%scoqH1bW^B%^5=1HrI z_Yu7zEQcdtp|O z)QKo_Bg=MQ^1V^2x0VsNnvmU^OYi+jK_o-ETpL^t~J}zzS|@?lQr)1 zpqVm1iZnls{%q%a#xG2_(yGFzncbp#a_2Fti-Se4M`tqYOC!Q2FlP}*js0P~ET-T3 zbi3aO(0+ z`B_IxFoQU_Ic|eY~-5bMmBieAEj5$1r z4JcI>v9XYBQ+NbFOpPU@phJbm?N5hhBr)Aan!56|D2g&tiAW}k8-v{Ao+dN^;!aWD zhA~^6<%Wj@ieeTTkGW)__oEfoBV1Iv{$@E_I*e+-fgMq{z(7vCjzR`1I?l3d5 z+%sh|umx{tbel;V?K!#e;RC@`2)q0<&{a}%u+XKMHVK>O)L!J)AeKpOGIDteiT}d; z4%*5R7I-Z=YPOZ2Yy4J{v7}_A$SH!9aHB0u6Juc?f)qu4qO?7KQJXtn2 zV$%CdccV3)^{HG%I8UbW$^1|B`An7&)js+ptUYdrwf%owwZQi9B~kI%N9sYAIcG7% zm~+@jq1~meVKML(0fKEbB699lf-_BD*Y;VkbbUr3Q_A6`{*i(9X9Y+jag36L(QaQA z2vSR&5q>etkhWdDiXnniW65;KOej#8_>}?d0*09n&V6SSzBiCPi>Yd>BW(2m-n~f9 z7QBxT@h=a|{^CF&%24#6xnxY#9ZKP=1C}(4)Wgb@T`s?9oIX^uW}hI?WH?Gs7>?1+ zuLk}*j2HYYFd&$piRrjeP&OS93Ln{c51ZjQ-@?&P4=WT}d`m+RZ&t55CkCRlnQ=BS z|B-C+UIS|n?*&=8>&rDZ`DcAAEP}OI%v04-Po!?p#l#v(!3f_fNVBgO*mNkxbZ46t zmXcc(1$m~PA&rtPeF>i}kh_X^%H?U&JJcl^X$NF_mQn~k#9vM(dmxMRmDrCDZZf&x zPiJ2;$SI8^gzwu&4#fX)qK4?sxUd9Cgj2;7C{^>K%U04H^?39<<2IR%~_ai^B%MK8NPpzKf|lDW5hp$kY1_n%)@68 zI!`bs{1XWINAGoVSpwJ%_$p_86G7AmPraj5U7CK+DA2 zH`M;-!EfJY33mH_+c~jNZ;>M(o4_Wh^zQJHg=8D~$L}NXD_Hm#5f&EOrh#t0kf1e3 zn)~;eHQA99gygE+zIH=YOO)4&gn1Vx9QbO2DZZL;x>{;kr*DxZ9te!EQcAU9M@qBW z7>)Arp(ux_POZU%36^)rs#Obe2#L>U;yG>a|z)2U5J zMXnni=VF!;Dy(5+)Zs8J%>6Q(X~4o^QHItS>$?gV%Kp1twOLn%Yiv*IoOX$Er_#=Nrz!n(6BHfV*0 z^ryCxVRjv#Y_RCOU})tRy5Kv{-;(nk$H1%)H(+SGKI9Y1f8R4x%%;^UwInVf^tsIf zzA^ilLl%`H-r=4wh*eZH#}j5i=Bzb0jOR$$wsS2>VU8rm@%EYlJs>wgwA|--K1+cq zYfEp#r0pC@t@BZZH8B&aKS!!8!)&SD9EsW$bGK|PBIQmIUuCdXeV4{JZ4rw=#1knQ`Xrbc~5>O)jJG({Dbz?njqO(-o( zG@TU{4U@r$Bjc^vBE|%=YS95R^g?B?Z&BcDVt$$m#%AdJ9z|k7-g1c8oSD8yVY(Sj zXs-)iSehrL{cN*2*b5_B3x8B$Q=kS)U{X#^5hoOaatqsJaj$6uX0fL2HL&8@Xg%h{akIfJjHuLz<~-ZPH5=7)yuh4+ zxq2cCl~IKb%7-%LkN2&9dl;4p2wNmxb1wQA!Q9;8n}CsPMfC z0{w6-P7|oXXlp<2?B7Kc#gu2nzg&U&NP}TR)5Ccgm5Z~MW*Dg4zh0qeDU0Y5L9Pi^ z_BYu0Zof8szrwq}eVG=~7p0-A+^!YLq|a33T`|PvLG_q`wrH`COvn8ZC~FKS8KB)v zU-oHVQoHULmSSgt=vD{Vi!5%65<`_D{b!1{Y|S_?sHO=a5%ZD`r%;%3CCW9^-SYRj zZUZS?^Kk~vS{P3)W<^PC10RjUkP_9`hGqLS%%V4$g7b)a{MdZ+!bXcvtJ98LbIzX? zxRgME@D?PVca6(Ekq%pQX-*f@Ywv0DkqJ;z=PKd$W1bz~$S}f83Zs0E$LC61w+Yct zyiyTyE+mXq`(kx3S@yvUIfSfaT6)l)$_=DGsQ>{kGa1#Nz`~g;?n?OV2TJ$rQP$Y{ef+z~vw>*MyiBI)ppc{%uRY;MPodBXR=?BrQ|wLmVU>L7;ks^ zUW#*)2&eYfJqmo@gVd;?L8F$Q3BkjFq7cAUWz$@2IwvM4zZH|@`nrc{ZCor9lv-y~ zU{lFd3pI*=@x$VSr2uB}Wcv1pvY(+cS|FdxjI#6sDt;?Rw z8>A5_V!#Xni}Z??xynIH%WWZLNCt6KDtw#k zlKI@_>@&WD1maN^{bDZg!4MVJW?u@4X-oWuokSz4eY=(fV>a8!JA0CF9Mb~L(+-tE z4C7@fN0u*9YFU_Y?hz+3QzVvH!$;Np9uhD8dlE1EdlE12NIX|#pfYRoiFPfpFX&Y< zceg9@w_HbZD$SlC_;|(>fjv4cdV@(N;?vUT<$Po~c27;8Cc(Iog%Ngc39eB4go%Yt zm|drIi1axE<~@jz3H`XgPZ)g|RWK{Lgf+BbMV(`SQ6XwmiFy-^EiDIvMl*&3Rnu6| zs@AWHn$b7W+n@@M>enSrYqMpX2n(aajaWG=m@6N~sA{D3XqBYR zrbGCOt=!H{2a2q+#zJARrL3+O5WPJV%;anbq}e)Lhb+j_1!X8^XrTe(4RT7Dr#CM_ zXb?HVQ7dPvZu!lJq;i;287;xNlsSC}Wp8!PWKd@EH?HRv^w)sD8pH_ zr@JsZ9UGlNfv$mhb3!Io{f-7x>vvQNLo6;-lQy1YQIpxmJ+=0=kZ}^%2a=iAy-DQZ ztSuz=ag<5sj){@hunWfjjL9t1Bk>mUsgzREc8U3O^b@&eOcVB<`G0IQnTi=#T2e*y z?+&*{pZKgc6hTY$okcVN*u+CirfCXBBa^_!+&IZ*~n11!>n1i@z|i6gVEQ*L0F8UD=Fc zM*5V9_s0*exO;2Xi;(T14(cb9xM*p-+*F#Zq=~NyiCu$&8^Xzb%7Uh*f#@TPB&1q4 zA#R=G9uZrMLdFa=x8@Pk7R13b4Z=?U-fS!vq`c)q1Cfg>neNjPLn0C!#>L{QtT_QzE=3{wtV5*ZiKXWRoAgYdL7de!dR`+f_6*DDENsoR zF=dmBXo(Hu@8p>n7NCe@3XE*BAz~v39 zzU@Y)ADS{#h~tnqg{mkw2nRZUG-S+y5TBqEn56CbL99MmbK7wE{-$-mucXy~KO%V+p5l8{xS-M>-e7(oJWRrX>w79#x;%#Qwb-VAjxX3z#?7S|y#JKr|K&2L(0=iJhBBs z^WJJt9xD;ex%bVP%{8tCHK?NM9s5h-Om%Qqk&D|B6FZ3iO zj?6?nM57j!i#F7N6-S9(MrU-S4Wi^t7S(ajY=YI5>>!fKT?-Xzhg9o zK_Fjt5XT~`Fg1AM zXisK5m1r5idk$b-VyW$YXVRqOJc%un{ZQK)V?t@T#*Lfc@{gat! zwbRbc+0BF$fjRac&1FT#k{L+e3fZvRrhRv(oe{lb6CP6gysquYrT)aKn^Om&tA< z0{`Y4K57tH$Lx>z3`J`@3zvX|Y!+LyIe5=?3fY;M!U8j=N35uIwDpJ0bF`WkJOu8FHJ!k8d zk6Wguo$0MX#0Jeqj%_jQO?SC4q<(81vdKSlci=b#;%o_9!&>j-c}lU0ZBV@ zZGVD@ZqdX5%&>D}xTAbALeJP+yBw}bqc+WW8@(u&W|mbpBrrUzMQjC4M(AqC{2FlO z1zl4`N*$?z#?2buiXd$@tpf93? zGM3CPGmj%)9(^1j!QBKOitz|W9!{W{MNIaZT(O~&twHcOJd&HL#aI@pF9_c-s&(O@ UV!po)J7m#|$CmM>imv4U0DVd1%m4rY literal 0 HcmV?d00001 diff --git a/locale/it/LC_MESSAGES/bittorrent.po b/locale/it/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..95ebce5 --- /dev/null +++ b/locale/it/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2898 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# Vincenzo Reale , 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-10 22:29-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Italian\n" +"X-Poedit-Country: ITALY\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installa Python 2.3 o successivo" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Richiesto PyGTK 2.4 o superiore" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Inserisci URL del torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Inserisci l'URL di un file torrent da aprire:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "connessione" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cavo 128k e superiore" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cavo 256k e superiore" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k e superiore" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Velocità massima di invio:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Ferma temporaneamente tutti i torrent in esecuzione" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Riprendi il download" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "In pausa" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Nessun torrent" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Esecuzione normale" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Firewall/NAT attivato" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nuova %s versione è disponibile" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Una nuova %s versione è disponibile.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Stai usando %s, e la nuova versione è %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Puoi sempre ottenere l'ultima versione su \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Scarica più tardi" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Scarica adesso" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "Avvisami dopo" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Informazioni su %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versione %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Impossibile aprire %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Donazione" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Registro Attività" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Salva registro in:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "registro salvato" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "registro cancellato" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Impostazioni" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Salvataggio" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Salva i nuovi download in:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Cambia..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Chiedi dove salvare ogni nuovo download " + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Download in corso" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Avvia manualmente i torrent supplementari:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Ferma sempre l'ultimo torrent in esecuzione" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Avvia sempre il torrent in parallelo" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "Chiedi ogni volta" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Seeding..." + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Seed dei torrent completati: fino al raggiungimento [_] % del tasso di " +"condivisione, o per [_] minuti, qualunque sia il primo." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Seed indefinito" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Seed dell'ultimo torrent completato: fino al raggiungimento del [_] % del " +"tasso di condivisione." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Rete" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "cerca una porta disponibile:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "inizia alla porta:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP da riferire al tracker:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(non ha effetto a meno che tu non sia\n" +"sulla stessa rete locale del tracker)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Il testo nella barra di progresso è sempre nero/n (non richiede riavvio)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Varie" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"AVVISO: Cambiando queste impostazioni\n" +"%s potrebbe non funzionare correttamente." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opzione" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valore" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avanzate" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Scegli directory predefinita dei download" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "File in \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Applica" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Alloca" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Non scaricare mai" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Diminuisci" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Aumenta" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nome file" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Lunghezza" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peer per \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Indirizzo IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Client" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Connessione" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s in entrata" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s in uscita" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB scaricati" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB inviati" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% completato" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s stimati download peer" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "IP peer" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interessato" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Intasato" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Affrontato" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Invio ottimistico" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "remoto" + +#: bittorrent.py:1358 +msgid "local" +msgstr "locale" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "peer errato" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d errato" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "vietato" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informazioni per \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nome torrent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent senza tracker)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Url di annuncio:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", in un file" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", in %d file" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Dimensione totale:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Parti:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Hash informazioni:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Salva in:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nome file:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Apri directory" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Mostra lista file" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "trascina per riordinare" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "clic tasto destro per il menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informazioni sul torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Rimuovi torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Interrompi torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", effettuerà la distribuzione del seed per %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", effettuerà la distribuzione della fonte completa all'infinito." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Completato, rapporto di condivisione: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Completato, %s inviato" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Completato" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Info sul torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "Apri directory" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Lista file" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Lista fonti" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "Cambia posizione" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "Seed indefinito" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Riprendi" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "Finisci" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "Rimuovi" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "Interrompi" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Sei sicuro di voler rimuovere \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "il tuo tasso di condivisione per questo torrent è %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Hai inviato %s a questo torrent. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Vuoi rimuovere questo torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Finito" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "trascina nella lista per distribuire la fonte completa" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Fallito" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "trascina nella lista per riprendere" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "In attesa" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "In esecuzione" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Attuale in uscita: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Attuale in entrata: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Precedente in uscita: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Precedente in entrata: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Tasso di condivisione: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s peer, %s fonti complete. Totali dal tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Copie distribuite: %d; Prossima: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Parti: %d totali, %d complete, %d parziali, %d attive (%d vuote)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d parti errate + %s nelle richieste scartate" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% completato, %s rimanente" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Tasso di download" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Tasso di invio" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "ND" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s avviati" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "Apri file torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Apri URL torrent" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Crea nuovo torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "Pausa/Avvio" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "Esci" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Mostra/Nascondi torrent completati" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "Ridimensiona finestra" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "Registro" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "Impostazioni" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "Aiuto" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "Informazioni su" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "Donazione" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "File" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "Visualizza" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Cerca torrent" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(fermato)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(multiplo)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Sto già scaricando l'installer %s" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Installo il nuovo %s ora?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Vuoi chiudere %s ed installare la nuova versione, %s, adesso?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s l'aiuto è qui \n" +"%s\n" +"Vuoi andarci adesso?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Vuoi visitare la pagina di aiuto sul web?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "C'è un torrent completato nella lista." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Vuoi rimuoverlo?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Ci sono %d torrent completati nella lista." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Vuoi rimuoverli tutti?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Rimuovere tutti i torrent completati?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Nessun torrent completato." + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Non ci sono torrent completati da rimuovere." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Apri torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Cambia posizione di salvataggio per " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "File già esistente!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" già esistente. Vuoi scegliere un nome file differente?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Posizione di salvataggio per " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Directory già esistente!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" già esistente. Vuoi creare un duplicato della directory all'interno " +"di quella già esistente?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(messaggio globale) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Errore" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Si sono verificati errori multipli. Clicca OK per vedere il registro errori." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Vuoi fermare il torrent in esecuzione?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "Stai per avviare \"%s\". Vuoi fermare l'ultimo torrent in esecuzione?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Hai già donato?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Benvenuto alla nuova versione di %s. Hai già donato?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Grazie!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Grazie per aver donato! Per donare ancora, seleziona \"Donazione\" dal menu " +"\"Aiuto\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "sconsigliato, non usare" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Creazione o invio del comando attraverso il socket di controllo esistente " +"fallita." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Chiudere tutte le %s finestre potrebbe risolvere il problema." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s già in esecuzione" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Invio del comando attraverso il socket di controllo esistente fallito." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "" +"Impossibile far partire la coda del torrent, guardare sopra per leggere gli " +"errori che hanno causato il problema." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s creatore metafile %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Crea il file torrent per questo file/directory:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Scegli..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Le directory diverranno torrent batch)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Dimensione parte:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Usa _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Usa _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Nodi (opzionale):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Commenti:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Crea" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Porta" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Creazione torrent..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Controllo dimensioni file..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Inizio seeding" + +#: maketorrent.py:540 +msgid "building " +msgstr "creazione " + +#: maketorrent.py:560 +msgid "Done." +msgstr "Completato." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Creazione torrent completata." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Errore!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Errore nella creazione dei torrent: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d giorni" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 giorno %d ore" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d ore" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minuti" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d secondi" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 secondi" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Aiuto" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Domande frequenti (FAQ):" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Vai" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Scegli una cartella esistente..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Tutti i file" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrent" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Crea una nuova cartella..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Seleziona un file" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Seleziona una cartella" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Impossibile caricare stato salvato:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Impossibile salvare stato UI:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Contenuti del file di stato non validi" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Errore durante la lettura del file " + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "Impossibile recuperare completamente lo stato" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Stato del file non valido (entrata duplicata)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Dati corrotti in " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , impossibile recuperare torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Stato del file non valido (elemento errato)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "File di stato UI errato" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Versione del file di stato UI errata" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versione del file di stato UI non supportata (da una versione del client più " +"nuova?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Impossibile cancellare il file %s in cache:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Questo non è un file torrent valido. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Questo torrent (o uno con gli stessi contenuti) è già in esecuzione." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Questo torrent (o uno con gli stessi contenuti) è già in attesa di essere " +"eseguito." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent in stato sconosciuto %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Impossibile scrivere il file" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "il torrent non sarà riavviato correttamente al riavvio del client" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Impossibile eseguire più di %d torrent simultaneamente. Per maggiori " +"informazioni leggere le FAQ su %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Non avvio il torrent poiché ci sono altri torrent in attesa di esecuzione, e " +"questo corrisponde già alle impostazioni di quando smettere di distribuire " +"il seeding." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Non avvio il torrent poiché questo corrisponde già alle impostazioni di " +"quando smettere il seeding dell'ultimo torrent completato." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Impossibile ottenere l'ultima versione da %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Impossibile analizzare la stringa nuova versione da %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Impossibile trovare una locazione temporanea dove salvare l'installer %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Nessun torrent disponibile per l'installer %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "L'installer %s %s sembra essere corrotto o mancante." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Impossibile lanciare l'installer su questo Sistema Operativo" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"la directory nella quale i dati variabili come le informazioni fastresume e " +"lo stato GUI sono salvate. Default nella sottodirectory 'data' della " +"directory config di bittorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codifica dei caratteri usata sul filesystem locale. Se lasciato vuoto, viene " +"rilevato automaticamente. La rilevazione automatica non funziona con " +"versioni precedenti di Python 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Codifica ISO della lingua da usare" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ip da riferire al tracker (non ha effetto se non si è sulla stessa rete " +"locale del tracker)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"numero di porta visibile globalmente se è differente da quello sul quale il " +"client è in ascolto localmente" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "porta minima in ascolto, aumenta se non disponibile" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "porta massima in ascolto" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ip su cui effettuare il bind localmente" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "secondi tra gli aggiornamenti delle informazioni visualizzate" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minuti da attendere tra le richieste di più fonti" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "numero minimo delle fonti per non effettuare una nuova richiesta" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "numero delle fonti a cui interrompere l'inizio di nuove connessioni" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"numero massimo di connessioni da permettere, dopo cui le nuove connessioni " +"saranno chiuse immediatamente" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "se controllare gli hash su disco" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "kB/s massimi da inviare, 0 significa nessun limite" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "il numero di invii da riempire con extra antiintasamenti ottimistici" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"il numero massimo dei file in un torrent multifile da tenere aperto in una " +"volta, 0 significa nessun limite. Usato per evitare di esaurire i " +"descrittori dei file." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inizializza un client senza tracker. Deve essere abilitato per scaricare " +"torrent senza tracker." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "numero di secondi di pausa tra gli invii di keepalive" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "quanti byte richiedere per ogni richiesta" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"lunghezza massima del prefisso di codifica che sarà accettato sul " +"collegamento - valori maggiori causeranno la caduta della connessione." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"secondi da attendere tra i socket in chiusura dai quali non si è ricevuto " +"niente" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"secondi da attendere tra il controllo delle connessioni che sono andate in " +"timeout" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"lunghezza massima dello slice da inviare alle fonti, chiudi la connessione " +"se viene ricevuta una richiesta maggiore" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"Intervallo di tempo massimo sul quale stimare i tassi attuali di " +"scaricamento e invio" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "Intervallo di tempo massimo sul quale stimare il tasso attuale di seed" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"tempo massimo da attendere tra i nuovi tentativi di annunci se essi " +"continuano a fallire" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"secondi da attendere per i dati in arrivo su una connessione prima di " +"supporre che sia quasi permanentemente intasata" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"numero di scaricamenti al quale passare, da casuale a prima il più raro" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "quanti byte scrivere in una volta sola nei buffer di rete." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"rifiuta ulteriori connessioni dagli indirizzi con fonti errate o " +"intenzionalmente ostili che mandano dati incorretti" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "non connettere a più fonti che hanno lo stesso indirizzo IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"se non zero, imposta l'opzione TOS per le connessioni alle fonti a questo " +"valore" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"abilita rimedio per un difetto nella BSD libc che rende la lettura dei file " +"molto lenta." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "indirizzo del proxy HTTP da usare per le connessioni ai tracker" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "chiudi le connessioni con RST ed evita lo stato TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Utilizza librerie Twisted network per le connessioni di rete. 1 significa " +"usa twisted, 0 significa non usare twisted, -1 significa autorileva, con " +"preferenza per twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nome file (per torrent a file-singolo) o nome directory (per torrent batch) " +"da usare per salvare il torrent, che prevarrà sul nome di default nel " +"torrent. Vedi anche --save_in, se nessuno è specificato all'utente sarà " +"richiesta la posizione del salvataggio" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "mostra interfaccia utente avanzata" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"il numero massimo di minuti per distribuire la fonte completa del torrent " +"completato prima di interrompere il seeding" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"la velocità minima di invio/download, in percentuale, da ottenere prima di " +"interrompere il seeding. 0 vuol dire senza limite." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"la velocità minima di invio/download, in percentuale, da ottenere prima di " +"interrompere il seeding dell'ultimo torrent. 0 vuol dire senza limite." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Seed infinito di ogni torrent completato (fino alla cancellazione da parte " +"dell'utente)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Seed infinito dell'ultimo torrent (fino alla cancellazione da parte " +"dell'utente)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "avvia lo scaricatore in pausa" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"specifica come l'applicazione dovrebbe comportarsi quando l'utente prova ad " +"avviare manualmente un altro torrent: \"replace\" significa sostituisci " +"sempre il torrent in esecuzione con quello nuovo, \"add\" significa aggiungi " +"sempre il torrent in esecuzione in parallelo, e \"ask\" significa chiedi " +"all'utente ogni volta." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nome file (per torrent a file-singolo) o nome directory (per batch torrent) " +"da usare per salvare il torrent, che prevarrà sul nome di default nel " +"torrent. Vedi anche --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"il numero massimo di invii consentiti in una volta. -1 significa " +"(idealmente) un numero ragionevole basato su --max_upload_rate.I valori " +"automatici sono sensibili solo eseguendo un torrent alla volta." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"directory locale dove i contenuti del torrent saranno salvati. Il file " +"(torrent a file-singolo) o la directory (torrent batch) saranno creati sotto " +"questa directory usando il nome di default specificato nel file .torrent. " +"Vedi anche --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "se chiedere o no una posizione nella quale salvare i file scaricati" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"directory locale dove i torrent saranno salvati, usando un nome determinato " +"da --saveas_style. Se questo viene lasciato vuoto ogni torrent sarà salvato " +"sotto la directory del file .torrent corrispondente" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "quanto spesso riesaminare la directory torrent, in secondi" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Come dare un nome agli scaricamenti torrent: 1: usare il nome DEL file " +"torrent (senza .torrent); 2: usare il nome codificato NEL file torrent; 3: " +"creare una directory col nome DEL file torrent (senza .torrent) e salvare in " +"quella directory usando il nome codificato NEL file torrent; 4: se il nome " +"DEL file torrent (senza .torrent) e il nome codificato NEL file torrent sono " +"identici, usare quel nome (punti 1 e 2), altrimenti creare una " +"directoryintermedia come nel punto 3; AVVERTENZA: le opzioni 1 e 2 hanno la " +"capacità di sovrascrivere i file senza preavviso e possono presentare " +"problemi di sicurezza." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"se visualizzare il percorso completo o i contenuti torrent per ogni torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "directory da esaminare per i file .torrent (semi-ricorsiva)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "se visualizzare le informazioni diagnostiche sullo standard output" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "a quale potenza di due impostare la dimensione delle parti" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nome di default del tracker" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"se falso crea un torrent senza tracker, invece di un URL di annuncio, usa un " +"nodo affidabile nella forma : o una stringa vuota per prendere " +"alcuni nodi dalla tua tabella di instradamento" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "download completato!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "finirà in %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "file scaricato con successo" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB in uscita / %.1f MB in entrata)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB in uscita / %.1f MB in entrata)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d conosciuti, più %d copie distribuite (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d copie distribuite (prossima: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d conosciuti" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ERRORE:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "sto salvando: " + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "dim file:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "percentuale completata: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tempo rimasto: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "scarica in: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "tasso di scaricamento: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "tasso di invio: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "punteggio di condivisione: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "stato fonti complete: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "stato fonti: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Non puoi specificare entrambi --save_as e --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "chiusura in corso" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Errore durante la lettura della configurazione: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Errore durante la lettura del file .torrent: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "devi specificare un file .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Inizializzazione GUI in modo testuale fallita, impossibile procedere." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Questa interfaccia di scaricamento richiede il modulo Python standard " +"\"curses\", il quale sfortunatamente non è disponibile per la traduzione " +"nativa in Windows di Python. E' comunque disponibile per la traduzione " +"Cygwin di Python, eseguibile su tutti i sistemi Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Puoi usare ancora \"bittorrent-console\" per scaricare." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "file:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "dimens:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "dest:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progresso:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "stato:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "velocità in entrata:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "velocità in uscita:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "condivisione:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "fonti complete:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "fonti:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d conosciuti, più %d copie distribuite(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "errore(i):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "errore:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Inviati Scaricati Completati " +"Velocità" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "sto scaricando %d parti, hanno %d frammenti, %d di %d parti completate" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Questi errori sono occorsi durante l'esecuzione:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Utilizzo: %s URL_TRACKER [FILETORRENT [FILETORRENT ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "annuncio vecchio per %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "nessun torrent" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERRORE DI SISTEMA - GENERATA ECCEZIONE" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Avviso: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " non è una cartella" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"errore: %s\n" +"eseguire senza argomenti per la spiegazione dei parametri" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"ECCEZIONE:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Puoi usare \"btdownloadheadless.py\" per scaricare." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "collegamento alle fonti" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tempo rimasto %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Dimensione" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Scaricato" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Inviato" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totali:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s fonti %s fonti complete %s copie dist - %s giù %s sù" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "errore: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"eseguire senza argomenti per la spiegazione dei parametri" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "commento leggibile-dagli-umani opzionale da mettere nel .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "file di destinazione opzionale per il torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodifica %s file metainfo" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Utilizzo: %s [FILETORRENT [FILETORRENT ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "file metainfo: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "informazioni hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nome file: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "dimensione file:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "file: " + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nome cartella: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "dimensione archivio:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "url di annuncio: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "nodi trackerless" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "commento:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Impossibile create il socket di controllo: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Impossibile inviare il comando: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Impossibile create il socket di controllo: già in uso" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" +"Impossibile rimuovere il vecchio nome del file del socket di controllo:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Mutex globale già creato" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Impossibile trovare una porta aperta" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Impossibile creare la cartella di dati per l'applicazione" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"Impossibile acquisire il lucchetto del mutex globale per il file di " +"controlsocket" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "Una precedente istanza di BT non è stata cancellata correttamente. " + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "non è una stringa bencoded valida" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "valore bencoded non valido (dati dopo un prefisso valido)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Utilizzo: %s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPZIONI] [CARTELLATORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Se un argomento non-opzione è presente è preso come\n" +"il valore dell'opzione torrent_dir .\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPZIONI] [FILESTORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPZIONI] [FILETORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPZIONE] URL_TRACKER FILE [FILE]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "gli argomenti sono -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (default a " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "chiave sconosciuta " + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parametro passato alla fine senza valore" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "analisi della linea di comando fallita su " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "E' necessaria l'opzione %s." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Devi fornire almeno %d argomenti." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Troppi argomenti - %d massimo." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "formato errato di %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Impossibile salvare permanentemente le opzioni: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Annuncio tracker non ancora completo %d secondi dopo averlo avviato" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problema nel connettersi al tracker, gethostbyname fallito - " + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problema nel connettersi al tracker - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "dati errati dal tracker - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "rifiutati dal tracker - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Sto interrompendo il torrent poiché è stato rifiutato dal tracker mentre non " +"era connesso a nessuna fonte." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr " Messaggio dal tracker: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "avviso dal tracker - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Impossibile leggere la cartella" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Impossibile generare statistiche" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "rimozione %s (verrà riaggiunto)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**avviso** %s è un torrent duplicato per %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**avviso** %s contiene errori" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... riuscito" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "rimozione %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "controllo completato" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "socket del server persa" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Errore durante la gestione della connessione accettata:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Devo chiudere a causa dell'errore TCP stack flaking out. Per favore " +"consultare le FAQ su %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" +"Troppo in ritardo per commutare backend RawServer, %s è stato già " +"utilizzato. " + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Lun" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Mer" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Gio" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Ven" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sab" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Dom" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Gen" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Mag" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Giu" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Lug" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Ago" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Set" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Ott" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dic" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Compresso: %i Non compresso: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Non puoi specificare il nome del file .torrent quando stai generando più " +"torrent multipli in una sola volta" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "La codifica del filesystem \"%s\" non è supportata in questa versione" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Impossibile convertire il nome file/cartella \"%s\" in utf-8 (%s). O la " +"codifica del filesystem assunta \"%s\" è errata o il nome del file contiene " +"byte illegali." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Il nome file/cartella \"%s\" contiene valori unicode riservati che non " +"corrispondono a caratteri." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "dati errati nel responsefile - totale troppo piccolo" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "dati errati nel responsefile - totale troppo grande" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "sto controllando il file esistente" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 o le informazioni fastresume non coincidono con lo stato " +"del file (dati mancanti)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Errate info di fastresume (i file contengono più dati)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Errate info di fastresume (valore illegale)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "dati corrotti sul disco - forse hai due copie in esecuzione?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Impossibile leggere i dati di fastresume:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"comunicato file come completo all'avvio, ma una parte ha fallito il " +"controllo hash" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "File %s appartiene ad un altro torrent in esecuzione" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Il file %s è già esistente, ma non è un file valido" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lettura breve - qualcosa ha troncato i file?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formato del file di fastresume non supportato, forse da un'altra versione " +"del client?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Un altro programma sembra aver spostato, rinominato o eliminato il file." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Un altro programma sembra aver modificato il file." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Un altro programma sembra aver cambiato la dimensione del file." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Impossibile impostare il gestore del segnale: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "abbandonato \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "aggiunto \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "in attesa del controllo hash" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "sto scaricando" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Nuova lettura del file di configurazione" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Impossibile generare statistiche %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"%s\n" +"non ha potuto trasferire o aprirsi. Prova ad usare un browser web per " +"scaricare il file torrent." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Questa sembra essere una versione di Python vecchia che non supporta il " +"rilevamento della codifica del filesystem. Si assume per default 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Phyton ha fallito l'autorilevamento della codifica del filesystem. Al suo " +"posto viene usato 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"La codifica del filesystem '%s' non è supportata. Al suo posto viene usato " +"'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componente del percorso del file errato: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha i nomi " +"dei file codificati incorrettamente. Alcuni o tutti i nomi dei file possono " +"apparire diversi da quanto il creatore del file .torrent intendeva." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha valori " +"dei caratteri errati che non corrispondono a nessun carattere reale. Alcuni " +"o tutti i nomi dei file possono apparire diversi da quanto il creatore del " +"file .torrent intendeva." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha i nomi " +"dei file codificati incorrettamente. I nomi usati possono tuttavia essere " +"esatti." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Il set di caratteri usato sul filesystem locale (\"%s\") non può " +"rappresentare tutti i caratteri usati nel/nei nomi dei file di questo " +"torrent. I nomi dei file sono stati cambiati rispetto all'originale." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Il filesystem di Windows non può gestire alcuni caratteri usati nel/nei nomi " +"dei file di questo torrent. I nomi dei file sono stati cambiati rispetto " +"all'originale." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Questo file .torrent è stato creato con uno strumento errato ed ha almeno 1 " +"file con un nome di directory o di file errato. Comunque siccome tutti quei " +"file erano contrassegnati come aventi lunghezza 0, tali file sono stati " +"semplicemente ignorati." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "E' necessario Python 2.2.1 o successivo" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Non si possono avviare due istanze separate dello stesso torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport minore di minport - nessuna porta da controllare" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Impossibile aprire una porta di ascolto: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Impossibile aprire una porta di ascolto: %s. " + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Controlla l'impostazione dell'intervallo delle porte." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Avvio iniziale" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Impossibile caricare i dati di fastresume :%s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Verrà eseguito un controllo completo sull'hash." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "la parte %d ha fallito il controllo hash, verrà scaricata nuovamente" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Tentativo di scaricare un torrent senza tracker con un client senza tracker " +"disattivato." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "scaricamento fallito: " + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Errore IO: non c'è più spazio su disco, o impossibile creare un file così " +"grande:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "terminato a causa di un errore IO:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "terminato a causa di un errore OS: " + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "terminato a causa di un'eccezione interna: " + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Errore addizionale durante la chiusura dovuto all'errore: " + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Impossibile rimuovere file fastresume dopo l'errore:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "distribuzione della fonte completa" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Impossibile scrivere dati fastresume: " + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "chiusura" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo errata - non è un dizionario" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo errata - chiave parti errata" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo errata - lunghezza parte illegale" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo errata - nome errato" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "il nome %s non permesso per ragioni di sicurezza" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "mix file singolo/multiplo" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo errata - lunghezza errata" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo errata - \"file\" non è una lista di file" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo errata - valore del file errato" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo errata - percorso errato" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo errata - percorso cartella errato" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "il percorso %s non permesso per ragioni di sicurezza" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo errata - percorso duplicato" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo errata - nome usato per entrambi i nomi del file e della " +"sottocartella" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "metainfo errata - tipo oggetto errato" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo errata - nessuna stringa URL di annuncio" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "messaggio di errore non di testo" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "messaggio di avviso non di testo" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "elemento non valido nella lista1 delle fonti" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "elemento non valido nella lista2 delle fonti" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "elemento non valido nella lista3 delle fonti" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "elemento non valido nella lista4 delle fonti" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "lista fonti non valida" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "intervallo annuncio non valido" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "intervallo annuncio minimo non valido" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "tracker id non valido" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "conteggio fonti non valido" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "conteggio fonti complete non valido" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "entrata \"last\" non valida" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Porta in ascolto." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "file nel quale immagazzinare le informazioni dello scaricatore" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tempo di scadenza per le connessioni in chiusura" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "secondi tra i salvataggi del dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "secondi tra le scadenze degli scaricatori" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "secondi che gli scaricatori dovrebbero attendere tra i riannunci" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"numero predefinito di reti cui inviare un messaggio info se il client non " +"specifica un numero" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "tempo da attendere tra i controlli se le connessioni sono scadute" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"quante volte controllare se uno scaricatore è dietro NAT (0 = non " +"controllare)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "se aggiungere entrate al registro per i risultati di controllo-nat" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" +"tempo minimo che deve passare dall'ultima pulizia prima di poterne " +"effettuare un'altra" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"tempo minimo in secondi prima che la cache sia considerata vecchia e sia " +"ripulita" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"permetti solamente lo scaricamento dei .torrent in questa cartella (e " +"ricorsivamente nelle sottocartelle delle cartelle che non contengono file ." +"torrent). Se impostato, i torrent in questa cartella appariranno nella " +"pagina info/scrape a seconda che abbiano fonti oppure no" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permetti chiavi speciali nei torrent nella allowed_dir per influire " +"sull'accesso al tracker" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "se riaprire il file di registro alla ricezione di un segnale HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"se mostrare una pagina di informazioni quando la cartella principale del " +"tracker è caricata" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "un URL verso il quale redirigere la pagina di informazioni" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "se mostrare i nomi dalla cartella permessa" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"file contenente i dati x-icon da ritornare quando il browser richiede " +"favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignora il parametro ip GET dalle macchine che non sono su IP della rete " +"locale (0 = mai, 1 = sempre, 2 = ignora se il controllo NAT non è " +"abilitato). Le intestazioni proxy HTTP che forniscono gli indirizzi dei " +"client originali sono trattati allo stesso modo di --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"file usato per scrivere i registri dei tracker, usare - per standard output " +"(default)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"usato con allowed_dir; aggiunge un url /file?hash={hash} che permette agli " +"utenti di scaricare il file torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"mantieni i torrent estinti dopo che scadono (così che appaiano ancora sul " +"tuo /scrape e pagina web). Significante solo se allowed_dir non è impostata" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "accesso scrape permesso (può essere nessuno, specifico o completo)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "numero massimo delle fonti da fornire con una richiesta" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"il tuo file potrebbe esistere altrove nell'universo\n" +"ma putrtroppo, non qui\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**avviso** file favicon specificato -- %s -- non esistente." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**avviso** file di stato %s corrotto; sto reimpostando" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Registro Avviato: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**avviso** impossibile redirezionare lo standard output al file di registro: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Registro riaperto: " + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**avviso** impossibile riaprire il file di registro" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "la funzione scrape specifica non è disponibile con questo tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "la funzione scrape completa non è disponibile con questo tracker." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "la funzione get non è disponibile con questo tracker." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"Lo scaricamento richiesto non è autorizzato per l'uso con questo tracker." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "eseguire senza argomenti per la spiegazione dei parametri" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Chiusura in corso: " diff --git a/locale/ja/LC_MESSAGES/bittorrent.mo b/locale/ja/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..6d3f7bf14209b31f69699e38ff0efc602be3f357 GIT binary patch literal 39566 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 literal 0 HcmV?d00001 diff --git a/locale/ja/LC_MESSAGES/bittorrent.po b/locale/ja/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..4bdd679 --- /dev/null +++ b/locale/ja/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2755 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-10 13:41-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Pythonのバージョン2.3以上をインストールしてください。" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTKのバージョン2.4以上が必要です。" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "torrentのURL入力" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "開くtorrentファイルのURLを入力:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "ダイアルアップ" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/ケーブル128K以上" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/ケーブル256K以上" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768K以上" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "最高アップロード速度:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "現在実行中のすべてのtorrentを一時的に中断" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "ダウンロードを再開" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "停止中" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "torrentがありません" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "正常に実行中" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "ファイアウォール(またはNAT)にブロックされています" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "最新バージョン%sが利用できます。" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "バージョン%sより新しいバージョンがあります。\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "使用中のバージョンは%sです。最新バージョンは%sです。\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"最新バージョンは次のサイトからダウンロードできます。\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "後でダウンロード(_L)" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "今すぐダウンロード(_N)" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "後で通知(_R)" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "%sについて" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "β" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "バージョン%s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "%sを開けませんでした" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "寄付" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s利用ログ" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "ログの保存場所:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "ログを保存しました" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "ログを消去しました" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%sの設定" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "保存" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "新規ダウンロードの保存先:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "変更..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "ダウンロードするたびに保存先を指定" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "ダウンロード" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "追加のtorrentを手動で開始する場合:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "常に最後のtorrentで終了する(_L)" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "常にtorrentを同時に開始する(_P)" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "毎回尋ねる(_A)" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "シード" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"torrentを完了したシード:共有率が[_]パーセントに達するか、[_]分経過するまで、" +"どちらか早いほう" + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "シードを続ける" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "最後にtorrentを完了したシード:共有率が[_]パーセントに達するまで" + +#: bittorrent.py:925 +msgid "Network" +msgstr "ネットワーク" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "利用可能なポートの検索:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "開始するポート:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "トラッカーに報告するIP:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(トラッカーと同じローカルネットワーク\n" +" 上にいない限り効果がありません)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"プログレスバーの文字を常に黒にする\n" +"(再起動が必要)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "その他" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "警告:この設定の変更により%sが正しく動作しなくなる可能性があります。" + +#: bittorrent.py:986 +msgid "Option" +msgstr "オプション" + +#: bittorrent.py:991 +msgid "Value" +msgstr "値" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "拡張" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "デフォルトのダウンロードディレクトリを選択" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "%sにあるファイル" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "適用" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "配置" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "ダウンロードしない" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "減少" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "増加" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "ファイル名" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "長さ" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "%sのピア" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IPアドレス" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "クライアント" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "接続" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/sでダウンロード" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/sでアップロード" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MBダウンロード" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MBアップロード" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "%完了" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s(推定)ピアダウンロード" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ピアID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "インタレスト" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "チョーク" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "スナッブ" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "オプティミスティックアップロード" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "リモート" + +#: bittorrent.py:1358 +msgid "local" +msgstr "ローカル" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "不良ピア" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d成功" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d失敗" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "接続禁止" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "成功" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "%sについての情報" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "torrent名:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(トラッカーなしtorrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URLの公表:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr "、1個のファイル" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr "、%d個のファイル" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "合計サイズ:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "ピース:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "情報ハッシュ:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "保存場所:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "ファイル名:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "ディレクトリを開く" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "ファイルリストの表示" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "ドラッグして再配置" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "右クリックによるメニュー表示" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "torrent情報" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "torrentの削除" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "torrentの中止" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr "、%sのシード" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr "、シードを続けます。" + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "完了、共有率: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "完了、%sアップロード済み" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "完了" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "torrent情報(_I)" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "ディレクトリを開く(_O)" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "ファイルリスト(_F)" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "ピアリスト(_P)" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "場所の変更(_C)" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "シードを続ける(_S)" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "再開(_S)" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "完了(_F)" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "削除(_R)" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "中止(_A)" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "\"%s\"を削除してよろしいですか?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "このtorrentにおける共有率は%d%%です。" + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "このtorrentに%sをアップロードしました。" + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "このtorrentを削除しますか?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "完了" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "リストにドラッグするとシードされます" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "失敗" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "リストにドラッグすると再開します" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "待機中" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "実行中" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "現在のアップロード: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "現在のダウンロード: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "以前のアップロード: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "以前のダウンロード: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "共有率: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "ピア数%s、シード数%s。トラッカーからの合計: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "配布しているコピー: %d; 次のコピー: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "ピース: 合計 %d、完全 %d、不完全 %d、アクティブ %d (空 %d)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "不良ピース %d + 破棄したリクエスト %s" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% 完了、残り %s" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "ダウンロード率" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "アップロード率" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "該当なし" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%sが開始" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "torrentファイルを開く(_O)" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "torrent URLを開く(_U)" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "torrentの新規作成(_N)" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "中断/再開(_P)" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "終了(_Q)" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "完了したtorrentの表示/非表示(_F)" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "ウィンドウのリサイズ(_R)" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "ログ(_L)" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "設定(_S)" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "ヘルプ(_H)" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "バージョン情報(_A)" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "寄付(_D)" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "ファイル(_F)" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "表示(_V)" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "torrentの検索" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(中断)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(複数)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "既に%sインストーラをダウンロードしています。" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "新しい%sをインストールしますか?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "%sを終了し、新しいバージョンの%sをインストールしますか?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%sについてのヘルプは\n" +"%sを参照してください。\n" +"今すぐ表示しますか?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "ヘルプページを表示しますか?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "リストには完了したtorrentが1個あります。" + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "削除してもよろしいですか?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "リストには完了したtorrentが%d個あります。" + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "それらをすべて削除してもよろしいですか?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "完了したtorrentをすべて削除しますか?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "完了したtorrentはありません。" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "完了して削除できるtorrentはありません。" + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "torrentを開く:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "保存場所を次の場所に変更 " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "ファイルは既に存在します!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\"は既に存在します。別のファイル名にしますか?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "保存場所 " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "ディレクトリは既に存在します!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\"は既に存在します。既存のディレクトリ内に同じディレクトリを作成しますか?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(全般): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%sエラー" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"複数のエラーが発生しました。[OK]をクリックするとエラーログが表示されます。" + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "実行中のtorrentを中断しますか?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"\"%s\"を開始しようとしています。最後に実行しているtorrentを中断しますか?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "これまでに寄付されたことはありますか?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "新しいバージョン%sです。寄付を考えてみては?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "ありがとうございます!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"寄付をありがとうございました! 再度寄付していただける場合は、[ヘルプ]メニュー" +"の[寄付]を選択してください。" + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "非推奨。使用しないでください。" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"既存のコントロールソケットを通じてコマンドの作成または送信ができませんでし" +"た。" + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "%sウインドウをすべて閉じると、問題が解決する場合があります。" + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%sは既に実行中です。" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "既存のコントロールソケットを通じてコマンドを送信できませんでした。" + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "" +"TorrentQueueを開始できませんでした。エラーについては上記を参照してください。" + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrentファイル作成者 %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "このファイル/ディレクトリのtorrentファイルを作成する:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "選択..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(ディレクトリはバッチtorrentになります)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "ピースのサイズ:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "トラッカーの使用(_T):" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "DHTの使用(_D):" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "ノード(オプション):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "コメント:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "作成" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "ホスト(_H)" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "ポート(_P)" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "torrentを作成中..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "ファイルサイズをチェック中..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "シードの開始" + +#: maketorrent.py:540 +msgid "building " +msgstr "作成中" + +#: maketorrent.py:560 +msgid "Done." +msgstr "完了" + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "torrentの作成が完了しました。" + +#: maketorrent.py:569 +msgid "Error!" +msgstr "エラー!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "torrent作成中のエラー:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d日" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1日と%d時間" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d時間" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d分" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d秒" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0秒" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%sヘルプ" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "よくある質問(FAQ):" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "実行" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "フォルダを選択してください..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "すべてのファイル" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "torrent" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "新規フォルダの作成..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "ファイルの選択" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "フォルダの選択" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "保存した状態ファイルをロードできませんでした:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "UIの状態を保存できませんでした:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "状態ファイルの内容が不正です。" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "ファイルの読み込みエラー" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "状態を完全に復元できません" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "状態ファイルの内容が不正です(重複するエントリ)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "データエラー" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr "、torrentを復元できません(" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "状態ファイルが不正です(不良エントリ)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "UI状態ファイルが不良です。" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "UI状態ファイルのバージョンが不良です。" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"サポートされていないバージョンのUI状態ファイル(新規クライアントのバージョンか" +"ら?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "キャッシュされた%sファイルを削除できませんでした:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "これは有効なtorrentではありません。(%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "このtorrent(または同じ内容のもの)は既に実行中です。" + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "このtorrent(または同じ内容のもの)は既に実行待ちの状態になっています。" + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "torrentが不明な状態の%dになっています。" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "ファイルが書き出せませんでした。" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrentはクライアント再起動後、正常に再起動しません。" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"%dを超えるtorrentは同時に実行できません。詳細は、%sのFAQを参照してください。" + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"他のtorrentが実行待ちの状態になっており、このtorrentはシード中断の設定に一致" +"したため、開始しません。" + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"このtorrentは、最後に完了したtorrentのシードを中断する設定に一致したため、開" +"始しません。 " + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "%sから最新バージョンを得られませんでした。" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "%sから最新バージョンの文字列をパースできませんでした。" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "%s %sインストーラを一時的に保存する適当な場所が見つかりませんでした。" + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "%s %sインストーラのtorrentファイルは利用できません。" + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %sインストーラは破損しているか、見つかりません。" + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "このOSでインストーラを開始できません。" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"高速再開に関する情報やGUIの状態など、可変データを保存するディレクトリ。" +"bittorrent configディレクトリのdataサブディレクトリにデフォルト設定されます。" + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"ローカルファイルシステムで使用される文字エンコーディング。空白にしておくと、" +"自動検出されます。python 2.3より前のバージョンでは、自動検出は作動しません。" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "使用するISO言語コード" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"トラッカーに報告するIP(トラッカーと同じローカルネットワーク上にいない限り効果" +"がありません)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"クライアントがローカルでリッスンするポートと異なる場合、グローバルに表示され" +"るポート番号。" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "リッスンする最小数のポート。利用不可の場合はカウントアップされます。" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "リッスンする最大数のポート。" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ローカルでバインドするIP。" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "表示情報を更新する間隔(秒)。" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "さらにピアをリクエストするまでに待機する時間(分)。" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "リクエストし直さないピアの最少数。" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "新規接続の開始を中断するピアの数。" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "この新しい受信接続が終了した直後に許可される最大接続数。" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "ディスクのハッシュをチェックするかどうか。" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "アップロード速度の最大KB/s。0は無制限を示します。" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "余分なオプティミスティックアンチョークで満たされるアップロード数。" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"複数ファイルtorrentの中から一度に開き続けるファイルの最大数。0は無制限を示し" +"ます。ファイル記述子の不足を避けるために使用します。" + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"トラッカーのないクライアントを開始します。トラッカーのないtorrentをダウンロー" +"ドするために有効にしておく必要があります。" + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "次のキープアライブを送信するまでに一時停止する時間(秒)。" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "リクエスト1つあたりのクエリーバイト数。" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"ワイヤー上で受け入れる接頭部エンコーディングの最大長。値が大きくなると、接続" +"が中断されます。" + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "何も受信していない終了ソケットを待機する時間(秒)。" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "接続がタイムアウトしたかどうかをチェックする間隔(秒)。" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"ピアに送信する最大のスライス長。大きいサイズのリクエストを受け取った場合は接" +"続が中止されます。" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "現在のアップロード率とダウンロード率を推定する最大の間隔。" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "現在のシード率を推定する最大の間隔。" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "アナウンスが成功しない場合に、再試行するまでの最長待機時間。" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"半永久的にチョークされていることを想定する前に、接続上で受け取るデータを待機" +"する時間(秒)。" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "ランダムからレアレストファーストに切り替える際のダウンロード数。" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "ネットワークバッファに一度に書き込むバイト数。" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"故障したピアまたは意図的に敵意を示すピアが不正なデータを送信してくる場合に、" +"そのアドレスからの接続を今後拒否します。" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "同じIPアドレスを持つ複数のピアに接続しません。" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "0以外の場合、ピア接続のTOSオプションをこの値に設定します。" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "ファイルの読み込みが大変遅くなるBSD libcのバグ対策を有効にします。" + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "トラッカー接続に使用するHTTPプロキシのアドレス。" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "RSTとの接続を終了し、TCP TIME_WAIT状態を回避します。" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"ネットワーク接続にツイストネットワークライブラリを使用します。1はツイストを使" +"用すること、0は使用しないこと、-1は自動検出とツイストが優先されることを示しま" +"す。" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"torrentを保存するファイル名(1つのファイルtorrentの場合)またはディレクトリ名" +"(バッチtorrentの場合)で、torrentのデフォルト名を上書きします。--save_inも参" +"照。いずれも指定していない場合、ユーザーは場所を保存するよう指示されます。" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "拡張ユーザーインターフェイスの表示" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "シードを中止するまでに完了したtorrentをシードする最長時間(分)。" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"シードを中止するまでに達成する最小のアップロード/ダウンロード率(%)。0は無制限" +"を示します。" + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"最後のtorrentのシードを中止するまでに達成する最小のアップロード/ダウンロード" +"率(%)。0は無制限を示します。" + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "ユーザーがキャンセルするまで完了したtorrentをシードし続けます。" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "ユーザーがキャンセルするまで完了した最後のtorrentをシードし続けます。" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "一時停止状態でダウンローダを開始します。" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"ユーザーが手動で別のtorrentを開始した場合のアプリケーションの動作を指定しま" +"す。「交換」は実行中のtorrentを常に新しいtorrentに置き換えることを示し、「追加」" +"は実行中のtorrentを追加して同時に実行することを示し、「尋ねる」は毎回ユーザーに" +"尋ねることを意味します。" + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"torrentを保存するファイル名(1つのファイルtorrentの場合)またはディレクトリ名" +"(バッチtorrentの場合)。torrentのデフォルト名を上書きします。--save_inも参照。" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"一度に許可されたアップロードの最大数。-1は--max_upload_rateに基づいた適度な数" +"です。自動値は、一度にtorrentを1つ実行している場合にのみ実用的です。" + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"torrentの内容が保存されるローカルのディレクトリ。ファイル(1つのファイル" +"torrentの場合)またはディレクトリ(バッチtorrentの場合)は、.torrentファイルで指" +"定したデフォルトの名前を使って、このディレクトリ内に作成されます。--save_asも" +"参照。" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "ダウンロードしたファイルを保存する場所を尋ねるかどうか。" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"--saveas_styleによって指定された名前を使ってtorrentが保存されるローカルのディ" +"レクトリ。これを空白にしておくと、torrentは対応する.torrentファイルのディレク" +"トリ内に保存されます。" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "torrentディレクトリが再スキャンされる頻度(秒)。" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"torrentダウンロードに名前を付ける方法: 1) torrentファイル名を使用する(torrent" +"は含めない)。2) torrentファイルにエンコードされている名前を使用する。3) " +"torrentファイル名(torrentは含めない)を使ってディレクトリを作成し、torrentファ" +"イルにエンコードされた名前を使って、そのディレクトリに保存する。4) torrent" +"ファイル名(torrentは含めない)およびtorrentファイルにエンコードされた名前が同" +"じ場合は、1/2の名前を使用する。それ以外は、3に従って中間のディレクトリを作成" +"する。注意: オプション1と2は、警告なしでファイルを上書きすることがあり、セ" +"キュリティに問題がある場合があります。" + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "torrentごとに完全なパスまたはtorrentの内容を表示するかどうか。" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr ".torrentファイルを探すディレクトリ(半再帰的)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "stdoutの診断情報を表示するかどうか。" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "ピースサイズを2の何乗にするか。" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "デフォルトのトラッカー名" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"偽の場合は、トラッカーなしをtorrentにし、URLをアナウンスする代わりに、:<" +"ポート>の形で信頼性のあるノードを使用するか、ルーティングテーブルからノードを" +"引き出すために空の文字列を使用します。" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "エラー:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "下り速度" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "上り速度" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "" + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "ファイル:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "サイズ:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "シード:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "ピア:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "エラー:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "エラー:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "サイズ" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "ダウン" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "アップ" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "エラー:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "ファイル名: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "ファイルサイズ:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "ファイル:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "フォルダ名: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "コメント:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "トラッカーへ接続中に問題が発生 - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "トラッカーにより拒否 - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "トラッカーからのメッセージ :" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "トラッカーから警告 - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "チェック済み" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "月" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "火" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "水" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "木" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "金" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "土" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "日" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "1月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "2月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "3月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "4月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "5月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "6月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "7月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "8月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "9月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "10月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "11月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "12月" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "ダウンロード中" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "%sを読み込むことができませんでした" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"%sをダウンロード, あるいは\n" +"開くことができませんでした.\n" +"ウェブブラウザでtorrentファイルをダウンロードしてみてください." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Pythonのバージョン2.2.1以上が必要です." + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "最大ポートが最小ポートより少ないです - チェックするポートがありません" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "IOエラー: ディスクに空きがない, またはファイルが大きすぎます: " + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "IOエラーにより終了:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "OSエラーにより終了:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "内部の例外により終了:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "失敗した後の高速レジューム用のデータを削除できません:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"トラッカーのログを書き出すファイルを指定します。- を指定すると標準出力になり" +"ます(デフォルト)。" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**警告** 指定されたファビコン(%s)は存在しません。" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# ログの開始 :" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**警告** 標準出力を以下のログファイルにリダイレクトできません :" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# ログの再開 :" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**警告** ログファイルを再び開くことができません" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "" diff --git a/locale/ko/LC_MESSAGES/bittorrent.mo b/locale/ko/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..4722900a5e5634d00b9c4d696e1a45058d34b90c GIT binary patch literal 33136 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 Cr?g1` literal 0 HcmV?d00001 diff --git a/locale/ko/LC_MESSAGES/bittorrent.po b/locale/ko/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..a18218b --- /dev/null +++ b/locale/ko/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2743 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-10 20:27-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Python 2.3 이상의 버전을 설치합니다." + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 이상의 버전이 필요합니다." + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Torrent URL 입력" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "열고자 하는 Torrent 파일의 URL 입력:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "전화연결" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/Cable 128k up" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/Cable 256k up" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k up" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1급" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1급" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1급" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3급" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "최대 업로드 속도:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "진행중인 모든 Torrent 일시 중지" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "다운로드 재개" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "일시 중지" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Torrent 없음" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "정상적으로 실행중" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "방화벽/NAT 설정됨" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "새로운 %s 버전이 사용가능합니다." + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "%s의 새로운 버전이 사용가능합니다.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "%s 버전을 사용중이며, 최신버전은 %s 입니다.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"다음에서 최신버전을 받을 수 있습니다.\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "나중에 다운로드" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "지금 다운로드" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "나중에 알림" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "%s 정보" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "베타버전" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "버전 %s " + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "%s을(를) 열 수 없음" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "기부" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s 활동 로그" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "다음에 로그 저장:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "로그 저장됨" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "로그 지워짐" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s 설정" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "저장중" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "다음에 새 다운로드 저장:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "변경..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "새 다운로드마다 저장 위치 묻기" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "다운로드 중" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "수동으로 Torrent 추가 시작하기:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "항상 마지막으로 진행중인 Torrent에서 멈춤" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "항상 동시에 Torrent 시작" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "매회마다 묻기" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "시드하고 있는 중" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"완료된 Torrent 시드: 공유비율이 [_]%에 도달하거나 또는 [_]분 동안 먼저 도달" +"할 때까지" + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "무제한 시드" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "최종 완료된 Torrent 시드: 공유비율이 [_]%에 도달할 때까지" + +#: bittorrent.py:925 +msgid "Network" +msgstr "네트워크" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "사용 가능한 포트 찾기:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "다음 포트에서 시작:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "Tracker에게 알려줄 IP" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Tracker로서 같은 로컬 네트워크에 있는한\n" +"아무런 영향을 받지 않음)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"진행률 표시기 텍스트는 항상 검은색으로\n" +"(다시 시작해야 함)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "기타" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"경고 : 이 설정을 변경하게 되면\n" +"%s의 정상적인 동작을 막게됩니다." + +#: bittorrent.py:986 +msgid "Option" +msgstr "옵션" + +#: bittorrent.py:991 +msgid "Value" +msgstr "값" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "고급" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "기본 다운로드 디렉터리 선택" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "\"%s\"에 있는 파일" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "적용" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "할당" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "다운로드 금지" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "감소" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "증가" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "파일명" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "길이" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "\"%s\"에 대한 Peer" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP 주소" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "클라이언트" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "연결" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s 다운로드" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s 업로드" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB 다운로드 됨" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB 업로드 됨" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% 완료" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s est. Peer 다운로드" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Peer ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "관심분야" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "막힘" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "중지됨" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "최적화된 업로드" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "원격" + +#: bittorrent.py:1358 +msgid "local" +msgstr "지역" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "잘못된 Peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d 확인" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d 잘못됨" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "금지됨" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "확인" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "\"%s\"에 대한 정보" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrent 이름:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(Tracker가 없은 Torrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "공개 URL:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", 1개의 파일에 있음" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", %d개의 파일에 있음" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "전체 용량:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "조각:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "정보 해쉬" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "저장 위치:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "파일명:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "디렉터리 열기" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "파일 목록 보기" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "재정렬하려면 드래그합니다." + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "메뉴에서 오른쪽 마우스 버튼 클릭" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent 정보" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Torrent 제거" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Torrent 중단" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", %s에 대해 시드" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", 무제한으로 시드" + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "완료, 공유율 : %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "완료, %s 업로드 됨" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "완료" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent 정보" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "디렉터리 열기" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "파일 목록" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Peer 목록" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "위치 바꾸기" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "무제한 시드" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "다시 시작" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "완료" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "제거" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "중단" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "\"%s\"을(를) 정말로 제거하겠습니까?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "이 Torrent에 대한 공유율은 %d%% 입니다." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "이 Torrent에 대해 %s 업로드 되었습니다." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Torrent를 제거하겠습니까?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "완료됨" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "시드하려면 목록에서 드래그 합니다." + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "실패" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "다시 시작하려면 목록에서 드래그 합니다." + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "기다리는 중" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "진행중" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "현재 업로드: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "현재 다운로드: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "이전 업로드: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "이전 다운로드: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "공유율: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s Peer, %s 시드, Tracker로부터의 전체 : %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "배포된 카피수 : %d;다음 :%s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "조각: %d 전체, %d 완료, %d 일부, %d 활성화(%d 비어있음)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d 잘못된 조각 + %s 요청이 취소된 것" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% 완료되고, %s 남았습니다." + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "다운로드 속도" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "업로드 속도" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "해당없음" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s 시작되었음" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "Torrent 파일 열기" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Torrent URL 열기" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "새로운 Torrent 만들기" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "일시 중지/재생" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "종료" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "완료된 Torrent 보이기/숨기기" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "창 크기 조정" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "로그" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "설정" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "도움말" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "정보" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "기부" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "파일" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "보기" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Torrent 검색" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(멈춤)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(배수)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "%s 설치가 이미 다운로드 중임" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "새 %s을(를) 지금 설치하겠습니까?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "%s을(를) 종료하고 새버전 %s을(를) 지금 설치하겠습니까?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s 도움말은 \n" +"%s에 있습니다.\n" +"이동하시겠습니까?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "도움말 홈페이지를 방문하시겠습니까?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "목록에 한 개의 완료된 Torrent가 있습니다." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "지우시겠습니까?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "목록에 %d개의 완료된 Torrent가 있습니다." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "모두 지우시겠습니까?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "완료된 Torrent를 제거 하시겠습니까?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "완료된 Torrent 없음" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "제거할 Torrent가 없습니다." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Torrent 열기:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "저장 위치 변경" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "파일이 존재합니다!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\"은(는) 이미 있습니다. 다른 파일을 선택하시겠습니까?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "저장 위치" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "디렉터리가 있습니다!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "\"%s\"은(는) 이미 있습니다. 이 디렉터리 안에 중복해서 만들겠습니까?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(전체 메시지) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s 오류" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"여러 오류가 발생했습니다. 확인을 누르시면 오류 로그를 보실 수 있습니다." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "진행중인 Torrent를 중지하시겠습니까?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"\"%s\"을(를) 시작하려고 합니다. 진행중인 마지막 Torrent를 중지하시겠습니까?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "기부하였습니까?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "새버전 %s 입니다. 기부하였습니까?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "감사합니다!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"기부에 감사합니다! 다시 \"기부\"하기 위해서, 도움말 메뉴에서 \"기부\"를 선택" +"해 주십시오." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "사용하지 마십시오." + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "현재 제어소켓을 통해 명령을 보내거나 작성하는데 실패했습니다." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "모든 %s 창을 닫으면 문제가 해결될 수 있습니다." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s이(가) 이미 실행 중입니다." + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "현 제어소켓을 통해 명령을 보내는 것에 실패하였습니다." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "TorrentQueue를 시작할 수 없습니다. 오류는 위를 참조하십시오." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s Torrent 파일 생성자 %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "다음 파일/디렉터리를 대상으로 Torrent 파일 만들기:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "선택하기..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(디렉터리는 배치 파일 형식의 Torrent 파일이 될 것입니다)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "조각 크기:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Tracker 사용:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "DHT 사용:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "노드(옵션):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "설명:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "만들기" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "호스트" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "포트" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Torrent 만드는 중..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "파일 크기를 검사하는 중..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "시드 시작" + +#: maketorrent.py:540 +msgid "building " +msgstr "만들기" + +#: maketorrent.py:560 +msgid "Done." +msgstr "완료." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Torrent 만들기가 완료되었습니다." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "오류!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Torrent 만들기 오류:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d 일" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 일 %d 시간" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d 시간" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d 분" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d 초" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 초" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s 도움말" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "자주 묻는 질문(FAQ):" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "가기" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "기본 폴더 선택..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "모든 파일" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrent" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "새 폴더 만들기..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "파일 선택" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "폴더 선택" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "저장된 상태를 로드할 수 없음:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "UI 상태를 저장할 수 없음:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "잘못된 상태 파일 내용:" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "파일 읽기 오류" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "상태를 완전히 복구할 수 없음" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "잘못된 상태파일(같은 항목)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "손상된 데이터" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", Torrent를 복구할 수 없음." + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "잘못된 상태파일(잘못된 항목)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "결함있는 UI 상태 파일" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "결함있는 UI 상태 파일 버전" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "지원되지 않는 UI 상태 파일 버전(최신 프로그램인 경우)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "캐시된 %s 파일 삭제할 수 없음:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "유효한 Torrent 파일이 아닙니다.(%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "이 Torrent(또는 같은 내용)가 이미 실행중입니다." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "이 Torrent(또는 동일한 내용)가 실행을 기다리고 있습니다." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "알 수 없는 상태 %d의 Torrent" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "파일에 쓰기할 수 없음" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "클라이언트가 다시 시작할때 Torrent는 올바로 재시작되지 않을 것입니다." + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"%d Torrent 이상을 동시에 실행할 수 없습니다. 보다 자세한 정보는 %s의 FAQ를 참" +"조하십시오." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"다른 Torrent가 실행 대기 중이고 시드가 중단되었을 때 이미 설정 조건을 맞추었" +"다면 Torrent를 시작할 수 없습니다. " + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"마지막으로 완료된 Torrent가 시드를 중단하였을 때 이미 설정 조건을 맞추었다면 " +"Torrent를 시작할 수 없습니다." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "%s에서 최신 버전을 가져올 수 없음" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "%s에서 새 버전 스트링을 분석할 수 없음" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "%s %s 설치를 저장할 적합한 임시 위치를 찾을 수 없습니다." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "%s %s 설치에 이용 가능한 Torrent 파일이 없습니다." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s 설치가 손상되었거나 없는 것 같습니다." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "현재 OS에서 설치를 시작할 수 없음" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"fastresume 정보 및 GUI 상태가 저장된 여러 데이터가 있는 디렉터리입니다. " +"BitTorrent 구성 디렉터리의 하위 디럭터리 '데이터'가 기본값입니다. " + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"문자 인코팅은 로컬 파일 시스템에서 사용됩니다. 비워둔 경우, 자동 감지됩니다. " +"자동 감지 기능은 Python 2.3 이하 버전에서는 사용할 수 없습니다." + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "사용할 ISO 언어 코드" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"Tracker에게 알려줄 IP(Tracker로서 동일한 로컬 네트워크에 있는 동안에는 아무" +"런 영향을 받지 않음)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "클라이언트가 로컬에서 수신한 것과 다른 경우 World-Visible 포트 번호 " + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "사용할 수 없는 경우 수신, 수량 확인을 위한 최소 포트" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "수신을 위한 최대 포트" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "로컬에 바인드하기 위한 IP" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "표시된 정보 업데이트에 소요된 초" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "보다 많은 Peer 요청 대기에 소요된 분" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "재요청되지 않은 Peer의 최소 수" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "새 연결 초대 중 중지된 Peer의 수" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "새로 들어오는 연결이 즉시 종료된 후 허락된 연결의 최소 수" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "디스크에 해쉬를 확인하는지 여부" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "업로드할 때 최소 kB/s, 0는 제한 없음을 의미함 " + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "추가의 Optimistic unchoke를 채우기 위한 업로드 수" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"한번에 여러 Torrent 파일을 열기 할 때 최소 파일 수, 0은 제한 없음을 의미합니" +"다. 파일 설명자 실행을 피하기 위해 사용됩니다." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Tracker 없는 클라이언트를 초기화하십시오. Tracker 없는 Torrent를 다운로드하려" +"면 사용되어야 합니다." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "Keepalives를 전송하는 중 일시 중지된 초의 횟수" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "요청 마다 쿼리된 바이트 수" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"연결이 끊겨 더 큰 값을 전선을 통해 받아드리게 된 경우 최대 길이의 접두사 인코" +"딩" + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "아무 것도 받지 않은 소켓 종료 대기시 소요된 초" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "시간 초과된 연결 확인 대기시 소요된 초" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"큰 요청을 받아 연결을 종료할 경우 Peer 전송을 위한 최대 길이의 슬라이스" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "현재 업로드 속도와 다운로드 속도로 예상되는 최대 시간 간격 " + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "현재 시드 속도로 예상되는 최대 시간 간격" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "실패할 경우 공개 재시도를 기다리는 동안 소요된 최대 시간" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"semi-permanently가 초크된 것을 가정하기 전 연결을 통해 오는 데이터를 기다리" +"는 동안 소요된 초" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "Random에서 Rarest First로 전환될때 다운로드 수" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "한 번에 네트워크 버퍼에 쓰여진 바이트 수" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"주소가 손상되었거나 올바르지 않은 데이터를 보내는 의도적 악의성 Peer의 경우, " +"향후 연결을 거절합니다." + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "동일한 IP 주소를 가진 여러 Peer에 연결하지 않음" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "0이 아닌 경우, 이 값에 Peer 연결을 위해 TOS 옵션 설정" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "파일 읽기 속도를 낮추는 BSD libc 내의 버그 문제 해결이 가능합니다. " + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "Tracker 연결에 사용되는 HTTP 프록시 주소" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "RST와의 연결을 종료하고 TCP 시간 대기 상태를 피합니다." + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"네트워크 연결에 트위스티드 네트워크 라이브러리를 사용합니다. 1은 트위스티드 " +"사용을, 2는 사용안함을 의미하고, -1은 자동 감지 및 트위스티드 선호를 의미합니" +"다. " + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"Torrent의 기본명을 무시하고 파일명(단일 파일 Torrent) 또는 디렉터리명(배치 " +"Torrent)으로 다른 Torrent 이름으로 저장합니다. 사용자가 저장 위치 질문에 대" +"해 특별 설정이 없다면 --저장 위치를 참조합니다. " + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "고급 사용자 인터페이스 표시" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "시드를 중단하기 전 완료된 Torrent의 시드에 소요된 분의 최대 수" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"시드를 중단하기 전 도달한 현재 최소 업로드 속도/다운로드 속도입니다. 0은 제" +"한 없음을 의미합니다." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"마지막 Torrent의 시드를 중단하기 전 도달한 현재 최소 업로드 속도/다운로드 속" +"도입니다. 0은 제한 없음을 의미합니다." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "각 완료된 Torrent의 무제한 시드 (사용자가 취소할 때 까지)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "마지막 Torrent의 무제한 시드 (사용자가 취소할 때 까지)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "중단 상태에서 다운로드 시작" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"사용자가 수동으로 다른 Torrent를 시작할 때 응용 프로그램으로 처리하는 방법 지" +"정: \"대체\"는 항상 새 Torrent로 실행중인 Torrent를 교체하는 것을, \"추가" +"\"는 항상 실행중인 Torrent를 동시에 추가함을, \"묻기\"는 매번 사용자에게 묻기" +"를 의미합니다. " + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"Torrent의 기본명을 무시하고 파일명(단일 파일 Torrent) 또는 디렉터리명(배치 " +"Torrent)으로 다른 Torrent 이름으로 저장합니다. --저장 위치를 참조합니다." + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"한 번에 허용된 최대 업로드 수입니다. -1은 (바라건대) 최대 업로드 속도를 기준" +"으로 한 적합한 수를 의미합니다. 자동 값은 한 번에 하나의 Torrent가 실행될 때" +"만 적합합니다. " + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"Torrent 내용이 저장될 로컬 디렉터리입니다. 파일(단일 파일 Torrent) 또는 디렉" +"터리(배치 Torrent)가 지정된 .torrent 파일로 기본명을 사용하여 이 디텍터리에 " +"생성될 것입니다. --저장하기를 참조합니다." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "다운로드한 파일을 저장할 위치 묻기 여부" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"--다른 이름으로 저장하기 스타일에서 지정된 이름을 사용하여 Torrent가 저장될 " +"로컬 디렉터리입니다. 각 Torrent가 비워져 있다면 해당되는 .torrent 파일의 디렉" +"터리 아래에 저장될 것입니다. " + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "Torrent 디렉터리 재스캔 횟수, 단위는 초" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"다운로드한 Torrent 이름 지정: 1: Torrent 파일(마이너스 .torrent) 이름 사용, " +"2: 인코드된 IN Torrent 파일 이름 사용, 3: torrent 파일(마이너스 .torrent) 이" +"름의 디렉터리 생성 및 인코드된 IN torrent 파일 이름을 사용하는 디렉터리에 저" +"장, 4: torrent 파일(마이너스 .torrent) 이름과 인코드된 IN torrent 파일 이름" +"이 동일하다면 그 이름(스타일 1/2)을 사용하거나, 스타일 3 내에 중간 디렉터리" +"를 생성, 주의: 옵션 1과 2는 경고와 현재 보안 문제의 알림 없이 파일을 덮어쓸 " +"수 있습니다. " + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "전체 경로를 표시하거나 각 Torrent의 내용 표시" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr ".torrent 파일 검색을 위한 디렉터리(semi-recursive)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "Stdout에 진단 정보 표시 여부" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "2개 중 조각 크기를 설정하는 파워" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "기본 Tracker 이름" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"공개 URL 대신에 Tracker 없는 Torrent 만들기가 잘못되었다면, : 형식" +"의 안전한 노드를 사용하거나 라우팅 표에서 몇몇 노드를 끌어오기 위해 비어있는 " +"스트링을 사용합니다. " + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "" + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "" diff --git a/locale/nb_NO/LC_MESSAGES/bittorrent.mo b/locale/nb_NO/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..9dfb1e533e0eff2ec05e32a4e1db7f02c74cc4bc GIT binary patch literal 58884 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 literal 0 HcmV?d00001 diff --git a/locale/nb_NO/LC_MESSAGES/bittorrent.po b/locale/nb_NO/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..a8857a0 --- /dev/null +++ b/locale/nb_NO/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2849 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-09 18:03-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: Einangen \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Norwegian Bokmal\n" +"X-Poedit-Country: NORWAY\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installér Python 2.3 eller nyere" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Krever PyGTK 2.4 eller nyere" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Oppgi torrent URL" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Oppgi URL til en torrent-fil:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "modem" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/kabel over 128k" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/kabel over 256k" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL over 768k" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maksimum opplastingshastighet:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Stopp alle torrents midlertidig" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Fortsett nedlasting" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pause" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Ingen torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Kjører normalt" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Brannmur/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Ny %s versjon tilgjengelig" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "En nyere versjon av %s er tilgjengelig.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Du bruker %s, og den nye versjonen er %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Du kan alltid få nyeste versjon fra \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Last ned _senere" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Last ned _nå" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Minn meg på det senere" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Om %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versjon %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Kunne ikke åpne %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Donér" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s aktivitetslogg" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Lagre logg i:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "loggen er lagret" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "loggen er tømt" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Innstillinger" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Lagrer" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Lagre nye nedlastninger i:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Endre..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Spør hvor nye nedlastninger skal lagres hver gang" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Laster ned" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Starter flere torrents manuelt:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Stopp alltid den _siste kjørende torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Start alltid torrenten _parallelt" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Spør hver gang" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Deler" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Del ferdige torrent: til delingsgrad når [_] prosent, eller i [_]minutter, " +"velg det som slår til først." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Del ubegrenset" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "Del sist fullførte torrent: til delingsgrad når [_] prosent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Nettverk" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Se etter ledig port:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "starter på port:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP som rapporteres til tracker:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Har ingen effekt hvis du ikke er på samme\n" +"lokalnett som trackeren)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Fremdriftsindikatoren er alltid svart\n" +"(programmet må startes på nytt)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Diverse" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ADVARSEL: Endring av disse innstillingene kan\n" +"hindre at %s fungerer som det skal." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Valg" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Verdi" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avansert" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Velg standard nedlastingsmappe" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Filer i \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Bruk" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Tildel" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Aldri last ned" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Reduser" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Øk" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Filnavn" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Lengde" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Klienter for \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP-adresse" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Klient" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Tilkobling" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s ned" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s opp" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB lastet ned" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB lastet opp" + +# Kommer opp feil i poEdit... +# poEdit doesn't like this one... +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% ferdig" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s beregnet klientnedlastingshastighet" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "KlientID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interessert" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Overbelastet" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Døde" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistisk opplasting" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "fjern" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokal" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "klientfeil" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d ødelagt" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "bannlyst" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informasjon for \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrentnavn:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent uten tracker)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "AnnonseringsURL:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", i en fil" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", i %d filer" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Total størrelse:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Deler:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Infohash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Lagre i:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Filnavn:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Åpne mappe" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Vis filliste" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "dra for å endre rekkefølge" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "høyreklikk for meny" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrentinformasjon" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Fjern torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Avslutt torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", vil dele i %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", vil dele uendelig." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Ferdig, delingsforhold: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Ferdig, %s lastet opp" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Ferdig" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent _informasjon" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Åpne mappe" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Filliste" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Klientliste" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Endre lagringssted" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Del ubestemt tid" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Gjen_start" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Gjør ferdig" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Fjern" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Avbryt" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Er du sikker på at du vil fjerne \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Delingsforholdet ditt for denne torrenten er %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Du har lastet opp %s til denne torrenten." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Fjern denne torrenten?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Ferdig" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "dra inn i listen for å dele" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Mislyktes" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "dra inn i listen for å fortsette" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Venter" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Kjører" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Nåværende opp: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Nåværende ned: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Forrige opp: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Forrige ned: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Delingsforhold: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s klienter, %s frø. Totaler fra tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Distribuerte kopier: %d; Neste: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Deler: %d totalt, %d ferdig, %d delvis, %d aktive (%d tomme)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d ødelagte deler + %s i forkastede forespørsler" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% ferdig, %s gjenstår" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Nedlastingshastighet" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Opplastingshastighet" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "IT" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s startet" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Åpne torrentfil" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Åpne torrent _URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Lag _ny torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pause/Kjør" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Avslutt" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Vis/Gjem _ferdige torrents" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Endre størrelsen på vinduet til å passe" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Logg" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Oppsett" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Hjelp" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Om" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Donér" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Fil" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Vis" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Søk etter torrent" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(stoppet)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(flere)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Laster allerede ned %s installasjonen" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Installere ny %s nå?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Vil du avslutte %s og installere ny versjon, %s nå?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s hjelp finnes på \n" +"%s\n" +"Vil du gå dit nå?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Gå til hjelpesiden?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Det er en fullført torrent i listen." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Vil du fjerne den?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Det er %d fullførte torrents i listen." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Vil du fjerne alle?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Fjerne alle fullførte torrents?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Ingen fullførte torrents" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Det er ingen fullførte torrents å fjerne." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Åpne torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Endre lagringssted for " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Filen eksisterer!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" eksisterer allerede. Vil du lagre under et annet navn?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Lagringssted for " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Mappe finnes allerede!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" finnes allerede. Vil du lage en identisk kopi i den eksisterende " +"mappen?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(global melding) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Feil" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Det har oppstått flere feil. Trykk på OK for å se feilloggen." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Stoppe kjørende torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "Du er ved å starte \"%s\". Vil du stoppe kjørende torrent også?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Har du donert?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Velkommen til den nye versjonen av %s. Har du donert?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Takk!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Takk for din donasjon! For å gi mer, velg \"Donér\" fra menyen \"Hjelp\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "ikke lenger i bruk" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "Mislyktes med forsøk på å sende kommando gjennom eksisterende socket." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Problemet kan kanskje korrigeres ved å lukke alle %s vinduer." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s kjører allerede" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Mislyktes med forsøk på å sende kommando gjennom eksisterende socket." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Kunne ikke starte TorrentQueue, se ovenfor for feil." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrent filskaper %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Lag torrent fil for denne filen/mappen:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Velg..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Mapper blir til flerfilstorrents)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Delstørrelse:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Bruk _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Bruk _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Noder (valgfritt):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Kommentarer:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Lag" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Vert" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Lager torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Kontrollerer filstørrelser..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Begynn å så frø" + +#: maketorrent.py:540 +msgid "building " +msgstr "bygger opp" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Ferdig." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Ferdig med å lage torrents." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Feil!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Feil mens torrents ble laget:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dager" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dag %d timer" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d timer" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutter" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d sekunder" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 sekunder" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Hjelp" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Ofte Stilte Spørsmål (FAQ):" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Start" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Velg en eksisterende mappe..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Alle filer" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Lag en ny mappe..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Velg fil" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Velg mappe" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Kunne ikke lese lagret status:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Kunne ikke lagre grensesnittets tilstand:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Ugyldig innhold i tilstandsfilen" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Kan ikke lese filen" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "kan ikke gjenopprette tilstanden fullstendig" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Ugyldig tilstandsfil (dobbel instans)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Ødelagt data i " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", kan ikke gjenopprette torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Ugyldig tilstandsfil (ugyldig instans)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Ugyldig tilstandsfil for grensesnitt" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Ugyldig versjon på tilstandsfilen for grensesnitt" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Ikke støttet versjon av tilstandsfil for grensesnitt (fra nyere " +"klientversjon?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Kunne ikke slette midlertidig %s fil:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Dette er ikke en gyldig torrentfil. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Denne torrenten (eller en med likt innhold) kjører allerede." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Denne torrenten (eller en med likt innhold) venter allerede på å kjøre." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrenten er i en ukjent tilstand %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Kunne ikke skrive filen " + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"torrenten vil ikke bli korrekt gjenopprettet ved neste oppstart av klienten" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Kan ikke kjøre mer enn %d torrents samtidig. For mer informasjon, se FAQ " +"under %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Starter ikke torrenten, ettersom det er andre torrents som venter på å " +"starte, og denne oppfyller allerede kriteriene for når den skal slutte å så " +"frø." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Starter ikke torrenten, ettersom den allerede oppfyller kriteriene for når " +"den siste torrenten skal slutte å så frø." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Kunne ikke hente siste versjon fra %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Kunne ikke finne informasjon om ny versjon fra %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Kunne ikke finne en passende midlertidig plass å lagre %s %s installasjonen " +"på." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Ingen torrentfil tilgjengelig for %s %s installasjonen." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s installasjonen ser ut til å være korrupt eller mangle filer." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Kunne ikke kjøre installasjonen på dette OS" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"mappe hvor variable data som hurtigfortsettelsesinformasjon og " +"brukergrensesnitttilstand er lagret. Standard er undermappen 'data' i " +"bittorrents konfigurasjonsmappe." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"tegnkoding brukt på det lokale filsystemet. Hvis tom, automatisk. " +"Automatikk fungerer ikke i Pythonversjoner eldre enn 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "ISO språkkode som skal brukes" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ip-adresse å rapportere til trackeren(har ingen effekt hvis du ikke er på " +"samme lokale nettverk som trackeren)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"portnummer synlig utenfra hvis det er forskjellig fra det klienten lokalt " +"lytter på" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "laveste port å lytte på, teller oppover hvis utilgjengelig" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "øverste port å lytte på" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "lokal IP å binde til" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekunder mellom oppdateringer av vist informasjon" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minutter å vente mellom hver gang flere klienter etterspørres" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "minste antall klienter for ikke å spørre igjen" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "antall klienter før nye tilkoblinger ikke startes" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maksimalt antall tilkoblinger tillatt, etter dette blir nye innkommende " +"tilkoblinger stengt med en gang" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "kontroller hasher på disk eller ikke" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maks kB/s å laste opp med, 0 betyr ingen grense" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" +"antall opplastinger å fylle opp til med ekstra optimistiske metoder for å " +"unngå overbelastning" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"største antall filer i en flerfilstorrent som kan holdes åpne samtidig, 0 " +"betyr ingen grense. Brukt for å unngå å gå tom for fildeskriptorer." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Start en trackerløs klient. Dette må være skrudd på for å laste ned " +"trackerløse torrents." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"antall sekunder mellom hver gang et signal for å holde i live forbindelsen " +"sendes ut" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "hvor mange tegn å spørre etter i hver forespørsel." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"største lengde på prefiks for koding du vil akseptere utenfra - større " +"verdier fører til at forbindelsen forkastes." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "sekunder å vente før forbindelser ingenting er mottatt på stenges" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "sekunder å vente mellom hver sjekk etter forbindelser utgått på dato" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maksimal størrelse på biter å sende til klienter, steng forbindelsen hvis en " +"større forspørsel kommer" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "maksimum tidsinterval for å kalkulere opp- og nedlastingsrate" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "maksimum tidsinterval for å beregne delingsrate" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "maksimal tid å vente mellom hver annonsering hvis de stadig feiler" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"sekunder å vente på innkommende data over en forbindelse før man kan anta at " +"den er delvis permanent overbelastet" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"antall nedlastinger før programmet endrer fra å velge tilfeldig nedlasting å " +"begynne på til å velge den sjeldneste først" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "hvor mange tegn skal skrives til nettverksbuffere på en gang." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"avslå flere forbindelser fra adresser med ødelagte eller med vilje " +"fiendtlige klienter som sender ukorrekt data" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "ikke koble til flere klienter som har samme IP-adresse" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "hvis ikke null, sett TOS for klientforbindelser til denne verdien" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"aktiver en omvei rundt en feil i BSD libc som gjør fillesing veldig treg." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adresse til en HTTP-mellomtjener for tracker-forbindelser" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "steng forbindelser med RST og unngå TCP TIME_WAIT tilstanden" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Bruk Twistet nettverksbiblioteker for nettverkstilkoblinger. 1 betyr bruk " +"twistet, 0 betyr ikke bruk twistet, -1 betyr autodetekt, og foretrekk twistet" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"filnavn (for enkeltfiltorrents) eller mappenavn (for flerfilstorrents) å " +"lagre torrenten som. Overkjører standardnavnet i torrenten. Se også --" +"save_in. Hvis ingen av dem er spesifisert, blir brukeren spurt om " +"lagringssted" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "vis avansert brukergrensesnitt" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "største antall minutter å så frø til en ferdig torrent før den stopper" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"minste opp-/nedlastingsforhold, i prosent, å oppnå før frøsåing stopper. 0 " +"betyr ingen grense." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"minste opp-/nedlastingsforhold, i prosent, å oppnå før frøsåing for siste " +"torrent stopper. 0 betyr ingen grense." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "Del hver fullstendig torrent på ubestemt tid (til brukeren avbryter)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Del siste torrent på ubestemt tid (til brukeren avbryter)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "start nedlasting i pauset tilstand" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"spesifiserer hvordan applikasjonen skal oppføre seg når brukeren manuelt " +"prøver å starte en annen torrent: \"replace\" betyr alltid å erstatte den " +"kjørende torrenten med en ny, \"add\" betyr alltid legg til den kjørende " +"torrenten i parallell, og \"ask\" betyr spør brukeren hver gang." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"filnavn (for enkelttorrents) eller mappenavn (for flere torrents) å lagre " +"torrenten som, overkjører standardnavnet i torrenten. Se også --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"maksimum antall opplastinger på en gang. -1 betyr (forhåpentligvis) et " +"realistisk antall basert på --max_upload_rate. De automatiske verdiene er " +"bare identifiserbare når kun en torrent kjøres av gangen." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"lokal mappe hvor torrentens innhold blir lagret. Filen (enkeltfiltorrents) " +"eller mappen (flere torrents) vil bli laget i denne mappen med " +"standardnavnet spesifisert i .torrentfilen. Se også --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "spør etter sted å lagre nedlastede filer i eller ikke" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"lokal mappe hvor torrentene vil bli lagret, navn bestemt av --saveas_style. " +"Hvis denne er tom, vil hver torrent bli lagret under mappen til den " +"tilsvarende .torrentfilen" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "hvor ofte skal torrentmappen sjekkes, i sekunder" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Hvordan skal torrentnedlastinger navngis: 1: bruk navnet PÅ torrentfilen " +"(uten .torrent); 2: bruk navnet spesifisert I torrentfilen; 3: lag en mappe " +"med navnet PÅ torrentfilen (uten .torrent) og lagre filene i den mappen med " +"navn spesifisert I torrentfilen; 4: hvis navn PÅ torrentfilen (uten ." +"torrent) og navnet spesifisert I torrentfilen er identiske, bruk det navnet " +"(punkt 1/2), ellers lag en midlertidig mappe som i punkt 3; ADVARSEL: valg " +"1 og 2 kan skrive over filer uten advarsel, og kan føre til " +"sikkerhetsproblemer." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "vis full sti eller innholdet i torrenten for hver torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "mappe å se etter .torrentfiler i (delvis rekursiv)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "vis diagnostisk info til stdout eller ikke" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "hvilken toerpotens skal delens størrelse settes til" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "standard tracker-navn" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"hvis usann, lag en trackerløs torrent, i stedet for annonserings-URL, bruk " +"en pålitelig node i form av : eller en tom streng for å hente ut " +"noen noder fra rutingtabellen din" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "nedlasting ferdig!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "ferdig om %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "vellykket nedlasting" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB opp / %.1f MB ned)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB opp / %.1f MB ned)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d synlig nå, plus %d distribuerte kopier (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d distribuerte kopier (neste: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d synlig nå" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "FEIL:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "lagrer:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "filstørrelse:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "prosent ferdig:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "gjenstående tid:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "last ned til:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "nedlastingshastighet:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "opplastingshastighet:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "forhold mellom opp- og nedlasting:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "delings-status:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "klientstatus:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Du kan ikke spesifisere både --save_as og --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "avslutter" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Feil ved lesing av konfigurasjon:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Feil ved lesing av .torrentfil:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "du må oppgi en .torrentfil" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Oppstart av tekstbasert brukergrensesnitt mislyktes, kan ikke fortsette." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Denne nedlastingen krever Pythonmodulen \"curses\", som dessverre ikke er " +"tilgjengelig for Windowsversjonen av Python. Den er derimot tilgjengelig " +"for Cygwinversjonen (www.cygwin.com) av Python, som kjører på alle " +"win32systemer." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Du kan fortsatt bruke \"bittorrent-console\" for nedlasting." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "fil:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "størrelse:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "mål:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "fremgang:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "status:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "nedl. hastighet:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "oppl. hastighet:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "deler:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "frø:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "klienter:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d synlige nå, plus %d distribuerte kopier (%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "feil:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "feil:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Opp Ned Ferdig " +"Hastighet" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "laster ned %d deler, har %d biter, %d av %d deler ferdig" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Disse feilene oppstod under kjøring:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Bruk: %s TRACKER_URL [TORRENTFIL [TORRENTFIL ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "gammel annonsering av %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "ingen torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTEMFEIL - UNNTAK OPPSTÅTT" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Advarsel:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " er ikke en mappe" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"feil: %s\n" +"kjør uten argumenter for forklaring på parametrene." + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"UNNTAK:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Du kan fortsatt bruke \"btdownloadheadless.py\" til nedlasting." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "kobler til klienter" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Antatt ferdig om %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Størrelse" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Nedlastinger" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Opplastinger" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totalt:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s nedlastere %s spredere %s disbruterte kopier - %s ned %s opp" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "feil:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"kjør uten argumenter for forklaring på parametrene." + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "valgfri leselig kommentar å legge i .torrentfilen" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "valgfri målfil for torrenten" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - dekod %s metainformasjonsfiler" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Bruk: %s [TORRENTFIL [TORRENTFIL ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "metainfofil: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "info hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "filnavn: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "filstørrelse:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "filer:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "mappenavn: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "arkivstørrelse:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "tracker annonseringsurl: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "trackerløse noder:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "kommentar:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Kunne ikke opprette kontrollforbindelse" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Kunne ikke sende komando: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Kunne ikke opprette kontrollforbindelse: allerede i bruk" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Kunne ikke fjerne filnavnet for den gamle kontrollforbindelsen" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Global mutex allerede laget." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Kunne ikke finne en åpen port!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Kunne ikke lage applikasjonsdatamappe." + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Kunne ikke lage global mutex lås for kontrollforbinelse fil." + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "En forrige verson av BitTorrent var ikke slettet riktig. Fortsetter" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "ikke en gyldig bkodet streng" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "ugyldig bkodet verdi (data etter gyldig prefiks)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Bruk: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[INNSTILLINGER] [TORRENTMAPPE]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Hvis et argument som ikke er en innstilling er tilstede, blir det\n" +"brukt som verdien til torrent_dir-innstilingen.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[INNSTILLINGER] [TORRENTFILER]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[INNSTILLINGER] [TORRENTFIL]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[INNSTILLING] SPORERURL FIL [FIL]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argumenter er -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (standard er " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "ukjent nøkkel" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parameter sendt på slutten uten verdi" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "kommandolinjegjennomgang feilet ved " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Valget %s er nødvendig." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Må minst oppgi %d argumenter." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "For mange argumenter - %d maks." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "feil format av %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Kunne ikke lagre oppsett permanent" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Sporers annonsering er fortsatt ikke ferdig %d sekunder etter start" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problem med kobling til tracker, gethostbyname gav feilmalding -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problem med å koble til sporer - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "feil i data fra sporer - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "avvist av sporer - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Avslutter torrent, ettersom den ble avvist av sporeren uten å ha blitt " +"koblet til noen annen klient." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr " Beskjed fra sporer: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "advarsel fra sporer: - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Kunne ikke lese mappe" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Kunne ikke få status for " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "fjerner %s (vil legge til på nytt)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**advarsel** %s er er en maken torrent som %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**advarsel** %s har feil" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... vellykket" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "fjerner %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "ferdig med å sjekke" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "mistet tjenertilkobling" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Feil ved håndtering av akseptert forbindelse:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Må avslutte fordi TCP forbindelsen svikter (TCP stack flaking out). " +"Vennligst se FAQ/OSS under %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "For sent å forandre RawServer bakende, %s har allerede blitt brukt." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Man" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Tir" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Ons" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Tor" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Fre" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Lør" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Søn" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Aug" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Okt" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Des" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Komprimert: %i Ukomprimert: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Du kan ikke spesifisere navn på .torrentfilen når du genererer flere " +"torrents på en gang" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Filsystemkodingen \"%s\" støttes ikke i denne versjonen" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Kunne ikke konvertere fil-/mappenavnet \"%s\" til utf-8 (%s). Enten er " +"antatt filsystemkoding \"%s\" feil, eller filnavnet inneholder ugyldige tegn." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Fil-/mappenavnet \"%s\" inneholder reserverte unicodeverdier som ikke " +"tilsvarer tegn." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "feil data i responsfil - totalen for liten" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "feil data i responsfil - totalen for stor" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "sjekker eksisterende fil" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 eller hurtigfortsettelsesinfo stemmer ikke med filtilstand " +"(data mangler)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Hurtigfortsettelsesinfo stemmer ikke (filen inneholder mer data)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Hurtigfortsettelsesinfo stemmer ikke (ugyldig verdi)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "data ødelagt på disken - kjører du to kopier?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Kunne ikke lese hurtigfortsettelsesdata:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"ga beskjed om komplett fil ved oppstart, men delen feilet hash-kontrollen" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Filen %s hører til en annen kjørende torrent" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Filen %s eksisterer, men er ikke en vanlig fil" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Lite data - noe har forkortet filene?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "Ukjent hurtigfortsettelsesformat, kanskje en annen klientversjon?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Et annet program har flytter, gitt nytt navn, eller slettet filen." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Et annet program har modifisert filen." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Et annet program har endret filens størrelse." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Kunne ikke sette signalhåndterer: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "droppet \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "la til \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "venter på hash-kontroll" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "laster ned" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Leser konfigurasjonsfilen om igjen" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Kunne ikke få status for %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Kunne ikke laste ned eller åpne \n" +"%s\n" +"Prøv å bruk en nettleser for å laste ned filen." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Dette ser ut til å være en gammel Pythonversjon, som ikke støtter oppdagelse " +"av filsystemkoding. Antar 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python kunne ikke filsystemkodingen automatisk. Bruker 'ascii' i stedet." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Filsystemkoding '%s' støttes ikke. Bruker 'ascii' i stedet." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Feil i del av filstien:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy og har uriktig " +"kodede filnavn. Noen eller alle filnavnene kan være forskjellige fra det " +"personen som laget .torrentfilen har ment." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy, og har " +"tegnverdier som ikke tilsvarer virkelige tegn. Noen eller alle filnavnene " +"kan være forskjellig fra det personen som laget den har ment." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy og har feilkodede " +"filnavn. Navnene kan fortsatt være riktige." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Tegnsettet i det lokale filsystemet (\"%s\") kan ikke vise alle tegn brukt i " +"filnavnet/ene i denne torrenten. Filnavnene har blitt endret fra originalen." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows sitt filsystem kan ikke håndtere noen av tegnene i filnavnet/ene i " +"denne torrenten. Filnavn har blitt endret fra originalen." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Denne .torrentfilen har blitt laget med et ødelagt verktøy, og har minst en " +"fil eller en mappe med ugyldig navn, men ettersom alle slike filer har " +"størrelse 0, er disse ignorert." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Krever Python 2.2.1 eller nyere" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Kan ikke starte to instanser av samme torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "øverste port er lavere enn laveste port - ingen porter å sjekke" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Kunne ikke åpne port å lytte på: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Kunne ikke åpne port å lytte på: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Sjekk portintervall-innstillingene." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Første oppstart" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Kunne ikke lade raskforsette data: %s" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Vil foreta full hash-kontroll." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "del %d feilet hash-kontroll, henter ned på nytt" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Forsøkt på nedlasting av en trackerløs torrent med trackerløs klient er " +"slått av." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "nedlasting feilet:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Inn/Ut-feil: Ikke mer plass på disken, eller kan ikke opprette en så stor " +"fil:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "drept av inn/ut-feil" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "drept av operativsystemfeil:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "drept av internt unntak:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Ekstra feil ved avslutning på grunn av feil:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Kunne ikke fjerne hurtigfortsettelsesfil etter at den feilet:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "lager frø" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Kunne ikke skrive hurtigfortsettelsesdata:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "avslutt" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "feil i metainfo - ikke en mappe" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "feil i metainfo - feil fildel-nøkkel" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "feil i metainfo - ulovlig dellengde" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "feil i metainfo - ugyldig navn" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "navnet %s er ikke tillatt av sikkerhetsmessige årsaker" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "blanding av enkeltfiler og flere filer" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "feil i metainfo - ugyldig lengde" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "feil i metainfo - \"files\" er ikke en filliste" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "feil i metainfo - ugyldig filverdi" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "feil i metainfo - ugyldig sti" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "feil i metainfo - ugyldig sti til mappe" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "stien %s er ikke tillat av sikkerhetsmessige årsaker" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "feil i metainfo - dobbel sti" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "feil i metainfo - navnet er brukt både som fil og undermappenavn" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "feil i metainfo - feil objekttype" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "feil i metainfo - ingen annonseringsURL" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "ikketekstlig feilårsak" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "ikketekstlig advarsel" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "ugyldig forekomst i klientliste 1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "ugyldig forekomst i klientliste 2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "ugyldig forekomst i klientliste 3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "ugyldig forekomst i klientliste 4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "ugyldig klientliste" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "ugyldig annonseringsintervall" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "ugyldig minste annonseringsintervall" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "ugyldig sporerID" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "ugyldig antall klienter" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "ugyldig antall frø" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "ugyldig \"siste\"-verdi" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Port å lytte på." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "fil å lagre nylig nedlastingsinformasjon i" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tid uten aktivitet før forbindelser stenges" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "sekunder mellom hver gang dfile lagres" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "sekunder mellom nedlastere som går ut på dato" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "sekunder nedlastere skal vente mellom gjenannonseringer" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"standard antall noder meldinger blir sendt til hvis klienten ikke har " +"spesifisert antallet" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "tid å vente mellom hver sjekk for å se etter tidsavbrutte forbindelser" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "sjekk om en nedlaster er bak NAT hvor mange ganger (0 = ikke sjekk)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "skal resultater av NATsjekk legges i loggen" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "minste tid siden siste tømming før en ny kan gjøres." + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"minste antall sekunder før et midlertidig lager er betegnet som foreldet, og " +"blir tømt." + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"bare tillat nedlastinger av .torrentfiler i denne mappen (og rekursivt i " +"undermapper til mapper som ikke har .torrentfiler selv.) Hvis denne er " +"valgt, vil torrents i denne mappen være synlige på infosiden/scrapesiden " +"enten de har klienter eller ikke." + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"tillat spesielle nøkler i torrentene i \"allowed_dir\" å påvirke " +"sporertilgang" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "skal loggfilen gjenåpnes etter et HUPsignal?" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"om en informasjonsside skal vises når sporerens rotmappe blir lastet inn " +"eller ikke" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "en URL å redirigere informasjonssiden til" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "skal navn fra \"allowed_dir\" vises eller ikke?" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"fil som inneholder x-icon-data å returnere når det kommer en forespørsel " +"etter favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorer IP GETparameter fra maskiner som ikker er på lokalnettets IPadresser " +"(0 = aldri, 1 = alltid, 2 = ignorer hvis NATsjekking ikke er aktivert). " +"HTTPmellomtjenerhoder som oppgir adressen til den originale klienten blir " +"behandlet på samme måte som --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "fil å skrive sporerlogger til, bruk - for stdout (standard)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"bruk sammen med allowed_dir. Legger til en /file?hash={hash}-URL som lar " +"brukere laste ned torrentfilen" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"behold døde torrents etter at de går ut (slik at de fortsatt vil vises i " +"scrapesiden og websiden.) Gir bare mening hvis allowed_dir ikke er valgt." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "scrapetilgang er tillatt (kan være ingen, spesiell eller full)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "største antall klienter å oppgi ved enhver forespørsel" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"filen din eksisterer kanskje et annet sted i universet,\n" +"men dessverre ikke her.\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**advarsel** spesifisert favorittikonfil -- %s -- finnes ikke." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**advarsel** tilstandsfil %s er ødelagt; tilbakestiller til standard" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Logg Startet: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**advarsel** kunne ikke omdirigere stdout til loggfil:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Logg gjenåpnet:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**advarsel** kunne ikke gjenåpne loggfil" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" +"spesifisert \"scrape\"funksjon er ikke tilgjengelig hos denne trackeren." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" +"fullstendig \"scrape\"funksjon er ikke tilgjengelig hos denne trackeren." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "funksjonen \"get\" er ikke tilgjengelig hos denne trackeren." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Forespurt nedlasting er ikke autorisert til å bruke denne sporeren." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "kjør uten argumenter for forklaring på parametrene." + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Avslutter:" diff --git a/locale/nl/LC_MESSAGES/bittorrent.mo b/locale/nl/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..7d2f1ad0d45851626024b99d899d84ef371b3093 GIT binary patch literal 61233 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\n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installeer Python versie 2.3 of hoger" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 of nieuwer vereist" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Geef torrent URL op" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Geef een URL op om een torrent-bestand te openen:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "inbelverbinding" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "ADSL/kabel 128k en hoger" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "ADSL/kabel 256k en hoger" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "ADSL 768k en hoger" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maximale uploadsnelheid:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Stop tijdelijk alle actieve torrents" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Downloaden hervatten" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Gepauzeerd" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Geen torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Functioneert normaal" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Met Firewall/met NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nieuwe %s versie beschikbaar" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Een nieuwere versie van %s is beschikbaar.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Je gebruikt %s en de nieuwe versie is %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Je kunt altijd de laatste versie verkrijgen via \n" +" %s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Download _later" + +# Re-visit this item +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Download _nu" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Herinner mij later" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Ongeveer %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Bèta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versie %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Kon %s niet openen" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Doneer" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s activiteitenlog" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Logboek opslaan in:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "logboek opgeslagen" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "logboek gewist" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Instellingen" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Opslaan" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Sla nieuwe downloads op in:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Wijzigen..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Vragen waar elke nieuwe download moet worden opgeslagen" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Bezig met downloaden" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Extra torrents handmatig beginnen:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Stopt altijd de _laatst actieve torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Begint altijd de torrent in _parallel" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Vraagt elke keer" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Seeding" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Seed voltooide torrents: tot deelratio [_] procent is bereikt, of gedurende " +"[_]minuten, welke het eerst van toepassing is." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Oneindig seeden" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Seed laatste voltooide torrent: totdat deelratio [_]procent is bereikt." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Netwerk" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Zoek naar beschikbare poort:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "Start bij poort:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP vermelding aan de tracker:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Heeft geen effect tenzij u op\n" +" hetzelfde lokale netwerk als de tracker bent)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Tekst in voortgangsbalk is altijd zwart\n" +"(herstart vereist)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Diversen" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"WAARSCHUWING: Het wijzigen van deze instellingen kan\n" +" %s verhinderen goed te functioneren." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Optie" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Waarde" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Geavanceerd" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Kies standaard downloadmap" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Bestanden in \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Toepassen" + +# Check this information with client +# Re-visit this item +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Wijs toe" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nooit downloaden" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Verlagen" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Verhogen" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Bestandsnaam" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Lengte" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peers voor \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP-adres" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Client" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Verbinding" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s down" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s up" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB gedownload" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB geüpload" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% voltooid" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s geschatte download van peer" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Peer-id" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Geïnteresseerd" + +# Re-visit this item +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Gestaakt" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Afgewezen" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistische upload" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "extern" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokaal" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "slechte peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d slecht" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "verboden" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Info over \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrentnaam:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(trackerloze torrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Aankondigs-URL:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", in één bestand" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", in %d bestanden" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Totale grootte:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Delen:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Info hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Opslaan in:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Bestandsnaam:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Open map" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Bestandslijst weergeven" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "Slepen om te herschikken" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "Klik met rechtermuisknop voor menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent info" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Torrent verwijderen" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Torrent stoppen" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", zal seeden voor %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", zal onbeperkt seeden." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Klaar, share ratio: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Klaar, %s geüpload" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Gereed" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent _info" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Open map" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Bestandslijst" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Peerslijst" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Locatie wijzigen" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Oneindig seeden" + +# Re-visit this item +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Her_starten" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Voltooien" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Verwijderen" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Afbreken" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Weet je zeker dat je \"%s\" wilt verwijderen?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Je deelratio voor deze torrent is %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Je hebt %s geüpload naar deze torrent." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Deze torrent verwijderen?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Voltooid" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "sleep in lijst om te seeden" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Mislukt" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "sleep in lijst om te hervatten" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Wachten" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Actief" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Huidige up: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Huidige down: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Vorige up: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Vorige down: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Share ratio: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s peers, %s seeds. Totalen van tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Verzonden kopieën: %d; Volgende: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Stukken: %d totaal, %d voltooid, %d deels, %d actief (%d leeg)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d slechte stukken + %s in verworpen aanvragen" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% gereed, %s resterend" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Downloadsnelheid" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Uploadratio" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Niet beschikbaar" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s begonnen" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Torrentbestand openen" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Torrent_URL openen" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "_nieuwe torrent maken" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pauzeren/afspelen" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Afsluiten" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "_voltooide torrents weergeven/verbergen" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Venstergrootte aanpassen" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Log" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Instellingen" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Help" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Info" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Doneren" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Bestand" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Weergave" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Zoek naar torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(gestopt)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(meerdere)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Al bezig met downloaden van installer %s" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Nieuwe %s nu downloaden?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Wilt u %s afsluiten en de nieuwe versie, %s, nu installeren?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s help is op \n" +"%s\n" +"Wilt u hier nu naartoe gaan?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Help-webpagina bezoeken?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Er is één voltooide torrent in de lijst." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Wilt u dit verwijderen?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Er zijn %d voltooide torrents in de lijst." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Wilt u deze alle verwijderen?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Wilt u alle voltooide torrents verwijderen?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Geen voltooide torrents" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Er zijn nog geen voltooide torrents om te verwijderen." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Open torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Verander de opslaglocatie in" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Bestand bestaat al!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" bestaat al. Wilt u een andere bestandsnaam kiezen?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Opslaglocatie voor" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Map bestaat al!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" bestaat al. Wilt u een identieke, gekopieerde map in de bestaande " +"mapmaken?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globaal bericht): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s-fout" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Er zijn Meerdere fouten voorgekomen. Klik op OK om de het foutenlogboek weer " +"te geven." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Actieve torrent stoppen?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"U staat op het punt \"%s\" te starten. Wilt u de laatste actieve torrent ook " +"stoppen?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Hebt u al gedoneerd?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Welkom bij de nieuwe versie van %s. Hebt u al gedoneerd?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Bedankt!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Bedankt voor uw donatie! Als u opnieuw wilt doneren, selecteert u \"Doneren" +"\" inhet menu Help." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "verminderd, niet gebruiken" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "Kan opdracht niet via de bestaande controlesocket maken of verzenden." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Alle %s windows sluiten kan het probleem verhelpen." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s is al actief" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Ka de opdracht niet via de bestaande controlesocket verzenden." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Kan de torrent-wachtrij niet starten, zie voor de fouten hierboven." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s maker van torrentbestand %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Maak torrentbestand voor dit bestand/deze map:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Kiezen..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Mappen worden batch-torrents)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Deelgrootte:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Gebruik _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Gebruik _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Knooppunten (optioneel):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Opmerkingen:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Maken" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Poort" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Torrents aanmaken..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Bestandsgrootten controleren..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Begin met seeden" + +#: maketorrent.py:540 +msgid "building " +msgstr "maken" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Gereed." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Torrents aanmaken voltooid." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Fout!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Fout tijdens maken van torrents:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dagen" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dag, %d uren" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d uren" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minuten" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d seconden" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 seconden" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Help" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Veelgestelde vragen:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Ga" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Een bestaande map kiezen..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Alle bestanden" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Nieuwe map maken..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Een bestand selecteren" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Een map selecteren" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Kan opgeslagen staat niet laden:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Kan UI-staat niet opslaan:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Ongeldige inhoud van statusbestand" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Fout bij lezen van bestand" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "kan staat niet volledig herstellen" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Ongeldig staatbestand (gedupliceerde invoer)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Beschadigde gegevens in" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , kan torrent niet herstellen (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Ongeldig staatbestand (foute invoer)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Slecht UI-staat-bestand" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Onjuiste UI-staat-bestandsversie" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "Niet-ondersteunde UI-staat-bestandsversie (van nieuwere clientversie?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Kan gecached %s bestand niet verwijderen" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Dit is geen geldig torrentbestand. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "" +"Deze torrent (of een andere torrent met dezelfde inhoud) wordt al uitgevoerd." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Deze torrent (of een andere torrent met dezelfde inhoud) wacht al om te " +"worden uitgevoerd." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent in onbekende staat %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Kan bestand niet schrijven" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrent zal niet correct opnieuw beginnen bij herstarten van client" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Kan niet meer dan %d torrents tegelijk uitvoeren. Lees de FAQ voor meer " +"informatie: %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Torrent wordt niet gestart omdat andere torrents wachten om te worden " +"uitgevoerd en deze torrent al voldoet aan de instellingen voor het moment om " +"met seeden te stoppen." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Torrent wordt niet gestart omdat de torrent al voldoet aan de instellingen " +"voor het moment om te stoppen met het seeden van de laatst voltooide torrent." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Kan de laatste versie van %s niet krijgen" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Kan nieuwe versietekenreeks van %s niet parseren" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Kan geen passende tijdelijke locatie vinden om de %s %s installer op te " +"slaan." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Geen torrentbestanbd beschikbaar voor %s %s installer" + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s installeer lijkt beschadigd te zijn of te ontbreken." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Kan installer niet onder dit besturingssysteem starten" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"map waarin variabele gegevens zoals snelhervatinformatie en interface-" +"instellingen worden opgeslagen. Standaard is dit de submap 'data' van de " +"configuratiemap van bittorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"Tekencodering wordt gebruikt op het lokale bestandssysteem. Alsdit leeg " +"wordt gelaten, wordt automatische detectie gebruikt. Automatische detectie " +"werkt niet onder versies van Python die ouder zijn dan 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "te gebruiken ISO-taalcode" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ip-adres door te geven aan tracker (heeft geen invloed tenzij je je op " +"hetzelfde lokale netwerk bevindt als de tracker)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"poortnummer is zichtbaar voor de wereld als het een ander nummer is dan dat " +"waarnaar de client lokaal luistert" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "laagste nummer poort om op te luisteren, telt op indien onbeschikbaar" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "hoogste nummer poort om op te luisteren" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ip-adres om lokaal te binden" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "seconden tussen updates van weergegeven informatie" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "" +"aantal minuten dat moet worden gewacht voordat voordat meer peers worden " +"aangevraagd" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "minimum aantal peers om niet opnieuw aanvragen in te dienen" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "aantal peers waarbij er geen nieuwe verbindingen worden aangegaan" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maximum toegestaan aantal verbindingen, hierna worden nieuwe binnenkomende " +"verbindingen meteen gesloten" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "moeten hashes op schijf gecontroleerd worden of niet" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maximum aantal kB/s om mee te uploaden, 0 betekent geen limiet" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" +"Het aantal uploads waaraan geleverd moet worden zonder extra optimistic " +"unchokes" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"het maximumaantal bestanden dat in een torrent met meerdere bestanden " +"tegelijkertijd moet wordenopengehouden. 0 betekent geen limiet. Wordt " +"gebruikt om te voorkomen dat bestandsbeschrijvingen opraken." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"initialiseer een client zonder tracker. Deze optie moet worden ingeschakeld " +"om torrents zonder tracker te downloaden." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"aantal seconden dat moet worden gepauzeerd tussen de verzending van " +"keepalives" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "aantal bytes waarop per aanvraag een query kan worden uitgevoerd" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"maximumlengte voor voorvoegselcodering die je over de kabel accepteert. Bij " +"grotere waarden wordt de verbinding verbroken." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"aantal seconden dat wordt gewacht tussen sluitende sockets waarop niets is " +"ontvangen" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"aantal seconden dat gewacht wordt om vast te stellen of er voor een " +"verbinding een time-out is opgetreden" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maximale lengte van segment om naar peers te sturen. Sluit de verbinding als " +"een groter verzoek wordt ontvangen" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"Maximale tijdsinterval waarbinnen de huidige upload- en downloadsnelheden " +"worden geschat" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"maximale tijdsinterval waarbinnen de huidige seedsnelheid wordt geschat" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"maximale wachttijd tussen het opnieuw proberen van aankondigingen als ze " +"blijven mislukken" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"aantal seconden dat moet worden gewacht op gegevens die via een verbinding " +"binnenkomen voordat wordt aangenomen dat de verbinding semipermanent " +"verstopt is" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"aantal downloads waarbij wordt overgestapt van willekeurig naar meest " +"zeldzame eerst" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "hoeveel bytes er tegelijk naar netwerkbuffers worden geschreven." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"verdere verbindingen weigeren vanaf adressen met onvolledige of opzettelijk " +"vijandige peers die niet-correcte gegevens versturen" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "maak geen verbinding met meerdere peers die hetzelfde IP-adres hebben" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"indien niet gelijk aan nul, stelt u de TOS-optie voor deze peer in opdeze " +"waarde" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"zorg voor een tijdelijke oplossing voor een bug in BSD libc die het lezen " +"van bestanden sterk vertraagt." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adres van HTTP proxy dat voor trackerverbindingen moet worden gebruikt" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "sluit verbindingen met RST en voorkom de status TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Gebruik verstrengelde netwerkbibliotheken voor netwerkverbindingen. 1 " +"betekent verdraaid gebruiken, 0 betekent verdraaid niet gebruiken, -1 " +"betekent automatisch detecteren. Gebruik bij voorkeur de vestrengelde" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"bestandsnaam (voor torrents met één bestand) of mapnaam (voor batchtorrents) " +"om de map 'op te slaan als' en de standaardnaam in de torrent te negeren. " +"Zie ook --save_in, indien geen van beiden is opgegeven wordt de gebruiker " +"gevraagd waar het bestand moet worden opgeslagen" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "geavanceerde gebruikersinterface weergeven" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"het maximumaantal minuten dat een voltooide torrent moet worden geseed " +"voordat met seeden wordt gestopt" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"de minimale upload/downloadverhouding (in procenten) die moet worden bereikt " +"voordat met seeden wordt gestopt. 0 betekent geen limiet." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"de minimale upload/downloadverhouding (in procenten) die moet worden bereikt " +"voordat met het seeden van de laatste torrent wordt gestopt. 0 betekent geen " +"limiet." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Elke voltooide torrent oneindig seeden (totdat de gebruiker deze annuleert)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "De laatste torrent oneindig seeden (totdat de gebruker deze annuleert)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "downloader in de modus pauze starten" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"specifieert hoe een toepassing zich grdraagt als een gebruiker handmatig een " +"andere torrent probeert te starten: \"vervangen\" betekent altijd: het " +"vervangen van de uitgevoerde torrent door de nieuwetoerrent, \"toevoegen\" " +"betekent altijd het parallel toevoegen van de uitgevoerdetorrent en \"vragen" +"\" betekent altijd: de gebruiker elke keer vragen." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"Bestandsnaam (voor torrents met één bestand) of mapnaam (voor batchtorrents) " +"om de torrent 'op te slaan als' en de standaardnaam in de torrent te " +"negeren. Zie ook --opslaan_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"het maximumaantal gelijktijdig toegestane uploads. -1 betekent een " +"(hopelijk) redelijk aantal dat is gebaseerd op -- max_upload_rate. De " +"automatische waarden zijn alleen van toepassing wanneer er één torrent " +"tegelijk wordt uitgevoerd." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"lokale map waarin de inhoud van de torrent wordt opgeslagen. Het bestand " +"(torrents met één bestand) of de map (batchtorrents) wordt in deze map " +"gemaakt en krijgt de standaardnaam die in het bestand .torrent wordt " +"vermeld. Zie ook --save_as" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"het wel of niet vragen naar een locatie om gedownloade bestanden in op te " +"slaan" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"Lokale map waarin de torrents worden opgeslagen onder naam naam die is " +"vastgelegd in --saveas_style. Als deze optie leeggelaten wordt, wordt elke " +"torrent opgeslagen in de map van het overeenkomstige bestand .torrent" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "hoe vaak de torrentmap opnieuw gescand wordt, in seconden" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Manieren om een naam aan torrentdownloads te geven: 1: gebruik de naam VAN " +"het torrentbestand (zonder .torrent); 2: gebruik de naam gecodeerd IN het " +"torrentbestand; 3: maak een map met de naam VAN het torrentbestand (zonder ." +"torrent) en sla de download op in die map onder de naam die is gecodeerd IN " +"het torrentbestand; 4: als de naam VAN het torrentbestand(zonder .torrent) " +"en de naam gecodeerd IN het torrentbestand identiek zijn, gebruikt u die " +"naam (stijl 1/2), of maak anders een tussenmap als in stijl 3; LET OP: bij " +"opties 1 en 2 kunnen bestanden zonder waarschuwing worden overschreven, wat " +"beveiligingsproblemen kan veroorzaken." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"of voor elke torrent het volledige pad of de torrentinhoud moet worden " +"weergegeven" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "map om .torrentbestanden in op te zoeken (semi-recursief)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "of diagnostische informatie op stdout moet worden weergegeven" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "op welke macht van twee de stukgrootte moet worden gezet" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "standaardnaam van tracker" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"Bij onwaar maakt u een trackerloze torrent in plaats van een aankondigings-" +"URL. Gebruik een betrouwbaar knooppunt met de opmaak : of een " +"lege tekenreeks om enkele knooppunten uit uw routingtabel op te halen." + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "download voltooid!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "voltooid over %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "download is geslaagd" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB up / %.1f MB down)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB up / %.1f MB down)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d nu gezien, plus %d gedistribueerde kopieën (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d gedistribueerde kopieën (volgende: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d nu gezien" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "FOUT:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "bezig met opslaan van:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "bestandsgrootte:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "percentage voltooid:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "resterende tijd:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "downloaden naar:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "downloadfrequentie:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "uploadfrequentie:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "deelscore:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "seedstatus: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "peerstatus:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Je kunt niet beide opgeven (--save_as en --save_in)" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "bezig met afsluiten" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "fout tijdens het lezen van configuratie:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Fout tijdens het lezen van het .torrent-bestand:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "je moet een .torrent-bestand opgeven" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"De initialisatie van de gebruikersinterface in tekstmodus is mislukt, kan " +"niet doorgaan." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Voor deze downloadinterface is de standaard Python-module \"curses\" " +"vereist. Deze module is niet beschikbaar is voor de native Windows-poort van " +"Python. De module is echter wel beschikbaar voor de Cygwin-poort van Python, " +"die op alle Win32-systemen kan worden uitgevoerd (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Je kunt \"bittorrent-console\" nog steeds gebruiken om te downloaden." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "bestand:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "grootte:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "bestemming:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "voortgang:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "status:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "dl snelheid:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "ul snelheid:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "gedeeld:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "seeds:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "peers:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d nu gezien, plus %d gedistribueerde kopieën (%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "fout(en):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "fout:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Upload Download Voltooid Snelheid" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" +"bezig %d stuks te downloaden, heb %d fragmenten, %d van %d stuks voltooid" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Deze fouten hebben plaastgevonden tijdens het uitvoeren:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Gebruik: %s TRACKER_URL [TORRENTBESTAND [TORRENTBESTAND ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "oude aankondiging voor %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "geen torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTEEMFOUT - UITZONDERING GEGENEREERD" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Waarschuwing:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "is geen map" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"fout: %s\n" +" uitvoeren zonder argumenten voor parameteruitleg" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"UITZONDERING:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" +"Je kan nog steeds \"btdownloadheadless.py\" gebruiken om te downloaden." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "bezig verbinding te maken met peers" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tijd tot voltooiing %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Grootte" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Downloaden" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Uploaden" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totalen:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s peers %s seeds %s gedistr kopieën - %s download %s upload" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "fout:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +" uitvoeren zonder argumenten voor parameteruitleg" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "optioneel leesbaar commentaar om in .torrent te plaatsen" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "optioneel doelbestand voor de torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodeer %s metainfo bestanden" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Gebruik: %s [TORRENTFILE [TORRENTFILE ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "metainfo bestand: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "info hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "bestandsnaam: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "bestandsgrootte:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "bestanden:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "mapnaam: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "archiefgrootte:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "aankondigings-url van tracker: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "(trackerloze knooppunten)" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "commentaar:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Kon geen controlesocket maken:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Kon geen opdracht sturen:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Kon geen controlesocket maken: reeds in gebruik" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Kon oude controlesocket bestandsnaam niet verwijderen:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Wereldwijde mutex is al aangemaakt." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Kon geen open poort vinden!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Kon geen map met programmagegevens aanmaken!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Kon geen wereldwijd mutex slot verkrijgen voor controlsocketbestand!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" +"Een oudere sessie van BT was niet juist opgeschoond. Huidige sessie gaat " +"door." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "geen geldige bgeëncodeerde string" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "ongeldige bgeëncodeerde waarde (data na geldig voorvoegsel)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Gebruik: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPTIES] [TORRENTMAP]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Bij aanwezigheid van een niet-optie argument, wordt het geinterpreteerd als " +"de waarde\n" +" van de torrent_dir optie.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPTIES] [TORRENTBESTANDEN]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPTIES] [TORRENTBESTAND]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPTIE] TRACKER_URL BESTAND [BESTAND]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argumenten zijn -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(standaard als" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "onbekende sleutel" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parameter aan het einde ingevoegd zonder waarde" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "commandoregel verwerking mislukt bij" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Optie %s is verplicht." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Moet minstens %d argumenten ingeven" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Te veel argumenten - %d maximaal" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "verkeerde formaat van %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "kon opties niet permanent opslaan:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Tracker aankondiging nog steeds niet compleet %d seconden na start" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Probleem verbinden met de tracker, gethostbyname mislukt -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Probleem met verbinden met tracker -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "verkeerde data van tracker -" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "afgewezen door tracker -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Bezig torrent stop te zetten aangezien deze werd afgewezen door de tracker " +"zonder met enige peers verbonden te zijn." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Bericht van de tracker:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "waarschuwing van de tracker - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Kon map niet lezen" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Kon niet vinden" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "verwijderen %s (zal opnieuw toevoegen)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**waarschuwing** %s is een kopie van torrent %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**waarschuwing** %s heeft fouten" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... gelukt" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "verwijder %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "klaar met controleren" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "server socket verloren" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Fout bij omgang met geaccepteerde verbinding:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Moet weggaan omdat de TCP stack het begaf, raadpleeg a.u.b. de FAQ op %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Te laat om RawServer backends, %s is al gebruikt." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Ma" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Di" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Wo" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Do" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Vr" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Za" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Zo" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "mrt" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "mei" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "aug" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "okt" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "dec" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Gecomprimeerd: %i Niet gecomprimeerd: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"De naam van het .torrent bestand kan niet worden gekozen bij aanmaken van " +"meerdere torrents tegelijkertijd" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Bestandssysteem codering \"%s\" wordt niet ondersteund in deze versie" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Kon bestands- en mapnaam \"%s\" niet omzetten naar utf-8(%s). Of de " +"veronderstelde bestandssysteem codering \"%s\" is verkeerd of de " +"bestandsnaam bevat illegale bytes." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Bestands- en mapnaam \"%s\" bevat gereserveerde unicode waardes die niet " +"overeenkomen met karakters." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "slechte data in antwoordbestand - totaal te klein" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "slechte data in antwoordbestand - totaal te groot" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "controleren bestaand bestand.." + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 of fastresume info komt niet overeen met bestandsstatus " +"(mist data)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Slechte sneldoorgaan info (bestanden bevatten meer data)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Slechte sneldoorgaan info (illegale waarde)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "data corrupt op schijf - misschien lopen er twee programma's?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Kon sneldoorgaan data niet lezen:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"bestand zou compleet zijn bij opstarten, maar deel is fout volgens hash " +"controle" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Bestand %s behoort tot een andere actieve torrent" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Bestand %s bestaat al, maar is geen regulier bestand" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Leesinvoer kort - iets heeft bestanden misvormd?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Sneldoorgaan bestand niet ondersteund, misschien van een andere programma-" +"versie?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Het bestand blijkt te zijn verplaatst, hernoemd of verwijderd door een ander " +"programma." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Het bestand blijkt te zijn aangepast door een ander programma." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "De bestandsgrootte blijkt te zijn veranderd door een ander programma." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Kon signaal regelaar niet instellen:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "laten vallen \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "toegevoegd \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "wachten op hash controle" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "downloaden.." + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Opnieuw inlezen configuratiebestand" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Kan bestand %s niet lezen" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Kan \n" +" %s\n" +" niet downloaden of openen. Probeer webbrowser te gebruiken om de torrent te " +"downloaden." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Dit lijkt een oude versie van Python te zijn, die detecteren van " +"bestandsysteemcodering niet ondersteunt. Verondersteld wordt 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python kan de bestandsysteemcodering niet automatisch detecteren. Daarom " +"wordt 'ascii' gebruikt." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Bestandsysteemcodering '%s' wordt niet ondersteund. Daarom wordt 'ascii' " +"gebruikt." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Beschadigde component van bestandspad:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Dit .torrent-bestand is gemaakt met een beschadigde tool en de bestandsnamen " +"zijn onjuist gecodeerd. Alle of een deel van de bestandsnamen verschijnen " +"mogelijk anders dan bedoeld door de maker van het .torrent-bestand." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Dit .torrent-bestand is gemaakt met een beschadigde tool en heeft " +"onjuistetekenwaarden die niet met een echt teken overeenkomen. Sommige of " +"alle bestandsnamen verschijnen mogelijk anders dan bedoeld door de maker van " +"het .torrent bestand." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Dit .torrent-bestand is gemaakt met een beschadigde tool en de bestandsnamen " +"zijn onjuist gecodeerd. De gebruikte namen zijn mogelijk nog juist." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Met de tekenset die in het lokale bestandsysteem (\"%s\") wordt gebruikt, " +"kunnen niet alle tekens worden weergegeven die in de bestandsnamen van deze " +"torrent voorkomen. De bestandsnamen zijn gewijzigd ten opzichte van de " +"oorspronkelijke namen." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Het Windows bestandsysteem kan niet omgaan met sommige tekens in de " +"bestandsnamen van deze torrent. Bestandsnamen zijn gewijzigd ten opzichte " +"van het origineel." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Dit .torrent bestand is gemaakt met een kapotte tool en heeft tenminste 1 " +"bestand met een ongeldige bestands- of mapnaam. Maar aangezien deze " +"bestanden gemerkt waren met een lengte van 0 worden deze genegeerd." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Python 2.2.1 of nieuwer benodigd" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Kan niet dezelfde torrent twee keer apart van elkaar opstarten" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxpoort kleiner dan minpoort - geen poorten om te controleren" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Kon geen luisterende poort openen: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Kon geen luisterende poort openen: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Controleer instellingen van poort bereik." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Beginfase opstarten" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Kon niet snel vervolgen data: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Zal volledige hash controle uitvoeren." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "deel %d kwam niet door hash controle, opnieuw downloaden.." + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Poging een trackerloze torrent met een trackerloze cliënt te downloaden, " +"uitgeschakeld" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "download mislukt:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"IO Fout: Geen ruimte vrij op schijf, of kan niet zo'n groot bestand aanmaken:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "beëindigd door IO fout:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "beëindigd door OS fout:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "beëindigd door interne uitzondering:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Bijkomende fout bij afsluiten ten gevolge van fout:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Kon sneldoorgaan bestand niet verwijderen na fout:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "seeding" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Kon sneldoorgaan data niet wegschrijven:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "sluit af" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "slechte metainfo - is geen woordenboek" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "slechte metainfo - slechte delen sleutel" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "slechte metainfo - illegale lengte van deel" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "slechte metainfo - verkeerde naam" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "naam %s niet toegestaan wegens beveiligingsredenen" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "enkel/meerdere bestand mix" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "slechte metainfo - verkeerde lengte" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "slechte metainfo - \"bestanden\" is geen bestandslijst" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "slechte metainfo - foute bestandswaarde" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "slechte metainfo - fout pad" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "slechte metainfo - fout pad naar map" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "pad %s niet toegestaan wegens beveiligingsredenen" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "slechte metainfo - identiek pad" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "slechte metainfo - naam gebruikt zowel als bestands- en ondermapnaam" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "slechte metainfo - verkeerd object type" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "slechte metainfo - geen aankondigings URL string" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "non-tekst fout reden" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "non-tekst waarschuwingsbericht" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "ongeldige ingang in peer lijst1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "ongeldige ingang in peer lijst2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "ongeldige ingang in peer lijst3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "ongeldige ingang in peer lijst4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "ongeldige peer lijst" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "ongeldig aankondigings interval" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "ongeldig min aankondigings interval" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "ongeldig tracker id" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "ongeldige peer uitkomst" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "ongeldige seed uitkomst" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "ongeldige \"laatste\" ingang" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Poort om op te luisteren." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "bestand in welke recente downloader info op te slaan." + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "timeout bij afsluiten connecties" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "seconden tussen het bewaren van de downloadfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "seconden tussen het verlopen van downloaders" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "seconden wachten voor downloaders tussen heraankondigingen" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"default aantal peers waaraan een info bericht gestuurd moet worden als the " +"client geen nummer specificeerd" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "wachttijd tussen het controleren van mogelijke timeouts bij connecties" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"hoe vaak controleren of een downloader zich achter een NAT bevindt (0 = geen " +"controle)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "regels toevoegen aan log omtrent nat-controle resultaten?" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "minimale tijd tussen de laatste schoonmaak en een nieuwe" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"minimale tijd in seconden voor een cache wordt gezien als niet-actueel en " +"zal worden gewist" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"alleen downloads toestaan voor .torrents in deze map (en onderliggende " +"mappen van mappen die zelf geen .torrent bestanden hebben). Indien aan, " +"verschijnen torrents in deze map op de infopagina zowel als zij wel of geen " +"peers bevatten" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"toestaan van speciale toetsen in torrents uit de allowed_dir om tracker " +"toegang te beïnvloeden" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "heropenen log bestand bij ontvangen HUP signaal?" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"info pagina weergeven wanneer de hoofdmap van de tracker wordt geladen?" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "een URL om de info pagina naar toe te leiden" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "namen uit allowed dir weergeven?" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"bestand bevattend x-icon data dat moet worden teruggestuurd na aanvraag " +"favicon.ico door browser" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"negeer ip GET parameter van computers die niet behoren tot LAN IP's (0 = " +"nooit, 1 = altijd, 2 = negeren als NAT controle niet ingeschakeld is). HTTP " +"proxy headers die het adres van de originele gebruiker laten zien, worden " +"hetzelfde behandeld als --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"bestand voor het schrijven van de tracker logs, gebruik - voor stdout " +"(standaard)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"gebruik met allowed_dir; voegt een /bestand?hash={hash}url toe zodat " +"gebruikers de torrent file kunnen downloaden" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"bewaar oude torrents nadat zij verlopen (zodat zij blijven verschijnen op /" +"scrape en webpagina). Alleen van belang als allowed_dir niet is ingesteld" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "scrape toegang permissies (kan niets, specifiek of alles zijn)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "maximale aantal peers om te geven als iemand vraagt" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"uw bestand kan ergens bestaan in het universum\n" +" maar helaas, niet hier\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**waarschuwing** opgegeven favicon bestand -- %s -- bestaat niet." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**waarschuwing** statusbestand %s corrupt; opnieuw aanmaken.." + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Log Gestart: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**waarschuwing** kon stdout niet doorsturen naar log bestand:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Log heropend:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**waarschuwing** kan het logfile niet heropenen" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "specifieke scrape functie is niet beschikbaar bij deze tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "hele scrape functie is niet beschikbaar bij deze tracker." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "get functie is niet beschikbaar bij deze tracker." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"Aangevraagde download is niet toegelaten voor gebruik met deze tracker." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "voer uit zonder argumenten voor uitleg van parameters" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Afsluiten..: " diff --git a/locale/pl/LC_MESSAGES/bittorrent.mo b/locale/pl/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..94bdbfec3dc59b032449a656f68300a7e387ba80 GIT binary patch literal 62632 zcmdqK2b^42dG~)YHa6>qJ8t+&_M(-oT{YKrk<~3rmSkyVVH>l|?#!-c%gi!G>sbf{ z$HpXdFc9Me2;k7GNdRN2C3-g{5JK-Ep+g{nyx-sRoO9>S?#ed2`Tsxf`|d|qzgx~d z_mt;6?L6nq*N#2-g$aLGACx4gfv-9?Nlt%gk}T=g-6VPW@+3JN{5x<7_(t#&@GIaZ z@T3(bt)HPXYe`s+=dEpClW> zHQ)*0Ux7;Za`55c>%;wj09D_QgDUTLL8_b_dqI+%1#SQ@2FF2t@718{abLi1f-2Wf zK;?7Lg-Nm*JPlMo?E&?@>2UqjaQ$3R`M(5Q1HKPbz6V{DB-etE0M!m-pz2!>*LQ-- z?@i(QonXrK2f#;z-wOEfe$Q_iNR^VyKu95Jg6qK7fap_*{Mc_j4lc4hXDX98% zU793kfX9O;g6D#wyUpNf;0{pqSOt~-dExmT;rbQf`5Qo^V^DPdWsssJKLTF_KKe56 z=l6ih??>QL@Q793j+cM~T;Bk00^bJe`~L;1zfQi~>w6if`$M4aKLu3#y$U=V{1~YF zzXH{6r>yq+E&=tu4WQa@Z@B*|@R3}<7km`>B@mKIehq3|^g$#Gz{^0<^W#C)Z!dTT zcq^!Odv&<~UQqP+X;9vVQ3sOP7GDcB2M0&WEtg3kceUvC1{ zFCPKb&z}ZQ0zVJx{U3+xKY*gI6W4kEr-7QKP_s#)T&Q$?7fHY-t6{vQ74){>;!{Bo8|iF?EKKY>dB)o}eykRh6U7Ze?yb(Oc@ zMo{0s5)_^90QLO>sQhNYKJYo9%JE)M-~Sjm27VR13Ea5V%ki;*p9=Un@F<>t5!8F% z1&;)O6Rr>0=Jh@a6x}^4T%QN3T$g})e;ugr?+o_`L0CyL3QBIg8dUywgGYm(08{X* z;Q8S1!E?cLVWR4vGN^vL1%y+6;!_80G0lS;1S?|fvWGrcX<6%P;|8jRJ&dbihlndJO=z%a4q>522v`r-EwG#GCxI)$SAdXy@O=wfhsm)4@AINF=!z>;+GJypP{?AWfIl!KL6QLG|_veCYr#FEofgcI@ z4N!FUAE445UvgXlp2_ug5LGd0fZgDm!85=wfGPMZQ1p1>h`09{p!)yOpwcY^p9O9Q zPXxaPUIP9qJYO;D@9zMQVns@L}MEpxSX2cpkU| zd@1;JP~Trv_VR25FXj4bQ0?~|Q1AUMDE{>pQ2qMBaQ}1R`n#a|_gCOr@F8Q~-s?ft z=W(FkYl0f5w}4lG&j%k4{xhg@eiu9x{4uC<{u0~>o;?mv0&C!Rz!N6Ce7^&`xIS#s z^FIz;#Pyk=`eQSwc6b`7{GSP`e_sGz2)+?q27V9h0Z*#^9R6Vz|V*4?*;rV zsPS+_4W0om1fL2%4OG7$R(Cud)OcS3s@_+F-v@Vt`@mHV@27*C-tLb8_1#mzbHH8@ zl1r`yVcE(1!}TNg`uKVZsQSGfTmyaz+yNdl?Q*UN_HzANQ1$o{*a!X)TnRq%MsL?G z;CilK1S$wxWlIs_NL*O?- z<+JW7K28QeegCnb?hk{9fpt*jeG+&i_%u-McpE6Xcq4cTco+EJ;7`F+_~%X!$3R?% za(x!~3~&i}HTX{OePGv3jAig+U=h6hFMQnJ391}F1XqE-1_!mtL>$fLCyR)?fKJ znFQ6&`@wGTK5!lQTksU{G8$3!ycSeHPJsR3r$Mzt*E5|DoCzwQ)gYfuwtEKeXF9J7$Wl-(% zR`5{p6W|fx=Rx(uH$jby--4>oiO*#$gBOFBfiDI{Uta{(&L=+4zjrX_+juc@Prq-Uic_*A=eAR<=}cy z^g11$e+pDTd=7jR_(M?bbJ&ZV&NqUh$ESh^gRchFzHb1l;6Ct5@Z1-BeV+nq9DNj2 zJ$?v^9)1BX08jdBFW*Jr>0GY?RsP3=YQGnNqQjShqT4$`)&H%a+UYCcvEcW?&EW6A z*Ml2wcRBHMQ0>3qCC;C=fa>SJ1WVvY!6LZy4%d5c1N*psH>mf11ghOn_#1DpOF@;d z3SJDp0#ti^4Lk`v_;0-)r-943?gy1_98^2JI^c&vedqh2+UvxZ`gkgU`d$+}1^io3 z`MwiWy*~q<2>up44t&JR9M1wphZlm!gBt@r7JMkzPXI*+O;GgrWKeYQ98lkX8>s&H zJ*e-U@p8}i0#NO~8PxOL;3L5nsP=h2sD5}4*adzJRDXN{RC#^?s=U7e_57&6bGdpl zsPdc!o&$D+j|Q&>RsI`6wd=FMOToLqCE(A%bHPWw!ppxC)OgI0dRb8sO>R zQ^WPkz%H)e0E%C|Bi#QicqG?f1Jw^d234+Kg6gj$U+>@P2hZaAvT!{ND*b4DAL<#=zv z4}$8i4}of@kAtH7uYejKKL=IMhrY?be>$k=XM$be#o%G!2Jk3w8>sR<4%G7}fLp;Q zfqL)bpvv{_fWHGT;`*33)7Ri;Q1y5XxDfnTup2z;EpDHm3#wet2GzeW15W@y0v-u| z4O|QU7(54D_Ex8t$AX7*T>&+&W+Q}@jsjJmWuU%)Ehsvv zfufHWgDU^aK-Ks4;4<(7pvK+LLFISsKR91G5fr_g9Inp*S8}}&><6y_C&1@{>c2mL zuK^GJN7@p63)l;`-r@Snt3kEr*TM6_!{6!l;u`SxTrYYTHVN2$cak6ilHY@W0AKQM zuh;GOz{|M)Ah;2{_&v}H_!pqceIK|9{1Pa-UhrP0mn*>2xqdu&BKTzRXz+!g%6(_J z|0eKZT<-^!&nH0Td*b_?Z=C|_dj(Ma@m5gz-2;Ey&N0{uLV`E_kil>4}ltAUjQ!$zXGa$r+yG$61WCj4Bi1=2<``W zf`16tJMQ)RKLfmk`>zF8f!_l!03W^2pFa*fiR&kUs@HAcnc(X|mG{%2>hWbz>Anjd z2mT&B9z15h)61hlm3s-O_bvw2uIt0~mVnoQ>W9aJ`rZ_H40tQ3_iqOe0bc_upErRg zfbRsA-={#0*Dru6_-#<-JNQHX{1Kq~;UrM^*Mp+ltHEo)XM+0Pw?UQTSD@t3As_a3 zSrG7AP;~!1a0$2{JPZ6exDY%EVt+K)4=x7_U?2Db@Eq`i;0o~H!Cl~jk9t2$gFRfo zJ>b89s?Wnd=KX&>C^|bGTnzSrZw7aOXMhKN-1W(Y;Q3q^K&Ag{Q2p^rQ2qT*Q1$&4 zcnY}X6ONosD5~Vxc?(?GuPdp_x5-K_yw+C2krp>oQvOr_kkyZpZubav+sbSn}fdOdQdmG zi0iR{&kuNaz;A&|c;59--o6)rr*XYITsJ`V>usRQ{bq0k{5be#aK)G1zWWxqg6m_y z;`yxy)t)u*aN27Iq$!f8{j=wD?N_}Yn*pB zdK!2I*RKIZ_df$418)4f^U;@sqKlt`mw^X;Bh2H2>X+w$>%i}U{opy@bh~T>Jeupj z0mYx*0IK~y1B%c82Y5Yr;n5C68e-%;SP4@B;9K zpz8lg@Obcu@4I|k0P6c?P~-15@M7?T;FaJXz#_Qm2mbvxf$ER{1djt7KlJhTbWr7e z0eBMlH=x?@?ckx{KJek-C%|s-i=fi~7pQU_@+10@c3KCX!}YWN)$@NBcnH^@1pf}a z4^;m)e~iurehPdpc=x{{Q^3vt?&bansCGN>xd>r^O@HlYsFMS+d3aTG&0BIikyN&;E=HhwrM!0_q*L%YGA)G&j z<2sHP}-#gD@~e+Q~>G#=06nC7T)?{(lmb3Bf7hF@|hdAynP8s~>|zKe7HiC$mIv5)Kh z;oi%+*57^M`a_(HPW88gd#?-kKMMXQ_kPQ97U$P;d|HY4`wPxr=BLSJoQrS7zoBq) z4)^u<1@K`UGn^k~chKpC*6JFrO(Hg!N2AC?>Y4MP>wspxvpQtv7MvIy(2iDshhdKXK-(j>nDNl;An9! zUiFxe=4YJi?>|8CjHid|8v`z&T)*f3Tf(){zEJ=1cW&<9?OYFW4J)(1j|O}jxSIR# z2LB4X+ zSsWWk^Dgd7j<4kWQQ`Ry!1KBH{&3A{atDX_|7Pwj;Z1VXH_f7_1&Glb#zBfF76X%k7`uhooT*|XAa`bcP zFXgzL<6@4laCGthX*@e0{BlThHuzAke+Zt+@nq5+!FBvw#>rle$8!7=$HzDplJ2|U zCpq-Dg7kXjYutZ0hyFH!Cvx)=j+LAr3H}-QiSYbOq$zN|5&WL+h5JX5ZXuVqalHwA z4~PD~$MG4C8SZ~Bq}{^xKXLvI@D<>390&3KTeyyY59MAT7mK;SJls4nJ_N7jxPvq& zbL{5)RXD?{DX*bNvdgPX~VoJ{NpA_x1Nm2b=4?i2KX9{}JwejC1`x zBBXnYUnZ-<^}zvu#r^#p-y!{1I6lDn2_bES3%Gv)7X^-&a=w9MTX;ATu*yCC4F~)& z=S#wQAGn3@9SdG!si4>JOqWv}XK`E+%JeMGw{rX?hyKpt{%gQX!Efc>+sXM0IeuZO z+~4=JaQ++a|AF(G9H(&nJNMqr@iflAz_Ey99mk(@?`V!* z(*HNtH*%D@K8$0O<5ArI9QQt`b8s8iH-P$kH20Qp{VMPR@Snlwa{mTUf6oc{YR{>-bLm``7UN9&Vfz&bNbya=ilV z29F{ARUE(M{B0r4pL4Fi!?`|%1 zo*f3>1>PN=f0OeCoPP?`->E#`#PI~quj1Ge?q8&bUF#pScK!B&P20BiCtbB>C7mue z_N0|+TBwcI(~)W|ohsA{lch$fmX>aunkZBXjdHb8Pg4GRy6cP6?t0p*|E5Z%T3sjg zQmJSs#d5uo4p*njrI4gp(evgMFQ2LR(@onA^8f9cny40vxjXBs)0OPj+Un%g1cf2N zPCi&n(w<^zq|lsb)YC>aP0}UlaG_GEHqu(D-l*0}+^yA0l}6f=q-!Ut^>Sr2Elf

Uw>x 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 literal 0 HcmV?d00001 diff --git a/locale/pl/LC_MESSAGES/bittorrent.po b/locale/pl/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..94b0dd0 --- /dev/null +++ b/locale/pl/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2895 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-10 17:54-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Zainstaluj Pythona 2.3 lub nowszego" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Wymagany jest PyGTK 2.4 lub nowszy" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Podaj adres torrenta" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Podaj adres pliku torrent do otwarcia:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "łącze komutowane" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/kabel ponad 128k" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/kabel ponad 256k" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL ponad 768k" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maksymalna prędkość przesyłania:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Tymczasowo zatrzymaj wszystkie uruchomione torrenty" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Wznów pobieranie" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Wstrzymany" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Brak torrentów" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Normalnie pracujący" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Za zaporą sieciową/NAT-em" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Dostępna jest nowa wersja programu %s" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Dostępna jest nowsza wersja programu %s.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Używasz wersji %s, a nowa wersja to %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Najnowszą wersję programu można pobrać ze strony \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Pobierz _później" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Pobierz _teraz" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "P_rzypomnij później" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Informacje o programie %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Wersja %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Nie można otworzyć %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Przekaż darowiznę" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Dziennik aktywności programu %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Zachowaj plik dziennika w:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "zachowano plik dziennika" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "wyczyszczono plik dziennika" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Ustawienia programu %s" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Zachowywanie" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Zachowuj nowe pliki w:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Zmień..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Pytaj, gdzie zachować każdy nowy pobierany plik" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Pobieranie" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Po ręcznym uruchomieniu dodatkowych torrentów:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Zawsze zatrzymuj _ostatni uruchomiony torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Zawsze rozpoczynaj torrenty _równolegle" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Pytaj za każdym razem" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Seedowanie" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Seeduj zakończone torrenty: aż stosunek udostępniania przekroczy [_] " +"procent, lub po [_] minutach, cokolwiek nastąpi pierwsze." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Seeduj na czas nieokreślony" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Seeduj ostatnio zakończony torrent: dopóki stosunek udostępniania nie " +"osiągnie [_] procent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Sieć" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Szukaj dostępnego portu:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "zaczynaj od portu: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "Raportowanie IP do trackera:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Nie daje efektu, jeśli jesteś w tej\n" +"samej lokalnej sieci co tracker)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Zawsze czarny tekst paska postępu\n" +"(wymaga ponownego uruchomienia)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Różne" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"OSTRZEŻENIE: Zmiana tych ustawień może\n" +" przeszkadzać w prawidłowym funkcjonowaniu programu %s." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opcja" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Wartość" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Zaawansowane" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Wybierz standardowy folder dla pobieranych plików" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Pliki w \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Zastosuj" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Przydziel" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nigdy nie pobieraj" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Zmniejsz" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Zwiększ" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nazwa pliku" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Długość" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peery dla \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Adres IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Klient" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Połączenie" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s pobier." + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s wysył." + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB pobranych" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB wysłanych" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% wykonania" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s szac. pobierania peerów" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID peera" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Zainteresowany" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Zapchany" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Ograniczony" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optymistycznie wysyłanie" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "zdalne" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokalne" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "błędny peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d OK" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d błędnych" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "zakazany" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "OK" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informacje o \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nazwa torrenta:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent beztrackerowy)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Adres ogłoszenia:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", w jednym pliku" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", w %d plikach" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Całkowita wielkość:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Fragmenty:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Informacje o hashu:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Zachowaj w:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nazwa pliku:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Otwórz folder" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Wyświetl listę plików" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "przeciągnij, aby zmienić kolejność" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "kliknij prawym przyciskiem myszy, aby wyświetlić menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informacje o torrencie" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Usuń torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Przerwij torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", będzie seedował do %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", będzie seedował przez czas nieokreślony." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Zakończono, stosunek udostępniania: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Zakończono, wysłano %s" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Zakończono" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Informacje o torrencie" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Otwórz folder" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Lista plików" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Lis_ta peerów" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Zmień położenie" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Seeduj przez czas nieokreślony" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Uruchom_ponownie" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Zakończ" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Usuń" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Przerwij" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Czy na pewno chcesz usunąć \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Stosunek udostępniania dla tego torrenta wynosi %d%%. " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Wysłano %s do tego torrenta." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Usunąć ten torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Zakończono" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "przeciągnij na listę, aby seedować" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Nieudane" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "przeciągnij na listę, aby wznowić" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Oczekuje" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Uruchomiony" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Obecnie wysył.: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Obecnie pobier.: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Poprzednio wysył.: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Poprzednio pobier.: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Stosunek udostępniania: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s peerów, %s seedów. Razem z trackera: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Rozprowadzane kopie: %d; Dalej: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "" +"Fragmenty: razem %d, zakończono %d, %d częściowo, %d aktywnych (%d pustych)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d błędnych fragmentów + %s w odrzuconych żądaniach" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% ukończono, pozostało %s" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Prędkość pobierania" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Prędkość wysyłania" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Nie dotyczy" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "Rozpoczęto %s" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Otwórz plik torrenta" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Otwórz _adres torrenta" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Utwórz _nowego torrenta" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Wstrzymaj/wznów" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Zakończ" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Wyświetl/ukryj_zakończone torrenty" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Dopasuj okno" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Dziennik" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Ustawienia" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Pomoc" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Informacje" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Przekaż darowiznę" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Plik" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Widok" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Szukaj torrentów" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(zatrzymano)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(wiele)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Pobrano już %s programu instalacyjnego" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Zainstalować nową wersję programu %s?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Czy chcesz teraz zakończyć program %s i zainstalować nową wersję, %s?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Pomoc programu %s dostępna jest na \n" +"%s\n" +"Czy chciałbyś tam teraz przejść?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Odwiedzić stronę internetową pomocy?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Jest jeden zakończony torrent na liście. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Czy chcesz go usunąć?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Jest %d zakończonych torrentów na liście. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Czy chcesz je wszystkie usunąć?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Usunąć wszystkie zakończone torrenty?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Nie ma żadnych zakończonych torrentów" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Nie ma żadnych zakończonych torrentów do usunięcia." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Otwórz torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Zmień miejsce zachowywania na " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Plik istnieje!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" już istnieje. Czy chcesz wybrać inną nazwę pliku?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Zachowaj położenie na " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Folder istnieje!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" już istnieje. Czy chcesz utworzyć identyczny duplikat foldera w już " +"istniejącym folderze?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(wiadomość globalna): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "Błąd %s" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Wystąpiło wiele błędów. Kliknij OK, aby zobaczyć dziennik błędów." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Zatrzymać uruchomiony torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Zaraz uruchomisz \"%s\". Czy chcesz w takim razie zatrzymać ostatnio " +"uruchomiony torrent?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Przekazałeś już darowiznę?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Witaj w nowej wersji programu %s. Przekazałeś już darowiznę?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Dzięki!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Dziękujemy za przekazanie darowizny! Aby przekazać ponownie, wybierz " +"\"Przekaż darowiznę\" z menu \"Pomoc\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "przestarzałe, nie używaj" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Nie udało się utworzyć lub wysłać polecenia poprzez istniejące gniazdo " +"kontrolne." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr " Zamknięcie wszystkich okien programu %s może rozwiązać problem." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s jest już uruchomiony" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Nie udało się wysłać polecenia poprzez istniejące gniazdo kontrolne." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Nie można zacząć kolejki torrenta, zobacz powyżej odnośnie błędów." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s twórca pliku torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Utwórz plik torrent dla tego pliku/foldera:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Wybierz..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Foldery staną się torrentami wieloplikowymi)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Rozmiar fragmentu:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Użyj _trackera:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Użyj _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Węzły (opcjonalnie):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Komentarze:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Utwórz" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Komputer" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Budowanie torrentów..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Sprawdzanie rozmiarów plików..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Rozpocznij seedowanie" + +#: maketorrent.py:540 +msgid "building " +msgstr "budowanie " + +#: maketorrent.py:560 +msgid "Done." +msgstr "Zakończono." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Zakończono budowanie torrentów." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Błąd!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Błąd podczas budowania torrentów: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dni" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dzień %d godzin" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d godzin" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minut" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d sekund" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 sekund" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "Pomoc programu %s" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Najczęściej zadawane pytania:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Przejdź" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Wybierz istniejący folder..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Wszystkie pliki" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrenty" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Utwórz nowy folder..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Wybierz plik" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Wybierz folder" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Nie można wczytać zachowanego stanu: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Nie można zachować stanu UI: " + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Nieprawidłowa zawartość pliku stanu" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Błąd podczas odczytywania pliku " + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "nie można całkowicie przywrócić stanu" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Nieprawidłowy plik stanu (powtarzające się wpisy)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Uszkodzone dane w " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , nie można przywrócić torrenta (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Nieprawidłowy plik stanu (błędny wpis)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Błędny plik stanu UI" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Błędna wersja pliku stanu UI" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "Nieobsługiwana wersja pliku stanu UI (jest z nowszej wersji klienta?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Nie można usunąć pliku %s zapisanego w pamięci podręcznej:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "To nie jest poprawny plik torrenta. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Ten torrent (lub inny z tą samą zawartością) jest już uruchomiony." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Ten torrent (lub inny z tą samą zawartością) już oczekuje na uruchomienie." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent w nieznanym stanie %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Nie można zapisać pliku " + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"torrent nie zostanie poprawnie uruchomiony ponownie przy ponownym " +"uruchomieniu klienta" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Nie można uruchomić więcej niż %d torrentów jednocześnie. Aby dowiedzieć się " +"więcej, zobacz FAQ na %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Nie rozpoczynaj torrenta, kiedy są inne torrenty oczekujące na rozpoczęcie, " +"a ten już ma ustawienia do zatrzymania seedowania." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Nie rozpoczynaj torrenta, który ma już ustawienia do zatrzymania seedowanie " +"ostatnio zakończonego torrenta." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Nie można było pobrać ostatniej wersji z %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Nie można zinterpretować nowej wersji ciągu znaków z %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Nie można znaleźć odpowiedniego tymczasowego miejsca do zachowania programu " +"instalacyjnego %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Brak dostępnego pliku torrenta dla programu instalacyjnego %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "Program instalacyjny %s %s jest uszkodzony lub go brak." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "" +"Nie można uruchomić programu instalacyjnego na tym systemie operacyjnym" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"folder, w którym zostaną zachowane zmienne, takie jak informacja fastresume " +"i stan GUI. Standardowo podfolder 'data' w folderze konfiguracyjnym " +"BitTorrenta." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"kodowanie znaków używane w lokalnym systemie plików. Brak wpisu oznacza " +"automatyczne wykrywanie. Automatyczne wykrywanie nie działa pod Pythonem w " +"wersji starszej niż 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Kod języka ISO do użycia" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP raportowane do trackera (nie daje efektu, chyba, że jesteś w tej samej " +"sieci lokalnej co tracker)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"zewnętrzny numer portu, jeśli różni się od portu klienta, na którym " +"nasłuchuje lokalnie" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"minimalny port do nasłuchiwania, sprawdza w górę, jeśli jest niedostępny" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "maksymalny port do nasłuchiwania" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP do dołączenia lokalnie" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekundy pomiędzy aktualizowaniem wyświetlanych informacji" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minuty oczekiwania pomiędzy żądaniami o więcej peerów" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "minimalna liczba peerów nie wysyłających ponownych żądań" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "" +"liczba peerów, powyżej której zatrzymane zostanie nawiązywanie nowych " +"połączeń" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maksymalna liczba zezwolonych połączeń, kolejne będą natychmiastowo zamykane" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "wybierz, czy sprawdzać hashe na dysku" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maksymalna prędkość wysyłania w kB/s, 0 oznacza brak limitu" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" +"liczba wysyłań do wypełnienia dodatkowymi optymistycznymi niezapchanymi" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"maksymalna liczba plików otwartych jednocześnie w torrencie wieloplikowym, 0 " +"oznacza brak limitu. Używane do unikania uruchamiania poza deskryptorami " +"plików." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Zainicjuj klienta beztrackerowego. Musi być włączone, aby pobierać torrenty " +"beztrackerowe." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "liczba sekund wstrzymania pomiędzy wysyłaniem poleceń keepalive" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "ilość bajtów do zapytań na żądanie." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"maksymalna długość kodowania przedrostka, którą zgadzasz się przyjąć przez " +"przewód - dłuższe wartości spowodują utratę połączenia." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"sekundy oczekiwania pomiędzy zamykaniem gniazd, na które nic nie otrzymano" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"sekundy oczekiwania pomiędzy sprawdzeniami, czy jakieś połączenie " +"przekroczyło czas oczekiwania" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maksymalny rozmiar części do wysyłania do peerów, połączenie zostanie " +"zerwane, jeśli otrzymasz większe żądanie" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"maksymalna przerwa pomiędzy ocenianiem aktualnej prędkości wysyłania i " +"pobierania" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "maksymalna przerwa pomiędzy ocenianiem aktualnej prędkości seedowania" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"maksymalny czas oczekiwania pomiędzy ponawianiem ogłoszeń, jeśli wciąż są " +"wadliwe" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"sekundy do oczekiwania na dane przychodzące przez połączenie przed " +"założeniem, że jest prawie całkowicie zapchany" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"liczba pobierań, po których trzeba przełączyć od przypadkowego do pierwszego " +"rzadszego" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "ile bajtów zapisywać jednorazowo do buforów sieciowych." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"odrzucaj dalsze połączenia od adresów z zepsutymi lub celowo nieprzyjaznymi " +"peerami, które wysyłają nieprawidłowe dane" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "nie łącz się z kilkoma peerami z tym samym adresem IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"jeśli nie wynosi zero, ustaw opcję TOS do połączeń z peerami na tę wartość" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"włącz obejście błędu w libc BSD, który sprawia, że pliki są bardzo wolno " +"odczytywane." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adres pośrednika HTTP używany do połączeń z trackerem" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "zamykaj połączenia o stanie RST i unikaj stanu TIME_WAIT TCP" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Użyj bibliotek sieciowych Twisted do połączeń sieciowych. 1 oznacza użycie " +"twisted, 0 oznacza, żeby nie używać twisted, -1 oznacza automatyczne " +"wykrywanie, preferuje twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nazwa pliku (dla torrentów jednoplikowych) lub nazwa foldera (dla torrentów " +"wieloplikowych) do zachowania torrenta, zastępując standardową nazwę w " +"torrencie. Zobacz także --save_in, jeśli żaden nie zostanie określony, " +"użytkownik będzie pytany o to, gdzie zachować" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "wyświetl zaawansowany interfejs użytkownika" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"maksymalny czas w minutach przez który seedowany będzie plik po ukończeniu " +"ściagania" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"minimalny stosunek wysyłania/pobierania w procentach do osiągnięcia przed " +"zatrzymaniem seedowania. 0 oznacza brak limitu." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"minimalny stosunek wysyłania/pobierania w procentach do osiągnięcia przed " +"zatrzymaniem seedowania ostatniego torrenta. 0 oznacza brak limitu." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Seeduj każdy zakończony torrent na czas nieokreślony (dopóki użytkownik go " +"nie zakończy)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Seeduj ostatni torrent przez czas nieokreślony (dopóki użytkownik go nie " +"zakończy)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "uruchamiaj downloadera w stanie wstrzymania" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"określ, jak aplikacja powinna zachowywać się, gdy użytkownik ręcznie próbuje " +"uruchomić innego torrenta: \"zastąp\" oznacza, żeby zawsze zastępować " +"uruchomionego torrenta nowym, \"dodaj\" oznacza, żeby zawsze dodawać " +"uruchomionego torrenta równolegle, oraz \"zapytaj\" oznacza, żeby pytać " +"użytkownika za każdym razem." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nazwa pliku (dla torrentów jednoplikowych) lub nazwa foldera (dla torrentów " +"wieloplikowych) do zachowania torrenta, zastępując standardową nazwę w " +"torrencie. Zobacz także --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"maksymalna liczba wysyłań zezwolonych za jednym razem. -1 oznacza (przy " +"dużym szczęściu) rozsądną liczbę na podstawie --max_upload_rate. Wartości " +"automatyczne są sensowne tylko w przypadku uruchamiania jednego torrenta " +"naraz." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"lokalny folder, w którym zostanie zachowana zawartość torrenta. Plik (dla " +"torrentów jednoplikowych) lub folder (dla torrentów wieloplikowych) zostanie " +"utworzony w tym folderze przy użyciu standardowej nazwy określonej w pliku ." +"torrent. Zobacz także --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "czy pytać o miejsce zachowywania pobranych plików" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"lokalny folder, w którym będą zachowywane torrenty, przy użyciu nazw " +"ustalonych przez --saveas_style. Jeśli to zostanie puste, każdy torrent " +"będzie zachowywany w folderze odpowiadającym plikowi .torrent" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "jak często przeskanowywać folder torrenta, w sekundach" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Jak nazywać pobierane torrenty: 1: używaj nazwy pliku torrenta (bez ." +"torrent); 2: używaj nazwy zakodowanej w pliku torrenta; 3: utwórz folder o " +"nazwie pliku torrenta (bez .torrent) i zachowuj w tym folderze używając " +"nazwy zakodowanej w pliku torrenta; 4: jeśli nazwa pliku torrenta (bez ." +"torrent) i nazwa zakodowana w pliku torrenta są identyczne, użyj tej nazwy " +"(styl 1/2), w innym przypadku utwórz przejściowy folder, tak jak w stylu 3; " +"UWAGA: opcje 1 i 2 dają możliwość zastąpienia plików bez ostrzeżenia i mogą " +"sprawiać problemy z bezpieczeństwem." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"czy wyświetlać pełną ścieżkę lub zawartość torrenta dla każdego torrenta" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "folder do wyszukiwania plików .torrent (pół rekursywny)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "czy wyświetlać informacje diagnostyczne na standardowym wyjściu" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "którą moc z dwóch ustawić jako rozmiar fragmentu" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "standardowa nazwa trackera" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"jeśli nie powiedzie się, utwórz torrenta beztrackerowego, zamiast adresu " +"ogłoszenia, użyj pewnego węzła w formie : lub jako pusty ciąg " +"znaków, aby pociągnąć kilka węzłów z tablicy routingu" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "zakończono pobieranie!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "zakończony za %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "pobieranie powiodło się" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB wysył. / %.1f MB pobier.)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB wysył. / %.1f MB pobier.)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d widzianych teraz, plus %d rozprowadzanych kopii (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d rozprowadzanych kopii (dalej: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d widzianych teraz" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "BŁĄD:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "zapisywanie: " + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "rozmiar pliku: " + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "procent zakończono: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "pozostało czasu: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "pobieranie do: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "prędkość pobierania: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "prędkość wysyłania: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "ocena udostępniania: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "stan seedowania: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "stan peera: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Nie można określić zarówno -save_as, jak i --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "zamykanie" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Błąd podczas odczytywania pliku konfiguracyjnego: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Błąd podczas odczytywania pliku .torrent: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "musisz określić plik .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Nie powiodła się inicjacja GUI, nie można kontynuować." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Ten interfejs pobierania wymaga standardowego modułu Pythona \"curses\", " +"który niestety nie jest dostępny w natywnym porcie Pythona dla Windows." +"Jednakże jest dostępny w porcie Pythona na Cygwin uruchamialnym na każdym " +"systemie Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Wciąż możesz używać \"bittorrent-console\" do pobierania." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "plik:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "rozmiar:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "cel:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "postęp:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "stan:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "prędkość pobier.:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "prędkość wysył.:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "udostępnianie:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "seedów:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "peerów:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d widzianych teraz, plus %d rozprowadzanych kopii(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "błąd(błędy):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "błąd:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Wysyłanie Pobieranie Zakończono " +"Prędkość" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "" +"pobieranie %d fragmentów, jest już %d fragmentów, zakończono %d z %d " +"fragmentów" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Podczas wykonywania wystąpiły następujące błędy:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Użycie: %s ADRES_TRACKERA [PLIKTORRENT [PLIKTORRENT... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "stare ogłoszenie dla %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "brak torrentów" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "BŁĄD SYSTEMU - UTWORZONO WYJĄTEK" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Ostrzeżenie: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " nie jest folderem" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"błąd: %s\n" +"uruchom bez argumentów, aby uzyskać wyjaśnienie parametrów" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"WYJĄTEK:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Wciąż możesz używać \"btdownloadheadless.py\" do pobierania." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "łączenie z peerami" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Szacowany czas zakończenia to %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Rozmiar" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Pobieranie" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Wysyłanie" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Razem:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr " (%s) %s - %s peerów %s seedów %s rozpr. kopii - %s pobr. %s wysł." + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "błąd:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"uruchom bez argumentów, aby uzyskać wyjaśnienie parametrów" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" +"opcjonalny, czytelny dla człowieka komentarz do umieszczenia w .torrencie" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "opcjonalny plik docelowy dla torrenta" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - odkoduj %s plików metainfo" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Użycie: %s [PLIKTORRENT [PLIKTORRENT ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "plik metainfo: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "informacje o hashu: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nazwa pliku: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "rozmiar pliku:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "pliki:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nazwa folderu: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "rozmiar archiwum:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "adres ogłoszenia trackera: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "węzły beztrackerowe:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "komentarz:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Nie można utworzyć gniazda kontrolnego: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Nie można wysłać polecenia: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Nie można utworzyć gniazda kontrolnego: jest już używany" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Nie można usunąć starej nazwy pliku gniazda kontrolnego:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Globalny mutex jest już utworzony." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Nie można odnaleźć otwartego portu!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Nie można utworzyć folderu danych aplikacji!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"Nie można zdobyć globalnego muteksa zablokowania dla pliku controlsocket!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" +"Poprzedni przykład BT nie został poprawnie wyczyszczony. Kontynuowanie." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "nieprawidłowy ciąg bencoded" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "nieprawidłowa wartość bencoded (dane po prawidłowym przedrostku)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Użycie: %s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPCJE] [FOLDERTORRENTÓW]\n" +" \n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Jeśli argment nie będący opcją jest aktualny, zostanie przyjęty jako " +"wartość\n" +"opcji torrent_dir.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPCJE][PLIKITORRENTA]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPCJE][PLIKTORRENTA]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPCJA] ADRES_TRACKERA PLIK [PLIK]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argumenty to -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (domyślnie " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "nieznany klucz " + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parametr podaje na końcu pustą wartość" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "interpretowanie wiersza poleceń nie powiodło się w " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Opcja %s jest wymagana." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Musisz dostaczyć przynajmniej %d argumentów." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Za dużo argumentów - maksymalnie %d." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "zły format %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Nie można zapisać opcji na stałe: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "%d sekund po rozpoczęciu ogłoszenie trackera wciąż nie jest kompletne" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" +"Wystąpił problem podczas łączenia się z trackerem - gethostbyname nie " +"powiodło się - " + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Wystąpił problem podczas łączenia się z trackerem - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "błędne dane z trackera - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "odrzucono przez trackera - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Przerwanie torrentów odrzuconych przez trackera, kiedy nie ma połączenia do " +"żadnego peera." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr " Wiadomość od trackera: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "ostrzeżenie od trackera - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Nie można odczytać folderu " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Nie można zacząć" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "usuwanie %s (zostanie dodany ponownie)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**uwaga** %s jest kopią torrenta %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**uwaga** %s posiada błędy" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... powodzenie" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "usuwanie %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "zakończono sprawdzanie" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "zgubiono gniazdo serwera" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Błąd podczas przechwytywania zaakceptowanego połączenia: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "Musiano wyjść z powodu TCP flaking stack out. Zobacz FAQ na %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Za późno, aby przełączyć zaplecza RawServer, %s został już użyty." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "pon" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "wto" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "śro" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "czw" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "pią" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "sob" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "nie" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "sty" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "lut" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "kwi" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "maj" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "cze" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "lip" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "sie" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "wrz" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "paź" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "lis" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "gru" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Skompresowane: %i Nieskompresowane: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Nie można określić nazwy pliku .torrent podczas tworzenia wielu torrentów " +"naraz" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Kodowanie systemu plików \"%s\" nie jest obsługiwane przez tę wersję" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Nie można przekonwertować nazwy pliku/folderu \"%s\" do UTF-8 (%s). Któreś " +"przyjęte kodowanie systemu plików \"%s\" jest złe lub nazwa pliku zawiera " +"niedozwolone znaki." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Nazwa pliku/folderu \"%s\" zawiera zarezerwowane wartości unicodu, które nie " +"odpowiadają znakom." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "błędne dane w pliku odpowiedzi - całkowicie za mały" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "błędne dane w pliku odpowiedzi - całkowicie za duży" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "sprawdzanie istniejącego pliku" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"informacje o --check_hashes 0 lub informacje o szybkim wznowieniu nie " +"zgadzają się ze stanem pliku (brakujące dane)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Błędne informacje o fastresume (plik zawiera więcej danych)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Błędne informacje o fastresume (niedozwolona wartość)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "uszkodzone dane na dysku - może są uruchomione dwie kopie?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Nie można odczytać danych fastresume: " + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"przy uruchomieniu plik podaje, że został zakończony, ale nie powiodło się " +"sprawdzenie hasha fragmentu" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Plik %s należy do innego uruchomionego torrenta" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Plik %s już istnieje, ale nie jest prawidłowym plikiem" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Szybki odczyt - jakieś skrócone pliki?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Nieobsługiwany format pliku fastresume, może pochodzi z innej wersji klienta?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Wydaje się, że inny program przeniósł, zmienił nazwę lub usunął plik." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Wydaje się, że inny program zmodyfikował plik. " + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Wydaje się, że inny program zmienił rozmiar pliku." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Nie można ustawić przechwytywania sygnału: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "opuszczono \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "dodano \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "oczekiwanie na sprawdzenie hasha" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "pobieranie" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Ponowne odczytywanie pliku konfiguracyjnego" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Nie można odczytać %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Nie można pobrać lub otworzyć \n" +"%s\n" +"Spróbuj użyć przeglądarki WWW, aby pobrać ten plik torrent." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Wygląda to na starą wersję Pythona, która nie obsługuje wykrywania kodowania " +"systemu plików. Przyjmowanie 'ASCII'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Pythonowi nie udało się automatycznie wykryć kodowania systemu plików. Użyj " +"'ASCII'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Kodowanie systemu plików '%s' nie jest obsługiwane. Użyj 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Błędna ścieżka pliku składnika: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Ten plik .torrent został utworzony przez zepsute narzędzie i posiada " +"nieprawidłowo zakodowane nazwy plików. Część lub całość nazw plików może " +"różnić się od zamierzonych przez twórcę pliku .torrent." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Ten plik .torrent został utworzony przez zepsute narzędzie i posiada błędne " +"wartości znaków, które nie odpowiadają żadnym prawdziwym znakom. Część lub " +"całość nazw plików może różnić się od zamierzonych przez twórcę pliku ." +"torrent." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Ten plik .torrent został utworzony przez zepsute narzędzie i posiada " +"nieprawidłowo zakodowane nazwy plików. Użyte nazwy wciąż mogą być prawidłowe." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Zestaw znaków używany w lokalnym systemie plików (\"%s\") nie przedstawia " +"wszystkich znaków użytych w nazwie(nazwach) pliku tego torrenta. Nazwy " +"plików zostały zmienione w stosunku do oryginału." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"System plików Windows nie może używać niektórych znaków użytych w nazwie" +"(nazwach) pliku tego torrenta. Nazwy plików zostały zmienione w stosunku do " +"oryginału." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Ten plik .torrent został utworzony przez zepsute narzędzie i posiada co " +"najmniej 1 plik z nieprawidłową nazwą pliku/folderu. Jednakże od kiedy " +"wszystkie takie pliki są oznaczane i mają rozmiar 0 są po prostu ignorowane." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Wymagany jest Python 2.2.1 lub nowszy" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Nie można uruchomić dwóch oddzielnych przykładów tego samego torrenta" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" +"port maksymalny jest mniejszy niż port minimalny - brak portów do sprawdzenia" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Nie można otworzyć portu do nasłuchiwania: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Nie można otworzyć portu do nasłuchiwania: %s. " + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Sprawdź ustawienia zasięgu portu." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Początkowe uruchamianie" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Nie można wczytać danych fastresume: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Przeprowadzi pełne sprawdzanie hasha." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" +"nie powiodło się sprawdzenie hasha fragmentu %d, zostanie ponownie pobrany" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Próba pobrania torrenta beztrackerowego, kiedy klient beztrackerowy jest " +"wyłączony." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "pobieranie nie powiodło się: " + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Błąd wejścia/wyjścia: zabrakło miejsca na dysku lub nie można utworzyć tak " +"dużego pliku:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "zniszczony z powodu błędu wejścia/wyjścia: " + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "zniszczony z powodu błędu systemu operacyjnego: " + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "zniszczony z powodu wyjątku wewnętrznego: " + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Dodatkowy błąd podczas zamykania z powodu błędu: " + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Nie można usunąć pliku fasresume po porażce:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "seedowanie" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Nie można zapisać danych fastresume: " + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "zamknij" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "błędne metainfo - nie jest słownikiem" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "błędne metainfo - błędny klucz fragmentów" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "błędne metainfo - niedozwolony rozmiar fragmentu" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "błędne metainfo - błędna nazwa" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "nazwa %s jest niedozwolona z przyczyn bezpieczeństwa" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "miks pliku pojedynczego/wielokrotnego" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "błędne metainfo - błędny rozmiar" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "błędne metainfo - \"files\" nie jest listą plików" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "błędne metainfo - błędna wartość pliku" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "błędne metainfo - błędna ścieżka" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "błędne metainfo - błędna ścieżka do folderu" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "ścieżka %s jest niedozwolona z przyczyn bezpieczeństwa" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "błędne metainfo - ścieżka powtarza się" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"błędne metainfo - nazwa została użyta zarówno jako nazwa pliku, jak i " +"podfolderu" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "błędne metainfo - błędny typ obiektu" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "błędne metainfo - brak ciąg znaków z adresem ogłoszenia" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "nietekstowa przyczyna niepowodzenia" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "nietekstowa wiadomość z ostrzeżeniem" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "nieprawidłowy wpis na liście1 peerów" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "nieprawidłowy wpis na liście2 peerów" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "nieprawidłowy wpis na liście3 peerów" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "nieprawidłowy wpis na liście4 peerów" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "nieprawidłowa lista peerów" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "nieprawidłowa przerwa ogłoszenia" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "nieprawidłowa minimalna przerwa ogłoszenia" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "nieprawidłowy id trackera" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "nieprawidłowe obliczenie peera" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "nieprawidłowe obliczenie seeda" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "nieprawidłowy \"ostatni\" wpis" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Port do nasłuchiwania." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "plik do przechowywania informacji o ostatnich pobieraniach" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "przekroczono czas oczekiwania na zamknięcie połączeń" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "sekundy pomiędzy zapisaniem pliku pobierania" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "sekundy pomiędzy wygaśnięciem pobierań" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" +"ile sekund pobierania powinny oczekiwać pomiędzy ponownymi ogłoszeniami" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"domyślna liczba peerów do wysyłania w informacji, jeśli klient nie określa " +"liczby" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"czas oczekiwania pomiędzy sprawdzeniami, czy jakieś połączenie nie " +"przekroczyło czasu oczekiwania" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"jak często sprawdzać, czy pobierający jest za NAT-em (0 = nie sprawdzaj)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "czy dodawać wpisy o wynikach sprawdzania NAT-a do dziennika" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "minimalny czas jaki musiał być od ostatniego flusha do następnego" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"minimalny czas w sekundach zanim chache jest uważane za nieświeże i jest " +"flushowane" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"pozwól tylko pobieranym .torrentom w tym folderze (i rekursywnie w " +"podfolderach folderów, w których nie ma .torrentów). Jeśli zostanie " +"ustawione, torrenty w folderze będą wyświetlać stronę z informacjami/" +"problemami, w zależności od tego czy mają peery, czy nie." + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"pozwól specjalnym kluczom w torrentach w allowed_dir wpływać na dostęp do " +"trackera" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "czy ponownie otwierać dziennik po otrzymaniu sygnału HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"czy wyświetlać stronę z informacjami, kiedy folder root trackera jest " +"wczytany" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "adres przekierowania strony z informacjami na" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "czy wyświetlać nazwy z zezwolonego folderu" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"plik zawierający dane x-icon do zwrócenia, gdy przeglądarka żąda favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignoruj parametr IP GET z maszyn, które nie są na lokalnych sieciowych IP (0 " +"= nigdy, 1 = zawsze, 2 = ignoruj, jeśli sprawdzanie NAT jest wyłączone). " +"Nagłówki pośrednika HTTP podające adres oryginalnego klienta są traktowane " +"tak, jak --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"plik do zapisywania dziennika trackera, użyj - do standardowego wyjścia " +"(domyślnie)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"użyj z allowed_dir; dodaje adres /file?hash={hash}, który zezwala " +"użytkownikom na pobieranie pliku torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"przetrzymuj martwe torrenty, po ich wygaśnięciu (więc wciąż są wyświetlane " +"na /scrape i stronie WWW). Ma znaczenie tylko w przypadku, gdy allowed_dir " +"nie jest ustawione" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "zezwolony problemowy dostęp (może być żaden, określony lub pełny)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "maksymalna liczba peerów do dostarczania bez żadnego żądania" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"plik może istnieć gdziekolwiek we wszechświecie\n" +"ale niestety nie tutaj\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**ostrzeżenie** określony plik favicon -- %s -- nie istnieje." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**ostrzeżenie** plik stanu %s jest uszkodzony; ponowne uruchamianie" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Dziennik rozpoczęty: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**ostrzeżenie** nie można było przekierować standardowego wyjścia do pliku " +"dziennika: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Dziennik ponownie otwarty: " + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**ostrzeżenie** nie można było otworzyć ponownie dziennika" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "określona funkcja problemu jest niedostępna w tym trackerze." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "pełna funkcja problemu jest niedostępna w tym trackerze." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "zdobądź funkcję niedostępną w tym trackerze." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Żądane pobranie nie jest autoryzowane do użycia z tym trackerem." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "uruchom bez argumentów, aby uzyskać wyjaśnienie parametrów" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Zamykanie: " diff --git a/locale/pt/LC_MESSAGES/bittorrent.mo b/locale/pt/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..3a9540148f6e47c7b2ba6afc65b45a9f2d4c75be GIT binary patch literal 61741 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 literal 0 HcmV?d00001 diff --git a/locale/pt/LC_MESSAGES/bittorrent.po b/locale/pt/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..484aecc --- /dev/null +++ b/locale/pt/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2880 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-10 04:43-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: Portugese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Instale o Python 2.3 ou mais recente" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Necessita de PyGTK 2.4 ou mais recente" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Introduza o URL do Torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Introduza o URL de um Ficheiro Torrent para abrir:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "ligação telefónica analógica" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/Cabo com 128k de envio" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/Cabo com 256k de envio" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL com 768k de envio" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Taxa máxima de upload:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Parar temporariamente todos os torrents em execução" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Retomar o download" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Em pausa" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Sem torrents" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "A funcionar normalmente" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Atrás de Firewall/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nova %s versão disponível" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Está disponível uma versão mais recente de %s.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Está a utilizar %s, e a nova versão é %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Pode obter a versão mais recente em\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Transferir_depois" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Transferir_agora" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Lembre-me depois" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Sobre %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versão %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Não foi possível abrir %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Faça a sua doação" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Registo de Actividade" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Guardar registo em:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "registo guardado" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "registo limpo" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Configurações" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "A guardar" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Guardar os novos downloads em:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Modificar..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Perguntar onde guardar cada novo download" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "A transferir" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "A iniciar torrents adicionais manualmente:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Pára sempre o_último torrent em execução" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Inicia sempre o torrent em _paralelo" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Perguntar sempre" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "A semear" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Semear torrents finalizados: até a taxa atingir [_] por cento, ou durante " +"[_] minutos, o que suceder primeiro." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Semear indefinidamente" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "Semear o último torrent finalizado: até a taxa atingir [_] por cento." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Rede" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Procurar uma porta disponível:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "a iniciar na porta: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP para relatar ao tracker:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Sem efeito, a menos que esteja na\n" +"mesma rede local que o tracker)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Texto da barra de progresso é sempre a negro\n" +"(é preciso reiniciar)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Diversos" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ATENÇÃO: Alterar estas configurações pode\n" +"impedir %s de funcionar correctamente." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opção" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valor" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avançado" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Escolher a directoria padrão para os downloads" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Ficheiros em \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Aplicar" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Alocar" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nunca transferir" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Diminuir" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Aumentar" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nome de ficheiro" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Comprimento" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Utilizadores para \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Endereço IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Cliente" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Ligação" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s de download" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s de upload" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB recebidos" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB enviados" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% completo" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s est. de transferência do utilizador" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID do utilizador" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interessado" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Engasgado" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Ignorado" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Envio optimista" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "remoto" + +#: bittorrent.py:1358 +msgid "local" +msgstr "local" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "utilizador impróprio" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d estragado" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "banido" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informações sobre \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nome do torrent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent sem tracker)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URL de anúncio:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", num ficheiro" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", em %d ficheiros" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Tamanho total:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Partes:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Hash da informação:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Guardar em:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nome do ficheiro:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Abrir directoria" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Mostrar lista de ficheiros" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "arraste para reordenar" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "clique no botão direito do rato para aceder ao menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informações do torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Remover torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Cancelar torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", vai semear por %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", vai semear indefinidamente." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Concluído, proporção de partilha: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Concluído, %s enviados" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Concluído" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Informação do torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Abrir directoria" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Lista de _ficheiros" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Lista de _utilizadores" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Modificar localização" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Semear indefinidamente" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Re_iniciar" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Terminar" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Remover" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Cancelar" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Tem a certeza que deseja remover \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "A sua proporção de partilha para este torrent é %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Enviou %s para este torrent." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Remover este torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Concluído" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "arraste para a lista para semear" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Falhou" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "arraste para a lista para continuar" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Em espera" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Em execução" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Upload actual: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Download actual: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Upload anterior: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Download anterior: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Proporção partilha: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s utilizadores, %s sementes. Totais do tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Cópias distribuídas: %d; Próxima: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Pedaços: %d total, %d completo, %d parcial, %d activo (%d vazio)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d pedaços estragados + %s em solicitações rejeitadas" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% concluído, %s restantes" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Taxa de download" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Taxa de upload" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "ND" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s iniciado" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Abrir ficheiro de torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Abrir _URL de torrent" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Criar _novo torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pausa/Leitura" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Sair" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Mostrar/Ocultar torrents _concluídos" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "Redimensionar _janela para encaixar" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Registo" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Configurações" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Ajuda" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Sobre" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Doar" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Ficheiro" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Ver" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Procurar torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(parado)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(múltiplo)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Já está a transferir o instalador de %s" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Instalar o novo %s agora?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Deseja sair do %s e instalar a nova versão, %s, agora?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Ajuda para %s está em \n" +"%s\n" +"Deseja ir para lá agora?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Visitar a página web de ajuda?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Há um torrent concluído na lista. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Deseja removê-lo?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Há %d torrents concluídos na lista. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Deseja removê-los todos?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Remover todos os torrents concluídos?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Nenhum torrent concluído" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Não há torrents concluídos para remover." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Abrir torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Mudar local de destino para " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "O ficheiro existe!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" já existe. Deseja escolher um nome diferente de ficheiro?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Local de destino para " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "A directoria existe!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" já existe. Deseja criar uma directoria idêntica duplicando a " +"directoria dentro da directoria já existente?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(mensagem global) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Erro" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Ocorreram erros múltiplos. Clique em OK para ver o registo de erro." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Parar o torrent em execução?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Você está prestes a iniciar \"%s\". Deseja parar o último torrent em " +"execução?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Você fez sua doação?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bem-vindo à nova versão do %s. Você fez sua doação?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Obrigado!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Obrigado por fazer uma doação! Para doar novamente, selecione \"Doar\" no " +"menu de \"Ajuda\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "ultrapassado, não use" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Falha ao criar ou enviar comando através do socket de controle existente." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Fechando todas as %s janelas deve corrigir o problema" + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s já em execução" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Falha ao enviar o comando através do socket de controle existente." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Não foi possível iniciar o TorrentQueue, veja os erros acima." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s criador de ficheiro torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Criar ficheiro torrent para este ficheiro/directoria:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Escolher..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(As directorias tornar-se-ão torrents em lote)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Tamanho do pedaço:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Usar _rastreador:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Usar _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Nós (opcional):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Comentários:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Fazer" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Porta" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "A construir torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "A verificar os tamanhos de ficheiro..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Iniciar a semeadura" + +#: maketorrent.py:540 +msgid "building " +msgstr "a construir" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Concluído." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Concluída a construção de torrents." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Erro!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Erro ao construir torrents: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dias" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dia e %d horas" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d horas" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutos" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d segundos" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 segundos" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Ajuda" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Perguntas mais Frequentes:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Ir" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Escolha uma pasta existente..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Todos os ficheiros" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Criar uma nova pasta..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Seleccione um ficheiro" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Seleccione uma pasta" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Impossível carregar estado guardado: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Impossível guardar o estado da IU: " + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Conteúdo do ficheiro de estado inválido" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Erro a ler o ficheiro" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "impossível restaurar o estado completamente" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "ficheiro de estado inválido (entrada duplicada)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Dados corrompidos em " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , impossível restaurar torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Ficheiro de estado inválido (entrada errada)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Ficheiro de estado da IU errado" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Versão do ficheiro de estado da IU errada" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versão do ficheiro de estado da IU não suportada (de uma versão mais nova?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Não pode apagar o %s ficheiro que se encontra na cache:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Este não é um ficheiro torrent válido. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Este torrent (ou um com o mesmo conteúdo) já está em execução." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Este torrent (ou um com o mesmo conteúdo) já está em espera para ser " +"executado." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent em estado desconhecido %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Impossível escrever ficheiro" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrent não reiniciará corretamente quando o cliente reiniciar" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Impossível executar mais que %d torrents simultaneamente. Para obter mais " +"informações, consulte o FAQ em %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"O torrent não é iniciado porque há outros torrents à espera de serem " +"executados, e este já cumpre as configurações sobre quando parar de semear." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"O torrent não é iniciado porque já cumpre as configurações sobre quando " +"parar de semear o último torrent concluído." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Não foi possível obter a última versão de %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Não foi possível analisar a nova versão da string de %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Não foi possível encontrar um local temporário adequado para guardar o " +"instalador %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Nenhum ficheiro torrent disponível para o instalador %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "O instalador %s %s parece estar corrompido ou em falta." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Não foi possível iniciar o instalador neste Sistema Operativo" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"directoria sob a qual dados de variáveis tais como a informação de retoma " +"rápida e o estado da IGU são guardados. Padrão na subdirectoria 'dados' da " +"directoria de configuração do bittorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codificação de caracteres usada no sistema de ficheiros local. Se for " +"deixado em branco será autodetectado. A detecção automática não funciona nas " +"versões do python anteriores à 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Código da língua ISO a utilizar" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"endereço IP para relatar ao rastreador (só tem efeito se estiver na mesma " +"rede local que o rastreador)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"número da porta vísivel externamente se for diferente do que o cliente na " +"escuta local" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "porta mínima de escuta, aumentando se indisponível" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "porta máxima de escuta" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "endereço IP para ligar localmente" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "segundos entre as actualizações da informação exibida" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minutos de espera entre pedidos de mais utilizadores" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "número mínimo de utilizadores para não fazer re-solicitações" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "número de utilizadores em que interromper o início de novas ligações" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"número máximo de ligações permitidas, depois disto as novas ligações de " +"entrada serão imediatamente fechadas" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "se deve verificar se há hashes no disco" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "máximo de kB/s para o upload, 0 significa que não há limite" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "o número de uploads a preencher com desengasgos extras optimistas" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"o número máximo de ficheiros num torrent com múltiplos ficheiros a " +"permanecerem abertos simultaneamente, 0 significa que não há limite. Usado " +"para evitar ficar sem descritores de ficheiro." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicializar o cliente trackerless. Isto deve ser permitido para efectuar o " +"download de torrents sem uso de trackers." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "número de segundos de pausa entre envio de keepalives" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "quantos bytes pedir por solicitação." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"comprimento máximo do prefixo de codificação aceitável na linha - valores " +"maiores fazem a ligação cair." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "segundos a esperar entre o fecho de sockets que não receberam nada" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"segundos a esperar entre verificação se ocorreu o final do tempo limite de " +"quaisquer ligações" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"comprimento máximo de fatia a enviar para utilizadores, fechar a ligação se " +"for recebida uma solicitação superior" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"tempo de intervalo máximo para calcular as actuais taxas de upload e download" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"tempo de intervalo máximo para calcular as actuais taxas dos semeadores" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"tempo máximo de espera entre tentativas de anúncio se elas continuarem a " +"falhar" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"segundos a esperar pela entrada de dados numa ligação antes de presumir que " +"ela está semi-permanentemente engasgada" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"número de downloads aos quais mudar de aleatório para mais raro primeiro" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "quantos bytes deverm ser escritos nos buffers de rede de uma só vez." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"recusar ligações adicionais de endereços com utilizadores partidos ou " +"intencionalmente hostis que enviam dados incorretos" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "não ligar a vários utilizadores com o mesmo endereço IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"se não for zero, ajuste a opção TOS para ligações de utilizador para este " +"valor" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"habilitar contornos da falha na libc do BSD que torna as leituras de " +"ficheiros muito lentas." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "endereço do proxy HTTP para utilizar em ligações de rastreador" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "fechar ligações com RST e evitar o estado TIME_WAIT do TCP" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Usar bibliotecas de rede Twisted para ligações de rede. 1 significa usar " +"twisted, 0 significa não usar twisted, -1 significa autedetectar e preferir " +"twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nome do ficheiro (para torrents de único arquivo) ou nome da directoria " +"(para torrents em lote) para guardar o torrent, sobrescrevendo o nome padrão " +"no torrent. Veja também --guardar_em; se nenhum for especificado, o " +"utilizador será questionado sobre o local de destino" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "exibir interface do utilizador avançada" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"o número máximo de minutos para semear um torrent completo antes de parar a " +"semeadura" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"a razão mínima entre upload/download, em percentagem, a ser alcançada antes " +"de parar de semear. 0 significa sem limite." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"a razão mínima entre upload/download, em percentagem, a ser alcançada antes " +"de parar de semear o último torrent. 0 significa sem limite." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Semeia cada torrent completado indefinidamente (até o utilizador o cancelar)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Semeia o último torrent indefinidamente (até o utilizador o cancelar)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "inicar baixador em estado de pausa" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"especifica o modo como o aplicativo se deve comportar quando o utilizador " +"tenta iniciar manualmente outro torrent: \"substituir\" significa sempre " +"substituir o torrent em execução com o novo, \"adicionar\" significa sempre " +"adicionar ao torrent em execução em paralelo, e \"perguntar\" significa " +"perguntar sempre ao utilizador." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nome do ficheiro (para torrents de ficheiro único) ou nome da directoria " +"(para torrents em lote) para guardar o torrent, sobrescrevendo o nome padrão " +"no torrent. Veja também --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"número máximo de uploads permitidos simultaneamente. -1 significa (acredita-" +"se) um número razoável baseado em -- taxa_máxima_upload. Os valores " +"automáticos só são coerentes quando estiver a executar um torrent de cada " +"vez." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"directoria local onde o conteúdo do torrent será guardado. O ficheiro " +"(torrents de ficheiro único) ou directoria (torrents em lote) serão criados " +"dentro dessa directoria usando o nome padrão especificado no ficheiro ." +"torrent. Veja também --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "Se perguntar ou não por um local onde salvar os ficheiros transferidos" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"directoria local onde os torrents serão guardados, usando um nome " +"determinado por --saveas_style. Se isto ficar em branco, cada torrent será " +"guardado na directoria do ficheiro .torrent correspondente" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "frequência das buscas na directoria do torrent, em segundos" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Como nomear downloads de torrent: 1: use o nome DO ficheiro torrent (menos " +"o .torrent); 2: use o nome codificado NO ficheiro torrent; 3: crie uma " +"directoria com o nome DO ficheiro torrent (menos o .torrent) e guarde " +"naquele diretório usando o nome codificado NO ficheiro torrent; 4: se o nome " +"DO ficheiro torrent (menos o .torrent) e o nome codificado NO ficheiro " +"torrent são idênticos, use aquele nome (estilo 1/2), ou crie uma directoria " +"intermediário como no estilo 3; CUIDADO: as opções 1 e 2 têm a capacidade de " +"sobrescrever ficheiros sem advertir e podem constituir problemas de " +"segurança." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"se deve mostrar o caminho completo do conteúdo do torrent para cada torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "directoria de busca por ficheiros .torrent (semi-recursivo)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "se deve mostrar informações de diagnóstico em stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "que potência de dois deve ser configurada como tamanho do pedaço" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nome padrão do rastreador" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"se for falso gerar um torrent sem rastreador, ao invés de URL de anúncio, " +"use um nó confiável na forma : ou uma string vazia para " +"puxar alguns nós de sua tabela de encaminhamento" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "download completo!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "terminando em %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "download bem-sucedido" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB up / %.1f MB down)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB up / %.1f MB down)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d visto agora, mais %d cópias distribuídas (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d cópias distribuídas (próxima: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d visto agora" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ERRO:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "a guardar:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "tamanho do ficheiro: " + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "percentagem concluída: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tempo restante: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "transferir para: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "taxa de download: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "taxa de upload: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "percentagem de partilha: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "estado das sementes: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "estado do utilizador: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Impossível especificar --save_as and --save_in simultanemente" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "a desligar" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Erro ao ler a configuração: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Erro a ler o ficheiro .torrent: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "você deve especificar um ficheiro. torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Inicialização da IGU no modo texto falhou; impossível continuar." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Essa interface de download requer o módulo padrão do Python \"curses\", que " +"infelizmente está indisponível para a versão nativa em Windows do Python. " +"Contudo está disponível para a versão Cygwin do Python, que é executada em " +"todos os sistemas Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Pode ainda pode usar o \"bittorrent-console\" para baixar." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "ficheiro:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "tamanho:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "dest:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progresso:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "estado:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "vel downl:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "vel upl:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "compartilhamento:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "sementes:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "pontos:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d visto agora, mais %d cópias distribuídas(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "erro(s):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "erro:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Upload Download Completo Velocidade" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "baixando %d pedaços, tem %d fragmentos, %d de %d pedaços completos" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Ocorreram estes erros durante a execução:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s URL_RASTREADOR [ARQUIVOTORRENT [ARQUIVOTORRENT ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "anúncio antigo para %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "sem torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERRO DE SISTEMA - EXCEÇÃO GERADA" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Atenção: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " não é um diretório" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"erro: %s\n" +"rode sem argumentos para explicações sobre parâmetros" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEÇÃO:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Você ainda pode usar \"btdownloadheadless.py\" para baixar." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "conectando aos pontos" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tpo Estimado em %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Tamanho" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Download" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Upload" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totais:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s pontos %s semeadores %s copias - %s download %s upload" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "erro: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"rode sem argumentos para explicações sobre parâmetros" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "comentário legível opcional para pôr no .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "arquivo alvo opcional para o torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodificar %s arquivos metainfo" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s [ARQUIVOTORRENT [ARQUIVOTORRENT ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "arq metainfo: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "hash de inform: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nome arq: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "tam arq:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "ficheiros: " + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nome diretório: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "tam arquivo:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "url do anúncio do rastreador: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "nós sem tracker:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "comentário:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Impossível criar socket de controle: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Impossível enviar comando: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Impossível criar socket de controle: já em uso" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Impossível remover nome de arquivo do socket de controle antigo:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "O mutex global já foi criado." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Não foi possível encontrar uma porta livre!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Não foi possível criar o directório de dados da aplicação." + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"Não foi possível efectivar o bloqueamento do mutex global para o " +"controlsocket do ficheiro!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "Uma execução anterior do BT não foi adequadamente limpa. A continuar." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "não é uma string codificada válida" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "valor codificado inválido (dados após prefixo válido)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Uso: %s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPÇÕES] [DIRETÓRIODOTORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Se um argumento que não é opção estiver presente será \n" +"tomado como o valor da opção torrent_dir.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPÇÕES] [ARQUIVOSTORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPÇÕES] [ARQUIVOTORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPÇÃO] URL_RASTREADOR ARQUIVO [ARQUIVO]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "os argumentos são -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (padrão de " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "chave desconhecida " + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parâmetro passado ao final sem valor" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "interpretação da linha de comando falhou em " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Opção %s é obrigatória." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Tem de fornecer pelo menos %d comandos." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Demasiados comandos - %d no máximo." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "formato errado de %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Impossível salvar permanentemente as opções: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Anúncio do rastreador incompleto %d segundos após seu início" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problema ao conectar ao rastreador, GetHostByName falhou - " + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problema ao conectar ao rastreador - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "dados errados do rastreador - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "rejeitado pelo rastreador - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Cancelando o torrent, por ter sido rejeitado pelo rastreador enquanto não " +"conectado a pontos." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr " Mensagem do rastreador: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "aviso do rastreador - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Impossível ler diretório " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Impossível ver status de " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "removendo %s (re-adicionará)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**atenção** %s é um torrent duplicado de %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**atenção** %s tem erros" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... com sucesso" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "removendo %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "verificação concluída" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "socket do servidor perdido" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Error lidando com conexão aceita: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Foi preciso sair devido ao desmoronamento da pilha TCP. Favor ver o FAQ em %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Muito tarde para mudar o backend RawServer, %s já foram usados." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Seg" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Ter" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Qua" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Qui" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Sex" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sáb" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Dom" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Fev" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Abr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Ago" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Set" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Out" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dez" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Compactado: %i Descompactado: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Você não pode especificar o nome do arquivo .torrent quando estiver gerando " +"torrents múltiplos de uma vez" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" +"A codifificação de seistema de arquivos \"%s\" não é suportada por esta " +"versão" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Impossível converter nome de arquivo/diretório \"%s\" para utf-8 (%s). Ou a " +"codificação de sistema de arquivos assumida \"%s\" está errada ou contém " +"bytes ilegais" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"O nome de arquivo/diretório \"%s\" contém vlores unicode reservados que não " +"correspondem a caracteres." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "dados errados no arquivo de restposta - total pequeno demais" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "dados errados no arquivo de restposta - total grande demais" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "verificando arquivo existente" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 ou informações de retomada rápida não bate com arquivo de " +"estado (dados faltando)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Informações de retomada rápida erradas (arquivos contêm mais dados)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Informações de retomada rápida erradas (valor ilegal)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" +"dados corrompidos no disco - talvez você tenha duas cópias em execução?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Impossível ler dados de retomada rápida: " + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"dito arquivo completo na inicialização, mas o pedaço falhou na verificação " +"de hash" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "O arquivo %s pertence a outro torrent em execução" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "O arquivo %s já existe, mas não é um arquivo normal" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Leitura curta - algo truncou os arquivos?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formato de arquivo de retomada rápida não suportado, talvez de outra versão " +"de cliente?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Outro programa moveu, renomeou ou apagou o arquivo." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Outro programa modificou o arquivo." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Outro programa modificou o tamanho do arquivo." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Impossível mandar manuseador de sinal: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "descartado \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "adicionado \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "agruardando por verificação de hash" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "baixando" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Relendo arquivo de configuração" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Impossível ver status de %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Não é possível descarregar ou abrir \n" +"%s\n" +"Tente utilizar um navegador web para descarregar o ficheiro torrent." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Parece haver uma versão antiga do Python que não suporta detecção da " +"codificação de sistema de arquivos. Assumindo 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python falhou ao ao autodetectar a codificação de sistema de arquivos. Uando " +"então 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Codificação de sistema de arquivos '%s' não é suportada. Usando então " +"'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componente do caminho de arquivo errado: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"nomes de arquivos codificados incorretamente. Alguns ou todos os nomes de " +"arquivos podem aparecer diferentes daquilo que o criador do arquivo .torrent " +"quis." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"valores errados de caracteres que não correspondem a nenhum caracter real. " +"Alguns ou todos os nomes de arquivos podem aparecer diferentes daquilo que o " +"criador do arquivo .torrent quis." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"nomes de arquivos codificados incorretamente. Os nomes usados podem ainda " +"estar corretos." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"O conjunto de caracteres usado no sistema de arquivos local (\"%s\") pode " +"não representar todos os caracteres usados no(s) nome(s) de arquivo(s) deste " +"torrent. Os nomes de arquivos foram modificados do original." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"O sistema de arquivos do Windows não consegue lidar com todos os caracteres " +"usados no(s) nome(s) de arquivo(s) deste torrent. Os nomes de arquivos foram " +"modificados do original." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui pelo " +"menos 1 nome de arquivo ou de diretório inválido. Contudo, como todos os " +"arquivos nessa situação foram marcados como tendo comprimento 0, serão " +"ignorados." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Requer Python 2.2.1 ou mais novo" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Impossível iniciar duas instâncias distintas do mesmo torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "porta máxima menor que porta mínima - sem portas para verificar" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Impossível abrir uma porta de escuta: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Impossível abrir uma porta de escuta: %s. " + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Verifique suas configurações de faixa de portas." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Inicialização" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Não foi possível obter dados do reínicio rápido: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Fará verificação de hash completa." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "falhou a verificação de hash do pedaço %d, baixando-o novamente" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Tente baixar um torrent sem rastreador com um cliente sem rastreador " +"desligado." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "download falhou: " + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Erro de E/S: Espaço insuficiente no disco, ou impossível criar arquivo tão " +"grande:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "morto por erro de E/S: " + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "morto por erro no SO: " + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "morto por exceção interna: " + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Erro adicional quando fechendo devido a erro: " + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Impossível remover arquivo de retomada rápida após a falha:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "semeando" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Impossível escrever dados de retomada rápida: " + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "desligar" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo errada - não é dicionário" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo errada - chave de pedaços errada" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo errada - comprimento ilegal de pedaço" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo errada - nome errado" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "nome %s proibido por questões de segurança" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "confusão de arquivo simples/múltiplo" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo errada - comprimento errado" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo errada - \"arquivos\" não é uma lista de arquivos" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo errada - valor de arquivo errado" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo errada - caminho errado" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo errada - caminho de diretório errado" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "caminho %s proibido por questões de segurança" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo errada - caminho duplicado" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo errada - nome usado ao mesmo tempo para arquivo e subdiretório" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "metainfo errada - tipo de objeto errado" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo errada - sem string da URL de anúncio" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "motivo de falha não-textual" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "mensagem de aviso não-textual" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "entrada inválida na lista de pontos 1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "entrada inválida na lista de pontos 2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "entrada inválida na lista de pontos 3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "entrada inválida na lista de pontos 4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "lista de pontos inválida" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "intervalo de anúncio inválido" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "intervalo mínimo de anúncio inválido" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "id do rastreador inválido" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "número de ponto inválido" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "número de semente inválido" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"Última\" entrada inválida" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Porta de escuta." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "arquivo para armazenar inrformação de baixador recente" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tempo limite para fechar conexões" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "segundos entre salvamento de dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "segundos entre expiração de quem baixa" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "segundos que quem baixa deve esperar entre reanúncios" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"número pré-definido de clientes para enviar uma mensagem informativa caso o " +"cliente não especifique um número" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"tempo de espera entre verificação se qualquer das conexões exprirou o tempo" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"número de vezes a verificar de quem baixa está atrás de um NAT ( 0 = não " +"verificar)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "se adicionar entradas ao log para verificação de NAT" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "tempo mínimo decorrido desde a última descarga para outra" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"tempo mínimo em segundos antes de um cache ser considerado estagnado e " +"jogado fora" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"só permitir downlods de .torrents neste diretório (e recursivamente em " +"subdiretórios de diretórios que não possuam arquivos .torrent). Se marcado, " +"os torrents neste diretório aparecerão numa página de informações, " +"independente de terem pontos ou não" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permite que chaves especiais em torrents em allowed_dir afetem o acesso ao " +"rastreador" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "Se reabre o arquivo de log no recebimento de um sinal HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"se mostra uma página de informação quando o diretório raiz do rastreador é " +"carregado" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "uma URL para redirecionar a página de informação" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "se mostra nomes do diretório permitido" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"Arquivo contendo dados x-icon a serem retornados quando o browser solicitar " +"favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorar o parâmetro IP GET de máquinas que não estão nos IPs da rede local " +"(0 = nunca, 1 = sempre, 2 = ignorar se verificação de NAT desabilitada). " +"Cabeçalhos de proxy HTTP dando endereço do cliente original serão tratados " +"da mesma forma que --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"arquivo para escrever os logs de rastreador, use - para stdout (padrão)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"use com allowed_dir; adiciona uma URL /arquivo?hash={hash} que permite aos " +"usuários baixar o arquivo torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"manter torrents mortos depois de expirar (para que eles ainda apareçam em " +"seu /scrape e página da web). Só importa se allowed_dir não está marcado" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "acesso a scrape permitido (pode ser nenhum, específico ou total)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "número máximo de pontos para dar com qualquer solicitação" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"seu arquivo pode existir em qualquer lugar no universo,\n" +"mas não aqui\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**atenção** arquivo especificado como favicon -- %s -- não existe." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**atenção** arquivo de estado %s corrompido; reiniciando" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Log Iniciado: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**atenção** impossível redirecionar stdout para o arquivo de log: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Log reaberto: " + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**atenção** impossível reabrir o arquivo de log" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "função específica de scrape indisponível com este rastreador." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "função scrape total indisponível com este rastreador." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "função de conseguir indisponível com este rastreador." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Download solicitado não está autorizado para uso com este rastreador." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "rode sem argumentos para explicações sobre parâmetros" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Desligando: " diff --git a/locale/pt_BR/LC_MESSAGES/bittorrent.mo b/locale/pt_BR/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..84800c620a75d165a39ee5eefeb77409dea1df7e GIT binary patch literal 61188 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\n" +"Language-Team: Portugese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Instale o Python 2.3 ou mais recente" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Requer PyGTK 2.4 ou mais recente" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Digite a URL do torrent" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Digite a URL para abrir um arquivo torrent:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "discada" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cabo com 128k de envio" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cabo com 256k de envio" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL com 768k de envio" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Taxa máxima de upload:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Pare todos os torrents em execução temporariamente" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Retomar download" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pausado" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Nenhum torrent" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Rodando normalmente" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Protegido por Firewall/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nova versão %s disponível" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Uma nova versão de %s está disponível.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Você está usando %s, e a nova versão é %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Você sempre pode obter a última versão em \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Baixar _depois" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Baixar _agora" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Lembre-me depois" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Sobre %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versão %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Impossível abrir %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Faça sua doação" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Log de Atividade" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Salvar log em:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "log salvo" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "log apagado" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Configurações %s " + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Salvando" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Salvar downloads novos em:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Modificar..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Perguntar onde salvar cada novo download" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Baixando" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Iniciando torrents adicionais manualmente:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Sempre parar o _último torrent em execução" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Sempre iniciar o torrent em _paralelo" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Perguntar a cada vez" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Semeando" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Semear torrents completados: até que a proporção de compartilhamento chegue " +"a [_] por cento, ou por [_] minutos, o que vier primeiro." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Semear indefinidamente" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Semear o último torrent completado: até que a proporção de compartilhamento " +"alcance [_] por cento." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Rede" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Procurar porta disponível:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "iniciando na porta: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP para informar ao rastreador:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Sem efeito, a menos que esteja na\n" +"mesma rede local que o rastreador)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Texto da barra de progresso sempre em preto\n" +"(necessita reiniciar)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Miscelâneas" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ATENÇÃO: Alterar estas configurações pode\n" +"impedir que %s funcione corretamente." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opção" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valor" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avançado" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Escolha a pasta padrão para download" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Arquivos em \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Aplicar" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Alocar" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nunca baixar" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Diminuir" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Aumentar" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nome de arquivo" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Tamanho" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Pontos para \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Endereço de IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Cliente" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Conexão" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s recebimento" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s envio" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB baixados" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB enviados" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% completo" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s est. download do ponto" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID do ponto" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interessado" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Engasgado" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Ignorado" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Upload otimista" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "remoto" + +#: bittorrent.py:1358 +msgid "local" +msgstr "local" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "ponto inválido" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d inválido" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "banido" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informações sobre \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nome do Torrent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent sem rastreador)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URL de anúncio:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", em um arquivo" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", em %d arquivos" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Tamanho total:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Pedaços:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Hash de informação:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Salvar em:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nome do arquivo:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Abrir pasta" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Mostrar lista de arquivos" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "arraste para reordenar" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "botão direito para abrir menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informações do torrent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Remover torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Cancelar torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", vai semear por %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", vai semear indefinidamente." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Concluído, proporção de compartilhamento: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Concluído, %s enviado" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Concluído" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Informação do torrent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Abrir diretório" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Lista de _arquivos" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Lista de pontos" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Mudar localização" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Semear indefinidamente" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Rei_niciar" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Terminar" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Remover" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Cancelar" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Tem certeza de que quer remover \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Sua proporção de compartilhamento para este torrent é %d%%. " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Você enviou %s para este torrent. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Remover este torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Concluído" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "arraste para a lista para semear" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Falhou" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "arraste para a lista para continuar" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Aguardando" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Ativo" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Envio atual: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Recebimento atual: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Envio anterior: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Recebimento anterior: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Prop. compart: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s pontos, %s sementes. Totais do rastreador: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Cópias distribuídas: %d; Próxima: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Pedaços: %d total, %d completo, %d parcial, %d ativo (%d vazio)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d pedaços inválidos + %s em solicitações descartadas" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% concluído, %s restando" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Taxa de download" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Taxa de upload" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "NA" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s iniciado" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Abrir arquivo torrent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Abrir _URL do torrent" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Fazer _novo torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pausar/Iniciar" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Sair" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Mostrar/Esconder torrents _concluídos" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "Redimensionar _janela para caber" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Log" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "Config_urações" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "Aj_uda" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Sobre" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Faça sua doação" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Arquivo" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Ver" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Procurar torrents" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(parado)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(múltiplo)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Já baixando o instalador %s" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Instalar novo %s agora?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Você deseja sair do %s e instalar a nova versão, %s, agora?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Ajuda para %s está em \n" +"%s\n" +"Deseja ir até lá agora?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Visitar a página de ajuda?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Há um torrent concluído na lista. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Você quer removê-lo?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Há %d torrents concluídos na lista. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Você quer remover todos?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Remover todos os torrents concluídos?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Nenhum torrent concluído" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Não há torrents concluídos para remover." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Abrir torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Mudar local de salvar para " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "O arquivo já existe!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" já existe. Você quer escolher outro nome de arquivo?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Local de salvar para " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "A pasta já existe!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" já existe. Você quer criar uma pasta de mesmo nome dentro da pasta " +"existente?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(mensagem global) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Erro" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Ocorreram vários erros. Clique em OK para ver o log de erros." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Parar o torrent ativo?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Você está prestes a iniciar \"%s\". Deseja parar o último torrent ativo?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Você fez sua doação?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bem-vindo à nova versão do %s. Você fez sua doação?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Obrigado!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Obrigado por fazer uma doação! Para doar novamente, selecione \"Faça sua " +"doação\" no menu \"Ajuda\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "deprecado, não use" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Falha ao criar ou enviar comando através do socket de controle existente." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Fechando todas as %s janelas poderá resolver o problema." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s já em execução" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Falha ao enviar comando através do socket de controle existente." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Não foi possível iniciar a fila do torrent, veja os erros acima." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s criador de arquivo torrent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Criar torrent para este arquivo/pasta:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Escolher..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(As pastas se tornarão torrents em lote)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Tamanho do pedaço:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Usar _rastreador" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Usar _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Nós (opcional):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Comentários:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Criar" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Porta" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Construindo torrents..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Verificando tamanhos de arquivo..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Iniciar semeadura" + +#: maketorrent.py:540 +msgid "building " +msgstr "construindo " + +#: maketorrent.py:560 +msgid "Done." +msgstr "Concluído." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Concluída construção de torrents." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Erro!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Erro ao construir torrents: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dias" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dia e %d horas" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d horas" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minutos" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d segundos" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 segundos" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Ajuda" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Perguntas mais Freqüentes:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Ir" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Escolha uma pasta existente" + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Todos os arquivos" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Criar uma nova pasta..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Selecione um arquivo" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Selecione uma pasta" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Impossível carregar estado salvo: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Impossível salvar estado da IU: " + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Conteúdo de arquivo de estado inválido" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Erro ao ler arquivo " + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "impossível restaurar estado completamente" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Arquivo de estado inválido (entrada duplicada)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Dados corrompidos em " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , impossível restaurar torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Arquivo de estado inválido (entrada inválida)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Arquivo de estado da IU inválido" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Versão do arquivo de estado da IU inválida" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versão do arquivo de estado da IU não suportada (de uma versão de cliente " +"mais nova?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Não foi possível eliminar o arquivo %s em cache:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Este não é um arquivo torrent válido. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Este torrent (ou um com o mesmo conteúdo) já está em execução." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Este torrent (ou um com o mesmo conteúdo) já está aguardando para execução." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent em estado desconhecido %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Impossível gravar arquivo " + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "o torrent não reiniciará corretamente quando o cliente reiniciar" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Impossível executar mais que %d torrents simultaneamente. Para maiores " +"informações, veja as perguntas mais freqüentes (FAQs) em %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Não iniciando o torrent, pois há outros torrents aguardando para execução, e " +"este já atende às configurações de quando parar de semear." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Não iniciando o torrent, pois este já atende às configurações de quando " +"parar de semear o último torrent concluído." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Não foi possível obter a última versão de %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Não foi possível analisar a string da nova versão de %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Não foi possível encontrar um local temporário apropriado para salvar o " +"instalador de %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Nenhum arquivo torrent disponível para o instalador de %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "O instalador de %s %s aparenta estar corrompido ou danificado." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Não foi possível iniciar o instalador neste sistema operacional" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"pasta sob a qual dados de variáveis tais como informação de retomada rápida " +"e estado da IGU são salvos. Padrões na subpasta 'data' da pasta de " +"configuração do bittorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codificação de caracteres usada no sistema de arquivos local. Autodetectado, " +"se deixado vazio. Detecção automática não funciona em versões do python " +"anteriores a 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Use o código da linguagem ISO" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"endereço IP para informar ao rastreador (não tem efeito, a menos que você " +"esteja na mesma rede local que o rastreador)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"número da porta vísivel externamente se for diferente do cliente de escuta " +"local" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "porta mínima de escuta, aumentando se indisponível" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "porta máxima de escuta" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "endereço IP para ligar localmente" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "segundos entre atualizações de informação mostrada" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minutos de espera entre pedidos de mais pontos" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "número mínimo de pontos para não fazer re-solicitações" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "número de pontos onde parar de iniciar novas conexões" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"número máximo de conexões permitidas, acima disso novas conexões recebidas " +"serão imediatamente fechadas" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "se deve verificar hashes no disco" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "máximo de kB/s para envio, 0 significa sem limite" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "o número de envios a preencher com desengasgos extra otimistas" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"o número máximo de arquivos em um torrent multi-arquivos a permanecerem " +"abertos simultaneamente, 0 significa sem limite. Usado para evitar ficar sem " +"descritores de arquivo." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicie um cliente sem rastreador. Isto deve ser habilitado para baixar " +"torrents sem rastreador." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "número de segundos de pausa entre envios de keepalives" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "quantos bytes pedir por solicitação." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"máximo comprimento do prefixo de codificação aceitável na linha - valores " +"maiores fazem a conexão cair." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "segundos a esperar entre fechamentos de sockets que não receberam nada" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "segundos a esperar entre verificações se alguma conexão expirou" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"comprimento máximo de fatia a enviar para pontos, fechar conexão se recebida " +"solicitação maior" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"máximo intervalo de tempo para estimar as taxas de envio e recebimento atuais" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "máximo do intervalo de tempo para estimar a taxa de semeadura atual." + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"tempo máximo de espera entre tentativas de anúncio se continuarem falhando" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"segundos a esperar por dados de entrada em uma conexão antes de assumir que " +"ela está semi-permanentemente engasgada" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"número de recebimentos para mudar, de aleatório para mais raro primeiro" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "quantos bytes devem ser gravados nos buffers de rede por vez." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"recusar conexões adicionais de endereços com pontos falhos ou " +"intencionalmente hostis que enviam dados incorretos" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "não conectar a vários pontos que têm o mesmo endereço IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"se diferente de zero, ajuste a opção TOS para conexões de ponto para este " +"valor" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"habilitar contornar falha na libc do BSD, que faz leituras de arquivos " +"ficarem muito lentas." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "endereço do proxy HTTP para usar em conexões de rastreador" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "fechar conexões com RST e evitar o estado TIME_WAIT do TCP" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Usar bibliotecas de rede Twisted para conexões de rede. 1 significa usar " +"twisted, 0 significa não usar twisted, -1 significa autedetectar e preferir " +"twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nome do arquivo (para torrents de único arquivo) ou nome da pasta (para " +"torrents em lote) para salvar o torrent, sobrescrevendo o nome padrão no " +"torrent. Veja também --save_in; se nenhum for especificado, o usuário será " +"perguntado sobre o local para salvar" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "mostrar interface de usuário avançada" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"o número máximo de minutos para semear um torrent completo antes de parar a " +"semeadura" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"a mínima proporção entre envio/recebimento, em percentual, a ser alcançada " +"antes de parar de semear. 0 significa sem limite." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"a mínima proporção entre envio/recebimento, em percentual, a ser alcançada " +"antes de parar de semear o último torrent. 0 significa sem limite." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Semeia cada torrent completado indefinidamente (até o usuário cancelá-lo)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Semeia o último torrent indefinidamente (até o usuário cancelá-lo)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "iniciar baixador em estado de pausa" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"especifica como o aplicativo deve se comportar quando o usuário tenta " +"manualmente iniciar outro torrent: \"substituir\" significa sempre " +"substituir o torrent em execução pelo novo, \"adicionar\" significa sempre " +"adicionar ao torrent em execução em paralelo, e \"perguntar\" significa " +"perguntar ao usuário a cada vez." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nome do arquivo (para torrents de único arquivo) ou nome da pasta (para " +"torrents em lote) para salvar o torrent, sobrescrevendo o nome padrão no " +"torrent. Veja também --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"número máximo de envios permitidos simultaneamente. -1 significa (acredita-" +"se) um número razoável baseado em -- taxa_maxima_envio. Os valores " +"automáticos só são coerentes quando se estiver rodando um torrent por vez." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"diretório local onde o conteúdo do torrent será salvo. O arquivo (torrents " +"de único arquivo) ou pasta(torrents em lote) serão criados dentro dessa " +"pasta usando o nome padrão especificado no arquivo .torrent. Veja também --" +"save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "se deve perguntar ou não por um local onde salvar os arquivos baixados" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"diretório local onde os torrents serão salvos, usando um nome determinado " +"por --saveas_style. Se deixado em branco, cada torrent será salvo na pasta " +"do arquivo .torrent correspondente" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "freqüência de busca na pasta do torrent, em segundos" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Como nomear recebimentos de torrent: 1: use o nome DO arquivo torrent (menos " +"o .torrent); 2: use o nome codificado NO arquivo torrent; 3: crie uma pasta " +"com o nome DO arquivo torrent (menos o .torrent) e salve naquela pasta " +"usando o nome codificado NO arquivo torrent; 4: se o nome DO arquivo torrent " +"(menos o .torrent) e o nome codificado NO arquivo torrent são idênticos, use " +"aquele nome (estilo 1/2), ou crie uma pasta intermediária como no estilo 3; " +"CUIDADO: as opções 1 e 2 têm a capacidade de sobrescrever arquivos sem " +"advertir e podem apresentar problemas de segurança." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "se deve mostrar o caminho completo ou o conteúdo para cada torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "pasta de busca por arquivos .torrent (semi-recursivo)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "se deve mostrar informações de diagnóstico em stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "que potência de dois deve ser escolhida como tamanho do pedaço" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nome padrão do rastreador" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"se falso gerar um torrent sem rastreador, ao invés de URL de anúncio, use um " +"nó confiável na forma : ou uma string vazia para puxar alguns nós " +"de sua tabela de roteamento" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "download completo!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "terminando em %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "download bem-sucedido" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB up / %.1f MB down)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB up / %.1f MB down)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d visto agora, mais %d cópias distribuídas (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d cópias distribuídas (próxima: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d visto agora" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ERRO:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "salvando: " + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "tamanho do arquivo: " + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "percentual concluído: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tempo restante: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "baixar para: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "taxa de download: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "taxa de upload: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "percentual de compartilhamento: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "status de sementes: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "status do ponto: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Impossível especificar --save_as and --save_in simultanemente" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "desligando" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Erro ao ler configuração: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Erro lendo arquivo .torrent: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "você deve especificar um arquivo .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Inicialização da IGU no modo texto falhou; impossível prosseguir." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Essa interface de download requer o módulo padrão do Python \"curses\", que " +"infelizmente está indisponível para a versão nativa em Windows do Python. " +"Contudo está disponível para a versão Cygwin do Python, que roda em todos os " +"sistemas Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Você ainda pode usar o \"bittorrent-console\" para baixar." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "arquivo:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "tamanho:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "dest:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progresso:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "status:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "veloc dl:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "veloc ul:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "compartilhamento:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "sementes:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "pontos:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d visto agora, mais %d cópias distribuídas(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "erro(s):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "erro:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Upload Download Completo Velocidade" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "baixando %d pedaços, tem %d fragmentos, %d de %d pedaços completos" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Ocorreram estes erros durante a execução:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s URL_RASTREADOR [ARQUIVOTORRENT [ARQUIVOTORRENT ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "anúncio antigo para %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "sem torrents" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "ERRO DE SISTEMA - EXCEÇÃO GERADA" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Atenção: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " não é um diretório" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"erro: %s\n" +"rode sem argumentos para explicações sobre parâmetros" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEÇÃO:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Você ainda pode usar \"btdownloadheadless.py\" para baixar." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "conectando aos pontos" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Tpo Estimado em %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Tamanho" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Download" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Upload" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totais:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s pontos %s semeadores %s copias - %s download %s upload" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "erro: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"rode sem argumentos para explicações sobre parâmetros" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "comentário legível opcional para pôr no .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "arquivo alvo opcional para o torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodificar %s arquivos metainfo" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uso: %s [ARQUIVOTORRENT [ARQUIVOTORRENT ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "arq metainfo: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "hash de inform: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nome arq: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "tam arq:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "arquivos:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nome diretório: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "tam arquivo:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "url de anúncio do rastreador: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "nós sem rastreador:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "comentário:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Impossível criar socket de controle: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Impossível enviar comando: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Impossível criar socket de controle: já em uso" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Impossível remover nome de arquivo do socket de controle antigo:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Mutex global já criado." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Não foi possível achar um port aberto!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Não foi possível criar um diretório de dados da aplicação!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"Não foi possível obter trava no mutex global par o arquivo de controle de " +"socket!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "Outra instância do BT não foi fechada propriamente. Continuando." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "não é uma string codificada válida" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "valor codificado inválido (dados após prefixo válido)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Uso: %s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPÇÕES] [DIRETÓRIODOTORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Se um argumento que não é opção estiver presente será \n" +"tomado como o valor da opção torrent_dir.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPÇÕES] [ARQUIVOSTORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPÇÕES] [ARQUIVOTORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPÇÃO] URL_RASTREADOR ARQUIVO [ARQUIVO]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "os argumentos são -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (padrão de " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "chave desconhecida " + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parâmetro passado ao final sem valor" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "interpretação da linha de comando falhou em " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Opção %s é obrigatória." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Deve fornecer pelo menos %d argumentos." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Argumentos em excesso - máximo de %d" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "formato errado de %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Impossível salvar permanentemente as opções: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Anúncio do rastreador incompleto %d segundos após seu início" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problema ao conectar ao rastreador, GetHostByName falhou - " + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problema ao conectar ao rastreador - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "dados errados do rastreador - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "rejeitado pelo rastreador - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Cancelando o torrent, por ter sido rejeitado pelo rastreador enquanto não " +"conectado a pontos. " + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr " Mensagem do rastreador: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "aviso do rastreador - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Impossível ler diretório " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Impossível ver status de " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "removendo %s (re-adicionará)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**atenção** %s é um torrent duplicado de %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**atenção** %s tem erros" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... com sucesso" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "removendo %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "verificação concluída" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "socket do servidor perdido" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Erro lidando com conexão aceita: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Foi preciso sair devido ao desmoronamento da pilha TCP. Favor ver o FAQ em %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Muito tarde para mudar o backend RawServer, %s já foram usados." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Seg" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Ter" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Qua" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Qui" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Sex" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sáb" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Dom" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Fev" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Abr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Ago" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Set" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Out" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dez" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Compactado: %i Descompactado: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Você não pode especificar o nome do arquivo .torrent quando estiver gerando " +"torrents múltiplos de uma vez" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" +"A codificação de sistema de arquivos \"%s\" não é suportada por esta versão" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Impossível converter nome de arquivo/diretório \"%s\" para utf-8 (%s). Ou a " +"codificação de sistema de arquivos assumida \"%s\" está errada ou contém " +"bytes ilegais" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"O nome de arquivo/diretório \"%s\" contém valores unicode reservados que não " +"correspondem a caracteres." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "dados errados no arquivo de resposta - total pequeno demais" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "dados errados no arquivo de resposta - total grande demais" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "verificando arquivo existente" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 ou informações de retomada rápida não bate com arquivo de " +"estado (dados faltando)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Informações de retomada rápida erradas (arquivos contêm mais dados)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Informações de retomada rápida erradas (valor ilegal)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" +"dados corrompidos no disco - talvez você tenha duas cópias em execução?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Impossível ler dados de retomada rápida: " + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"dito arquivo completo na inicialização, mas o pedaço falhou na verificação " +"de hash" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "O arquivo %s pertence a outro torrent em execução" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "O arquivo %s já existe, mas não é um arquivo normal" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Leitura curta - algo truncou os arquivos?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formato de arquivo de retomada rápida não suportado, talvez de outra versão " +"de cliente?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Outro programa moveu, renomeou ou apagou o arquivo." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Outro progama modificou o arquivo." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Outro programa alterou o tamanho do arquivo." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Impossível mandar manuseador de sinal: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "descartado \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "adicionado \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "aguardando por verificação de hash" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "baixando" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Relendo arquivo de configuração" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Impossível ver status de %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Não foi possível baixar ou abrir \n" +"%s\n" +"Tente baixar o torrent através de um Navegador da Web." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Parece haver uma versão antiga do Python que não suporta detecção da " +"codificação de sistema de arquivos. Assumindo 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python falhou ao ao autodetectar a codificação de sistema de arquivos. " +"Usando então 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Codificação de sistema de arquivos '%s' não é suportada. Usando então " +"'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componente do caminho de arquivo errado: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"nomes de arquivos codificados incorretamente. Alguns ou todos os nomes de " +"arquivos podem aparecer diferentes daquilo que o criador do arquivo .torrent " +"quis." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"valores errados de caracteres que não correspondem a nenhum caracter real. " +"Alguns ou todos os nomes de arquivos podem aparecer diferentes daquilo que o " +"criador do arquivo .torrent quis." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui " +"nomes de arquivos codificados incorretamente. Os nomes usados podem ainda " +"estar corretos." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"O conjunto de caracteres usado no sistema de arquivos local (\"%s\") pode " +"não representar todos os caracteres usados no(s) nome(s) de arquivo(s) deste " +"torrent. Os nomes de arquivos foram modificados do original." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"O sistema de arquivos do Windows não consegue lidar com todos os caracteres " +"usados no(s) nome(s) de arquivo(s) deste torrent. Os nomes de arquivos foram " +"modificados do original." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Esse arquivo .torrent foi criado com uma ferramenta defeituosa e possui pelo " +"menos 1 nome de arquivo ou de diretório inválido. Contudo, como todos os " +"arquivos nessa situação foram marcados como tendo comprimento 0, serão " +"ignorados." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Requer Python 2.2.1 ou mais novo" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Impossível iniciar duas instâncias distintas do mesmo torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "porta máxima menor que porta mínima - sem portas para verificar" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Impossível abrir uma porta de escuta: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Impossível abrir uma porta de escuta: %s. " + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Verifique suas configurações de faixa de portas." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Inicialização" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Não foi possível obter dados do reínicio rápido: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Fará verificação de hash completa." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "falhou a verificação de hash do pedaço %d, baixando-o novamente" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Tente baixar um torrent sem rastreador com um cliente sem rastreador " +"desligado." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "download falhou: " + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Erro de E/S: Espaço insuficiente no disco, ou impossível criar arquivo tão " +"grande:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "morto por erro de E/S: " + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "morto por erro no SO: " + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "morto por exceção interna: " + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Erro adicional durante encerramento devido a erro: " + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Impossível remover arquivo de reínicio rápida após a falha:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "semeando" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Impossível escrever dados de retomada rápida: " + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "desligar" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo errada - não é dicionário" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo errada - chave de pedaços errada" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo errada - comprimento ilegal de pedaço" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo errada - nome errado" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "nome %s proibido por questões de segurança" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "conjunto de arquivo simples/múltiplo" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo errada - comprimento errado" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo errada - \"arquivos\" não é uma lista de arquivos" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo errada - valor de arquivo errado" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo errada - caminho errado" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo errada - caminho de diretório errado" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "caminho %s proibido por questões de segurança" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo errada - caminho duplicado" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo errada - nome usado ao mesmo tempo para arquivo e subdiretório" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "metainfo errada - tipo de objeto errado" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo errada - sem string da URL de anúncio" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "motivo de falha não-textual" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "mensagem de aviso não-textual" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "entrada inválida na lista de pontos 1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "entrada inválida na lista de pontos 2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "entrada inválida na lista de pontos 3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "entrada inválida na lista de pontos 4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "lista de pontos inválida" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "intervalo de anúncio inválido" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "intervalo mínimo de anúncio inválido" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "id do rastreador inválido" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "número de ponto inválido" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "número de semente inválido" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"última\" entrada inválida" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Porta de escuta." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "arquivo para armazenar inrformação de baixador recente" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "tempo limite para fechar conexões" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "segundos entre a gravação do arquivo" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "segundos entre expiração de quem baixa" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "segundos que quem baixa deve esperar entre reanúncios" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"número padrão de pontos para enviar mensagens de informação se o cliente não " +"especificar um número" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"tempo de espera entre verificação se qualquer das conexões exprirou o tempo" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"número de vezes a verificar de quem baixa está atrás de um NAT ( 0 = não " +"verificar)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "se adicionar entradas ao log para verificação de NAT" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "tempo mínimo decorrido desde a última descarga para outra" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"tempo mínimo em segundos antes de um cache ser considerado estagnado e " +"jogado fora" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"só permitir downlods de .torrents neste diretório (e recursivamente em " +"subdiretórios de diretórios que não possuam arquivos .torrent). Se marcado, " +"os torrents neste diretório aparecerão numa página de informações, " +"independente de terem pontos ou não" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permite que chaves especiais em torrents em allowed_dir afetem o acesso ao " +"rastreador" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "se reabre o arquivo de log no recebimento de um sinal HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"se mostra uma página de informação quando o diretório raiz do rastreador é " +"carregado" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "uma URL para redirecionar a página de informação" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "se mostra nomes do diretório permitido" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"arquivo contendo dados x-icon a serem retornados quando o browser solicitar " +"favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorar o parâmetro IP GET de máquinas que não estão nos IPs da rede local " +"(0 = nunca, 1 = sempre, 2 = ignorar se verificação de NAT desabilitada). " +"Cabeçalhos de proxy HTTP dando endereço do cliente original serão tratados " +"da mesma forma que --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"arquivo para escrever os logs de rastreador, use - para stdout (padrão)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"use com allowed_dir; adiciona uma URL /arquivo?hash={hash} que permite aos " +"usuários baixar o arquivo torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"manter torrents mortos depois de expirar (para que eles ainda apareçam em " +"seu /scrape e página da web). Só importa se allowed_dir não está marcado" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "acesso a scrape permitido (pode ser nenhum, específico ou total)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "número máximo de pontos para dar com qualquer solicitação" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"seu arquivo pode existir em qualquer lugar no universo,\n" +"mas não aqui\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**atenção** arquivo especificado como favicon -- %s -- não existe." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**atenção** arquivo de estado %s corrompido; reiniciando" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Log Iniciado: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**atenção** impossível redirecionar stdout para o arquivo de log: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Log reaberto: " + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**atenção** impossível reabrir o arquivo de log" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "função específica de scrape indisponível com este rastreador." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "função scrape total indisponível com este rastreador." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "função obter indisponível com este rastreador." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Download solicitado não está autorizado para uso com este rastreador." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "rode sem argumentos para explicações sobre parâmetros" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Desligando: " diff --git a/locale/ro/LC_MESSAGES/bittorrent.mo b/locale/ro/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..5b258ffc8cbfc82acbe203eba351a29ff7608b9c GIT binary patch literal 62259 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 literal 0 HcmV?d00001 diff --git a/locale/ro/LC_MESSAGES/bittorrent.po b/locale/ro/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..d23c400 --- /dev/null +++ b/locale/ro/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2891 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-15 14:10-0800\n" +"Last-Translator: Matt Chisholm \n" +"Language-Team: Lupoiu Victor Alexandru ( lupoiu [dot] victor [at] gmail[dot]" +"com )\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Country: ROMANIA\n" +"X-Poedit-Language: Romanian\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Instalaţi Python 2.3 sau o versiune mai recentă" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Este necesar PyGTK 2.4 sau o versiune mai recentă" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Introduceţi adresa URL a torentului" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Introduceţi adresa URL a fişierului torrent pentru a-l deschide:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "apelare pe linie" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cablu 128k sau viteză mai mare" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cablu 256k sau viteză mai mare" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k sau viteză mai mare" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Rată maximă de încărcare:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Oprire temporară a tuturor torentelor care rulează" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Reluare descărcare" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pauză" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Nici un torent" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Rulare normală" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "În spatele unui parafoc/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nouă versiune %s disponibilă" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Este disponibilă o versiune mai nouă a %s .\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Utilizaţi %s, cea mai nouă versiune este %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Puteţi descărca întotdeauna cea mai recentă versiune de la \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Descărcare mai _tarziu" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Descărcare _acum" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Aminteşte-mi mai târziu" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Despre %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Versiunea %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Imposibil de deschis %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Donare" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Jurnal activitate %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Salvare jurnal în:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "jurnal salvat" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "jurnal şters" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Setări %s" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Salvare" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Salvare noile descărcări în:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Schimbare..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Intreabă unde să se salveze fiecare nouă descărcare" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Se descarcă..." + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Pornire manuală torente suplimentare:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Întotdeauna se opreşte _ultimul torent care rulează" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Întotdeauna porneşte torentele în _paralel" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Întreabă întotdeauna" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Semănare" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Semănarea a terminat torentele: până când rata semănării atinge [_]% sau " +"pentru [_]minute, oricare opţiune este prima." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Semănare pe un timp nedefinit" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Semănarea ultimului torent completat: până când rata semănării atinge [_] " +"procente." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Reţea" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Căutare port disponibil:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "începere cu portul: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP de raportat la tracker:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Nu are nici un efect decât dacă sunteţi pe\n" +"aceeaşi reţea ca şi tracker-ul)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Textul barei de progres este întotdeauna negru\n" +"(necesită repornire)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Diverse" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ATENŢIE: Schimbarea acestor setări poate cauza\n" +"funcţionarea incorectă a %s." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Opţiune" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Valoare" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avansat" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Alegere director implicit pentru salvare" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Fişiere în \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Aplicare" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Alocare" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "A nu se descărca" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Descreştere" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Creştere" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Nume fişier" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Lungime" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Parteneri pentru \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Adresă IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Client" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Conexiune" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s descărcare" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s încărcare" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB descărcaţi" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB încărcaţi" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% finalizat" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s estimat de la partener" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID partener" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Interesat" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Blocat" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Oprit" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Încărcare optimistă" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "de la distanţă" + +#: bittorrent.py:1358 +msgid "local" +msgstr "local" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "partener rău" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d erori" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "acces interzis" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Informaţii pentru \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Nume torent:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torent fără tracker)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URL pentru anunţ:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", într-un singur fişier" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", în %d fişiere" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Mărime totală:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Bucăţi:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Informaţii hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Salvare în:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Nume fişier:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Deschidere director" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Afişare listă de fişiere" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "glisare pentru reordonare" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "clic-dreapta pentru meniu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Informaţii torent" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Ştergere torent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Anulare torent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", va fi semănat pentru %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", va fi semănat un timp nedefinit." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Terminat, rata de partajare: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Terminat, %s încărcat" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Terminat" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Informaţii torent" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Deschidere director" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Listă _fişiere" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Listă _parteneri" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Schimbare locaţie" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Semănare pentru un timp nedefinit" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Re_pornire" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Finalizare" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Ştergere" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Anulare" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Sigur doriţi să ştergeţi \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Rata de partajare pentru acest torent este de %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Aţi încărcat %s pentru acest torent. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Se şterge acest torent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Finalizat" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "glisare în listă pentru semănare" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Eşuat" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "glisare în listă pentru reluare" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Aşteptare" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Rulare" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Încărcare curentă: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Descărcare curentă: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Încărcare precedentă: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Descărcare precedentă: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Rată de partajare: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s parteneri, %s săditori. Total de la tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Copii distribuite: %d; Următorul: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Bucăţi: %d totale, %d terminate, %d parţiale, %d active (%d goale)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d bucăţi eronate + %s cereri neconsiderate" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%,1f%% terminate, %s rămase" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Rată de descărcare" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Rată de încărcare" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "NA" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s pornit" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Deschidere fişier torent" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Deschidere adresă _URL torent" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Creare torent _nou" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pauză/Rulare" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "Ieşi_re" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Afişare/ascundere torent _finalizate" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Redimensionare ferestră pentru potrivire" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Jurnal" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Setări" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Ajutor" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "D_espre" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Donare" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Fişier" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Vizualizare" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Căutare torente" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(oprit)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(multiple)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Descărcare %s instaler în curs" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Instalare noul %s acum?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Doriţi să ieşiti %s şi să instalaţi noua versiune %s, acum?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Mai multe informaţii despre %s găsiţi la \n" +"%s\n" +"Doriţi să le accesaţi acum?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Vizitare pagina de asistenţă Web?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Există un torent finalizat în listă. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Doriţi sa-l ştergeţi?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Există %d torente finalizate în listă. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Doriţi să le ştergeţi pe toate?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Ştergere toate torentele finalizate?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Nici un torent finalizat" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Nu există nici un torent finalizat care poate fi şters." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Deschidere torent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Schimbare locaţie de salvare pentru" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Fişierul există!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" există deja. Doriţi să alegeţi un nume de fişier diferit?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Locaţie de salvare pentru " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Directorul există deja!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" există deja. Intenţionaţi să creaţi un director identic în interiorul " +"directorului deja existent?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(mesaj global):%s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Eroare" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Erori multiple. Faceţi clic pe OK pentru a vedea jurnalul de erori." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Se opreşte rularea torentului?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Sunteţi pe cale să porniţi \"%s\". Doriţi să opriţi şi ultimul torent care " +"rulează?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Aţi donat deja?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Bun venit la noua versiune %s. Aţi donat deja?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Mulţumim!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Mulţumim pentru donaţie! Pentru a dona din nou, selectaţi \"Donare\" din " +"meniul \"Ajutor\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "dezaprobat, a nu se folosi" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Eşuare la crearea sau trimiterea unei comenzi printr-un socul de control " +"existent." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Închiderea tuturor ferestrelor %s ar putea rezolva problema." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s rulează deja" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Eşuare la trimiterea unei comenzi printr-un soclu de control existent." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Imposibil de pornit TorrentQueue, vizualizaţi erorile." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s creator de fişiere torent %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Creare fişier torent pentru acest fişier/director." + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Se alege..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Directoarele vor deveni torente grup)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Mărime bucată:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Utilizare _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Utilizare _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Noduri (opţional):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Comentarii:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Creare" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Gazdă" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Construire torente..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Verificare mărime fişiere..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Începere semănare" + +#: maketorrent.py:540 +msgid "building " +msgstr "construire" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Terminat." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Am terminat construirea torentelor." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Eroare!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Eroare la construirea torentelor: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d zile" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 zi %d ore" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d ore" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minute" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d secunde" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 secunde" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Ajutor" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Întrebări frecvente:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Start" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Alegere un director existent..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Toate fişierele" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torente" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Creare un nou director..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Selectare un fişier" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Selectare un director" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Imposibil de încărcat starea salvată: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Imposibil de salvat starea UI:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Conţinut fişier de stare eronat" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Eroare la citirea fişierului" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "imposibil de restaurată în totalitate starea" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Fişier de stare eronat (introducere dublă)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Date corupte în " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , imposibil de restaurat torentul (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Fişiser de stare eronat (introducere eronată)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Fişier de stare UI eronat" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Versiune fişier de stare UI eronat" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Versiune neacceptată fişier de stare UI (de la o versiune client mai " +"recentă?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Imposibil de şters fişier cache %s:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Fişier torent invalid. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Acest torent (sau unul cu acelaşi conţinut) rulează deja." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Acest torent (sau unul cu acelaşi conţinut) aşteaptă deja să ruleze." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torent în stare necunoscută %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Imposibil de scris în fişier " + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torentul nu va fi repornit corect la repornirea clientului" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Imposibil de rulat mai mult de %d torente simultan. Pentru mai multe " +"informaţii citiţi FAQ la %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Nu se va porni torentul întrucât sunt deja alte torente care aşteaptă să " +"ruleze, iar acesta îndeplineşte deja condiţiile de oprire din semănare." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Nu se va porni torentul întrucât îndeplineşte deja condiţiile de oprire din " +"semănare ca ultim torent finalizat." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Imposibil de obţinut cea mai recentă versiune de la %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Nu s-au putut analiza şirul de caractere al noii versiuni de la %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Imposibil de găsit o locaţie temporară corespunzătoare pentru a salva " +"instalerul %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Nu este disponibil nici un fişier torent pentru instalerul %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "se pare că instalerul %s %s este corupt sau lipseşte." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Imposibil de lansat instalerul pe acest sistem de operare" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"directorul în care datele variabile precum informaţiile fastresume şi starea " +"GUI este salvat. Implicit acesta este subdirectorul 'data' din directorul " +"config." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"codarea caracterelor utilizată la sistemului local de fişiere. Dacă este " +"gol, va fi autodetectat. Autodetectarea nu funcţionează folosind versiuni " +"Python mai vechi de ver. 2.3." + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Codul limbajului în standardul ISO care va fi folosit" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ip-ul care va fi raportat către tracker (nu are nici un efect decât dacă " +"sunteţi în aceeaşi reţea ca şi trackerul)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"numărul portului vizibil, dacă este diferit de cel pe care îlascultă " +"clientul local" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"porturilor minime pe care se va asculta, numărul va creşte dacă nu este " +"disponibil" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "porturile maxime pe care se va asculta" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ip care va fi considerat local" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "secunde între actualizările informaţiilor afişate" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minute între cererile pentru mai mulţi parteneri" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "numărul minim de parteneri pentru care nu se face o resolicitare" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "numărul de parteneri la care se opreşte iniţializarea conexiunilor noi" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"numărul maxim de conexiuni permise, după ce aceste noi conexiuni vor fi " +"imediat închise" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "dacă se face verificarea hash pe disc" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maximum kB/s de încărcat, 0 înseamnă fără limită" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "numărul de încărcări cu care se completează cu deblocări optimiste" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"numărul maxim de fişiere care sunt deschise în acelaşi timp într-un torent " +"cu mai multe fişiere, 0 înseamnă fără limită. Utilizat pentru a evita " +"insuficienţa descriptorilor." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Iniţializarea unui client fără tracker. Aceasta trebuie activată pentru a " +"putea descărca torente fără tracker." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "numărul de secunde între emiterile de semnale de menţinere a conexiuni" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "câţi biţi se vor verifica la fiecare cerere." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"marimea maximă a prefixului codării care se acceptă la conexiune - o valoare " +"mare duce la deconectare." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "secunde între închiderile de socluri prin care nu s-a primit nimic" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "secunde între verificările conexiunilor care au pierdut contactul" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"marimea maximă a unei bucăţi trimise partenerilor, se închide conexiunea " +"dacă este primita o cerere mai mare" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"intervalul maxim de timp pe care se va estima ratele curente de încărcare şi " +"descărcare" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "intervalul maxim de timp pe care se va estima rata curentă de semănare" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"durata maximă care se aşteaptă între anunţurile de reîncercare în caz că " +"acestea eşuează" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"secunde de aşteptat pentru venirea datelor printr-o conexiune, înainte de a " +"presupune că legătura este blocată semi-permanenet" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"numărul de descărcări la care se trece de la căutare aleatoare la cele rare " +"primele" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "" +"numărul de biţi care se vor scrie în memoria tampon pentru reţea într-o " +"singură trecere." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"refuzarea conexiunii viitoare cu adrese de parteneri ostili care transmit " +"date eronate" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "" +"nu se va face conectarea la mai mulţi parteneri care au aceeaşi adresă IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"dacă este diferită de zero, se setează opţiunea TOS pentru conexiunile cu " +"partenerii la valoarea respectivă" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"se evită o eroare în libraria libc de pe BSD care va face ca citirile să " +"meargă foarte încet." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adresa proxy-ului HTTP care este folosită pentru conectarea la tracker" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "închide conexiunile cu RST şi evită starea TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Utilizează librăriile de reţea Twisted pentru conexiunile de reţea. 1 " +"înseamnă că se foloseşte twisted, 0 înseamnă că nu se foloseste twisted, -1 " +"înseamnă că se face autodetecţie, şi se preferă twisted" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"nume fişier (pentru torentele cu un singur fişier) sau nume director (pentru " +"torentele cu mai multe fişiere) în care se va salva torentul, atunci când nu " +"se ţine seama de numele implicit al torentului. Vezi, de asemenea, --" +"save_in, dacă nici unul nu e precizat utilizatorul va fi întrebat de locaţia " +"salvării." + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "se afişează interfaţa avansată" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"durata maximă de timp în minute în care se va face semănarea unui torent " +"complet înainte de oprirea semănării" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"rata minimă de încărcare/descărcare, în procente, care va fi atinsă înainte " +"de oprirea semănării. 0 înseamnă fără limită." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"rata minimă de încărcare/descărcare, in procente, care va fi atinsă înainte " +"de oprirea semănării ultimului torent. 0 înseamnă fără limită." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Semănarea fiecărui torent complet pe un timp nedefinit (până când " +"utilizatorul anulează acţiunea)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Semănarea ultimului torent pe un timp nedefinit (până când utilizatorul " +"anulează acţiunea)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "porneşte descărcarea în starea de pauză" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"specifică cum ar trebui să se comporte aplicaţia când utilizatorul încercă " +"să pornească manual un alt torent: \"replace\" înseamnă că întotdeauna se va " +"înlocui torentul rulat cu cel nou, \"add\" înseamnă că întotdeauna se va " +"adăuga lângă torentul rulat, în paralel, iar \"ask\" înseamnă că " +"utilizatorul va fi întrebat de fiecare dată." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"nume fişier (pentru torentele cu un singur fişier) sau nume director (pentru " +"torentele cu mai multe fişiere) în care se va salva torentul, atunci când nu " +"se ţine seama de numele implicit al torentului. Vezi, de asemenea, --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"numărul maxim de încărcări permise în acelaşi timp. -1 înseamnă un număr " +"rezonabil (se speră) bazat pe -max_upload_rate. Valorile automate sunt " +"valabile numai atunci când se rulează doar câte un torent." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"directorul local în care se va salva conţinutul torentului. Fişierul " +"(torente cu un singur fişier) sau directorul (torent(e) cu mai multe " +"fişiere) va fi creat în acest director folosind numele implicit specificat " +"în fişierul .torrent. Vezi, de asemenea, şi --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "dacă se solicită o locaţie în care se vor salva fişierele" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"directorul local unde se salvează torentele, folosind un nume determinat de " +"--saveas_style. Dacă este lăsat gol fiecare torent va fi salvat în " +"directorul corespunzător fişierului .torent" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "cât de des se scanează directorul cu torente, în secunde" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Cum să numiţi fişierele descărcate din torente:1: folosiţi numele torentului " +"(minus .torrent); 2: folosiţi numele codat în torent; 3: creaţi un " +"director cu numele torentului (minus .torrent) şi realizaţi salvarea în acel " +"director folosind numele codat din fişierul torent; 4: dacă numele " +"torentului (minus .torrent) şi numele codat în fişierul torent este acelaşi, " +"folosiţi acel stil de redenumire (stilul 1/2), dacă nu, creaţi un director " +"intermediar ca în stilul 3; ATENŢIE: opţiunile 1 şi 2 au opţiunea să " +"suprascrie fişiere fără o anunţare în prealabil şi pot prezenta probleme de " +"securitate." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"dacă se va afişa întreaga cale sau conţinutul torentului pentru fiecare " +"torent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "directorul în care se vor căuta fişiere .torrent (semi-recursiv)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "dacă se vor afişa informaţii de diagnostic la stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "la ce putere a lui 2, se va seta mărimea unei bucăţi" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "nume implicit tracker" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"Daca este fals se va creea un torent fara tracker,in loc de URL-ul de " +"anuntare, folositi un nod de incredere sub forma : sau un sir gol " +"de caractere pentru a introduce niste noduri din tablea de rutare" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "descarcare completa!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "gata in %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "descarcare reusita" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB donat / %.1f MB tras)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB donat / %.1f MB tras)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d vizibil(i) acum, plus %d copii distribuite (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d copii distribuite (urmatorul: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d vizibil(i) acum" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "EROARE:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "salvare: " + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "marimea fisierului:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "procent gata: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "timp ramas: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "trage in: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "rata tragere: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "rata donare: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "rating impartire: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "stare sadire: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "stare parteneri: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Nu puteti specifica si --save_as si --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "oprire in curs" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Eroare la citirea configuratiei: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Eroare la citirea fisierului .torrent: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "trebuie sa specificati un fisier .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Nu a reusit initializarea interfetei text, nu pot continua." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Acesta interfata de descarcare necesita modului Pyton standard \"curses\", " +"care din nefericire nu este diponibil pentru versiune nativa de Windows a " +"Python. Este insa disponibila pentru versiunea de Cygwin a Python, care " +"ruleaza pe toate sistemele Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Se mai poate folosi si \"bittorrent-console\" pentru descarcare." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "fisier:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "marime:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "destinatie:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progres:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "statut:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "viteza tragere:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "viteza donare:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "impartire:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "saditori:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "parteneri:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d vizibili acum, plus %d copii distribute(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "erori:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "eroare:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr " # IP Donat Tras Gata Viteza" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "trag %d bucati, am %d fragmente, %d din %d bucati complete" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Aceste erori s-au produs in timpul executiei:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Mod de folosire: %s URL_TRACKER [FISIERTORRENT [FISIERTORRENT ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "anunt vechi pentru %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "nici un torent" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "EROARE DE SISTEM - EXCEPTIE GENERATA" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Atentie: " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " nu este un director" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"eroare: %s\n" +"ruleaza fara argumente pentru o explicare a parametrilor" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"EXCEPTIE:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Poti folosi si \"btdownloadheadless.py\" pentru a descarca." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "conectare la parteneri" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Timp ramas %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Marime" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Tragere" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Donare" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Total:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s parteneri %s saditori %s copii distribuite - %s jos %s sus" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "eroare: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"ruleaza fara argumente pentru o explicare a parametrilor" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "comentariu optional ce va fi pus in .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "fisier destinatie optional pentru torent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - decodare %s fisiere metainfo" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Mod de folosire: %s [FISIERTORRENT [FISIERTORRENT ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "fisierul metainfo: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "info hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "nume fisier: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "marime fisier:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "fisiere: " + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "nume director: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "marimea arhivei:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "url pentru anuntare: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "noduri fara tracker:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "comentariu:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Socket-ul de control nu s-a putut crea: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Comanda nu s-a putut trimite: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Socket-ul de control nu s-a putut creea: este deja folosit" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Numele socket-ului de control vechi nu s-a putut sterge:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Mutex global deja creeat." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Nu s-a putut gasi un port deschis!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Nu s-a putut creea directorul de date al aplicatiei!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Nu s-a putut bloca un mutex global pentru fisierul controlsocket!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "O instanta de BT nu a fost inchisa corect.Se continua." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "acesta nu este un sir de caractere corect bencoded" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "valoarea bencoded eronata (exista date dupa un prefix valid)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Mod de folosire: %s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPTIUNI] [DIRECTORTORRENT]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Daca un argument este prezent fara optiuni va fi considerata valoarea\n" +"din optiunea torrent_dir.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPTIUNI] [FISIERETORRENT]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPTIUNI] [FISIERTORRENT]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPTIUNI] URL_TRACKER FISIER [FISIER]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argumentele sunt -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (implicit " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "cheie necunoscuta " + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parametrul a fost pus la sfarsit dar fara valoare" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "parcurgerea liniei de comanda a esuat la " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Optiunea %s este necesara." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Trebuie specificate cel putin %d argumente." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Prea multe argumente - %d maxim." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "format eronat al %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Optiunile nu s-au putut salva permanent: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Anuntul catre tracker inca nu este complet la %d secunde dupa pornire" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problema la conectarea la tracker, gethostbyname a esuat -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problem la conectarea la tracker - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "date eronate de la tracker - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "respins de tracker - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Anulare torent caci a fost respins de tracker cand nu era conectat la nici " +"un partener. " + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr " Mesaj de la tracker: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "atentionare de la tracker - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Nu s-a putut citi directorul " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Nu s-a putut afla starea " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "sterg %s (o sa fie re-adaugat)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**atentie** %s este o dublura pentru %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**atentie** %s are erori" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... reusit" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "stergere %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "gata verificare" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "am pierdut socket-ul serverului" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Eroare in manuirea conexiunii acceptate: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "Oprire datorita instabilitatii TCP stack. Cititi FAQ la %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Este prea tarziu pentru schimbul RawServer, %s a fost deja folosit." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Lun" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Mie" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Joi" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Vin" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sam" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Dum" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Ian" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Mai" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Iun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Iul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Aug" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Oct" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Noi" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dec" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Compresat: %i Necompresat: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Nu se poate specifica numele fisierului .torrent atunci cand se genereaza " +"mai multe torente in acelasi timp" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" +"Codarea sistemului de fisiere \"%s\" nu este suportata in aceasta versiune" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Nu s-a putut converti numele de fisier/director \"%s\" la utf-8 (%s). Se " +"poate ca, codarea presupusa a sistemului de fisiere \"%s\" este gresita sau " +"numele fisierului contine bytes ilegali." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Numele de fisier/director \"%s\" contine valori unicode rezervate care nu " +"corespund cu caractere." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "date eronate in responsefile - totalul este prea mic" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "date eronate in responsefile - totalul este prea mare" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "verificare fisierul existent" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 sau informatiile fastresume nu se potrivesc cu starea " +"fisierului (date lipsa)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Informatii fastresume eronate (fisierele contin mai multe date)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Informatii fastresume eronate (valoare ilegala)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "datele sunt corupte pe disc - poate ca aplicatia ruleaza de doua ori?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Nu s-au putut citi datele fastresume: " + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"fisierele au fost considerate complete la pornire, dar bucatile nu s-au " +"verificat la hash check" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Fisierul %s apartine unui alt torrent care ruleaza" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Fisierul %s exista deja, dar nu este un fisier obisnuit" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Citire scurta - ceva a sectionat fisierele?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Formatul fisierului fastresume este nesuportat, poate apartine altei " +"versiuni de client?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "Se pare ca un alt program a mutat, redenumit sau a sters fisierul." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Se pare ca un alt program a modificat fisierul." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Se pare ca un alt program a schimbat marimea fisierului." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Nu s-a putut seta activatorul de semnal: " + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "anulate \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "adaugate \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "se astepata verificarea hash" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "descarcare" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Se reciteste fisierul de configurare" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Nu s-a putut afla starea %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Nu se poate descarca sau deschide \n" +"%s\n" +"Incearca sa folosesti un browser pentru a descarca un fisier torrent." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Se pare ca aveti o versiune mai veche de Python care nu suporta detectarea " +"codarii sistemului de fisiere. Presupunem 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python a esuat s-a autodetecteze codare sistemului de fisiere. Vom folosi in " +"schimb 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Codarea sistemului de fisiere '%s' nu este suportata. Folosesc 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Componenta eronata in calea catre fisier: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Acest fisier .torrent a fost creat cu o aplicatie stricata si numele de " +"fisiere au fost incorect codate. Unele sau toate numele de fisiere pot " +"aparea diferit fata de modul in care creatorul fisierului .torrent a " +"intentionat." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Acest fisier .torrent a fost creat cu o aplicatie stricata si are valori " +"eronate pentru caractere, care nu corespund unor caractere reale. Unele sau " +"toate numele de fisiere pot aparea diferit fata de modul in care creatorul " +"fisierului .torrent a intentionat." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Acest fisier .torrent a fost creat cu o aplicatie stricata si numele de " +"fisiere au fost incorect codate. Numele folosite pot fi insa corecte." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Setul de caractere folosit de sistemul local de fisiere (\"%s\") nu poate " +"reprezenta toate caracterele folosite in scrierea numelor fisierelor din " +"acest torent. Numele de fisiere au fost schimbate din cele originale." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Sistemul de fisiere al Windows nu suporta unele caractere folosite in " +"numele unor fisisere din acest torent. Numele de fisiere au fost schimbate " +"din cele originale." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Acest fisier .torrent a fost creat cu o aplicatie stricata si are cel putin " +"un fisier sau director cu nume eronat. Dar din moment ce asemenea fisiere au " +"fost marcate ca avand marimea 0 acele fisiere sunt ignorate." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Este necesar Python versiunea 2.2.1 sau mai noua" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Nu pot porni doua instante separate pentru acelasi torent." + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport este mai mic decat minport - nici un port de verificat" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Nu s-a putut deschide un port pentru ascultare: %s. " + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Nu s-a putut deschide un port pentru ascultare: %s. " + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Verificati setarile pentru zona de oprturi." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Pornire initial" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Nu s-au putut incarca datele pentru o continuare rapida: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Se va face o verificare hash completa." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "bucata %d a esuat la verificarea hash, va fi descarcata din nou" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"S-a incercat descarcarea unui torent fara tracker cand aceasta optiune nu " +"este activata." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "descarcare esuata: " + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Eroare de I/O: Nu mai este loc pe disc, sau nu se poate creea un fisier asa " +"mare:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "oprit datorita unei erori de I/O: " + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "oprit datorita unei erorii a SO: " + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "oprit datorita exceptiei interne: " + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Erori aditionale la inchidere datorita erorii: " + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Nu s-a putut sterge fisierul de fastresume dupa esuare:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "sadire" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Nu s-au putut scrie datele de fastresume: " + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "oprire" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "metainfo eronat - nu este un dictionar" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "metainfo eronat - cheia bucatilor este eronata" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "metainfo eronat - marime ilegala a bucatilor" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "metainfo eronat - nume eronat" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "numele %s nu este permis din motive de securitate" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "amestecare fisier singular/multiple" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "metainfo eronat - marime eronata" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "metainfo eronat - \"files\" nu este o lista de fisiere" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "metainfo eronat - valoare fisier eronata" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "metainfo eronat - cale eronata" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "metainfo eronat - calea catre director eset eronata" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "calea %s nu este permisa din motive de securitate" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "metainfo eronat - calea este dublata" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"metainfo eronat - numele este folosit si ca nume de fisier si ca nume de " +"subdirector" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "metainfo eronat - tipul obiectului este gresit" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "metainfo eronat - nu exista URL pentru anuntare" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "motiv de esuare non-text" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "mesaj de atentionare non-text" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "intrare eronata in lista1 a partenerilor" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "intrare eronata in lista2 a partenerilor" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "intrare eronata in lista3 a partenerilor" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "intrare eronata in lista4 a partenerilor" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "lista eronata a partenerilor" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "interval eronat de anuntare" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "interval minim eronat de anuntare" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "id tracker eronat" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "numar eronat de parteneri" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "numar eronat de saditori" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"last\" intrare eronata" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Portul pe care ascult." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "fisier in care se pastreaza informatiile recente despre descarcari" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" +"timpul dupa pierderea legaturii dupa care se face inchiderea conexiunii" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "secunde intre salvarile dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "secunde intre descarcari ce expira" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "secunde cat asteapta un client intre reanuntari" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"numarul implicit de parteneri catre care se trimite un mesaj de informare " +"daca clientul nu specifica un numar" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "timpul care se asteapta intre verificarile de stare ale conexiunilor" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"de cate ori se verifica daca un utilizator este in spatele unui NAT (0 = nu " +"verifica)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" +"daca se vor adauga intrari in jurnal pentru rezulatele verificarilor nat" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" +"timpul minim care a trecut de la ultima curatare ca sa se faca inca una" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"timpul minim in secunde inainte ca memoria cache sa fie considerata expirata " +"si sa fie curatata" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"permite descarcari pentru torente in acest director (si recursiv in " +"subdirectoarele directoareler care nu au fisiere torent). Daca e setat, " +"torentele din acest director apare in pagina de informatii/scrape chiar daca " +"au sau nu parteneri" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"permite cheilor speciale din torente din allowed_dir sa afecteze accesul " +"tracker-ului" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "daca se va redeschide fisierul jurnal la primirea semnalului HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"daca se va arata o pagina de informatii atunci cand directorul radacina al " +"tracker-ului este incarcat" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "un URL catre care se va redirectiona pagina de informatii" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "daca se vor arata numele din directorul permis" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"fisierul ce contine datele x-icon care sunt returnate atunci cand browserul " +"cere favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignora parametrul -ip GET de la calculatoarele care nu au IPuri de pe " +"aceeasi retea locala (0 = niciodata, 1 = mereu, 2 = ignora daca verificarea " +"NAT nu este pornita). Proxy-urile HTTP care dau adresa clientului originar " +"sunt tratate la fel ca --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"fisier pentru scrierea jurnalului trackerului, folositi - pentru stdout " +"(implicit)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"folosire cu allowed_dir; adauga /file?hash={hash} url care permite " +"utilizatorilor sa descarce fisierul .torrent" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"tin torentele moarte dupa ce expira ( asa ca ele inca apar in /scrape si pe " +"pagina de internet). Conteaza nu mai daca allowed_dir nu este setat" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "acces scrape permis (poate fi nimic, specific or in totalitate)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "numarul maxim de parteneri care primesc cu o singura cerere" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"fisierul dumneavoastra poate ca eista undeva in univers\n" +"dar acolo, caci aici nu-i\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" +"**atentie** fisierul pentru iconita preferata (favicon) -- %s -- nu exista." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**atentie** fisierul de stare (statefile) %s corupt; resetez" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Jurnal Pornit: " + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**atentie** nu am putut redirectiona stdout spre fisierul jurnal: " + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Jurnal redeschis: " + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**atentie** nu am putut redeschide fisierul jurnal" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "functia scrape specificata nu este disponibila pe acest tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "functia scrape nu este in totalitate disponibila pe acest tracker." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "functia get nu este disponibila pe acest tracker." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"Fisierul de descarcat nu este autorizat pentru folosire pe acest tracker." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "rulati fara argumente pentru o explicare a parametrilor" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Oprire: " diff --git a/locale/ru/LC_MESSAGES/bittorrent.mo b/locale/ru/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..32fcc8df527f8f21a67da79fd9f1211927f0303d GIT binary patch literal 80481 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

7zMs<7u^yM_p z_X_ua1|H0{kA^g-7R&twcp}$O`N_o`myrHV$a6BdEyvHf_CfF-a3+U-7jvxBeM|X2 zzYXUHQt!ze>qu`#ol40JI5^?hjK0cK23U7XdC7|`7FmH+}w?8J94y;)^CvGO3ptK(!F+- zJrN=O1=644e0{jSCFjTS{GY)Y;o4MiS~zb3CvorV9Md`UOF53_IGp3#9L+qx2loyJ zzZLTA559)<^Wg3r?;zjnNXMW2+@&0ES_hayj9QsWqzaIG>*I&z_-&}Af zE*`;wdy#Ajz8(BRxc?3E6gWQ){E4oG>syg;49V+B&jp|4(C;T46^;wI{^gMOB+}pH z{QKZt;PxCF@%(Di@%I|8wUU^?^(o=vPVpvqHphF(vn$7$oL>(1a{MUd*_duN9LDv@T>mWBp5|P?Z9={aJ(5T)v!1YgY{D}PD z=J*)rJBGXwaHY(LDsbU8&X46dCEV-@*vB>fIs^Wa^NHcS6+DUhwgZo_T<~kSr({3J zz8uGgHeJQ}$sF(E(C+}Qe*ioZd@lFg0?u#X_=Dx5Oz?N%{6((+gY!K?nO&q$)}pIUGwk4(8DBR*nZaR&jK59Ki9P9L*eK$)o-DdxOh3 zPUQRtT>m)7ZXCbn+T$FTasD-qaU8QbR&Z@=ju!I&ll1utE*D$8`># zLi$`#zx}v2k@P*_A>enwYq@?dsNXdK@8kSi93LV50>?tm9|pGspW`^5BmS<4Ctxu= zzbWU_Ic_ICn|k8!7vcUBT-Z6Bp9*e9dMY>;+?M?FIR41_nviD&=lX3ydN+>GaQ>%o zPuJfc&WFJ>NN>XPV{-MrJKX;&IFsu~g?rtkpW--(^iANgJiDI?48LD-E&iH0-V>^yj+}j*{2z)Hu{{iQFbN&pd-|pO>%kdV@=W(1A zt{P?rG1{bBheQ9A}VL9#Y8%X;L1BE5U!Qwz#JiouE z&|4TR_4SsMl;8NVi$qa5AUPr z)48V_|udWuV0lXPCOTrMmurriU5OYGL*K%sMSabP-?l*&+OFfF8ArGa86H7rlYj4h9$ z;DKVHYdM6X=jGOPc3--@ZzwJG4igy|07teKf7mWtprJiEi%V^F>_DN6bTbM2wEDS(Q z`sC?>Vqbr;H(Xe-XlQWIDrN-8GBz2@Xgd9qv8_|O$Bs?A`g)5KMa+TXl0vDM+}xSg zE!H4II`0@pJDrrq1oZBmkc{n0I|^L^QrM#t201{blzM4xxwA0P#Rv}+-!jA?mX)!q zu-p;C4wO2E!~ub`#`hM_ADqt9R&d{9WiJ;y`+B?V3AnMB(OTx0{d{8D-!lY@Qtk-l zg_7cfFO^vWK*7_;PM+G8F6tW^P?erqQtG9Zq)ilB(k`0Bh>}E@AXRrCOxKfTV893A zOQfvO-(M^sNep2}kxmW_4D}DD2;!1bS?t@YB4>6EmX?+VmunQ2o-;7eH=vW_i#`3q z1w|V>t3R?O;_V|;P8X3)Y+M*jo5z-$&+HrO=`vpJDJ_=Fqzn7Re8>-^o1p?tyltpW zzFX6_J{pXQF!_kGG1e-iD`G1>7RAq4&)A=ykZb(xAUaYG%SuRO2LxJDgfj*^7sbb* z?)c*ilD4!66L$`#L%q7t?8EcWvd;ot6i?`i4w?dyr324apnr83`-hUZ`v}nacge&Qf;?A?YqG zEg=h5QrcpQnt!|cpt|Zc<>#ShhKpVX_B&ka)Hy1dC@DpBl%?z`lz=5k*-(l@ z%yvNG{3R4FCHIyFi#^L*la`jwMa9m=?ND+N&6zA7?=B$U#qtotX(FPA_Kq7wM~f@0 zRWKK-a(s{mG{azFLekpWnwEz;Q6%N=p`K)NrU9l%b*Q;6oktAyE{3Cfk4k33Da(oj z=~Ao~1}*LD)~IUimKI7q1*|}8Gnx7aic3psb)eLho{y%hpsS!#5CoW>;59CK_Hh{^Vh}q%+t)X<(SsWZZ7UUNgIv7U)@5 zG7~X8)`pccq>0_mGlNOfbF#u}yXX|v6&aSHo8enTK8RfC7HrZk=K-zOQ_a@b@44E0 z80s{rq$+)|-9w`C&_K`hWF{<%5)x$>;)LW?OyN^Z!FYA-H?7nc@# zhS0K>N6g$`z|WLBf%53ZekaFZ7L#L!NR?kk0HW zz@dw(BH%^{&2h?tWR`KH52i_wRExamaL2kMtta+?v85XZ#Kg404K}UQeaTtI(oTg% zeT$LNS;4LAb=__G`g*#G175WGe8DBIa!lqrhQ}?hu}6YOy@UZMPuCgRu3VP;H@1|f zr}t`js#luHVakU-aq51FMjleozs!~uI^QycaZjVc#SJ=N#(A+3LVPpO*Hb249JDU( zoqLwMC}h7rDQmU)tR^&)gQ3ChmP2js(VEU-wt|AtP!-BD8^JCuFC#W-kscT~nRm_z zEgR^At_(*MT8VRHWwcu0)sE$OZVW`$rRcXK;PTWpsMhhUg*AO}CqHyF^`64u4aL>x zh<+O694Z%c`CZj8v%z3?N&Sj5G+^@D#FCk6pljw7$f;`^SWY=&kV3kw*pYS&FxwHa za;ijh2<&Zz<~xn0?&8t%P-#%+FqIVPoa5i0AXB)6&yX%GH>QBIsSqrQaEGv!AQ zUBSFcS~|8@a}vp`T;ZB#;}0xBFZB-gEO(vI*Kf1unx<*aSo@e=$#^SYcd#EhN|=%; zbZdUzjpKsB$umaCkAg5RNALna+GvaW^SR9iMcYu*#(WF5z#tFy;w|`m)odzSJml|#||W3HeHw%E)4Zsa`u9g(nAhDbg@DjoKNaB zIhiuG{>s#Y4)#37&SZ8`$^`MA9b*R}T(CD+>L<6<(sg)xa+u&IA)XMO3Dm6Y8E#-# zv_?ki9BXRAHW3xU9Io!+z!`XF!PYGqElX)ocZmDYW{kD{lXf&1YP)U|MB*8Eir6Y; zXRH@#riOhj^{GE&$J+H){tZ4(JW25h;p6N^+OBzfc2^cUOCfK`oGHni`SVYiKfO7b z(>7C9C``U>2A<3z?BbgK^!X>LllV=+H8r6@d5J%!$Bf|~nUgu1*fsVM*7iHb>ZVzl za`byJBAUi5lcZRATJyCw+{FlVmlif$wibGAdnd;t*pSmf`a9So+L#wi27jP$XyKx& zXHaWlT5~15!sm(|$*~eGaa&E0Ya&z{tOmpeiVKH&3aBD7XHRq#doa6-1;DEA(bxO^ zR=9`F=&ovV-K5hI{Q&h0_fvrFNuUCgiw`r|CgB__4q& zYXIw^@>P?aXj)@lhNnjHA!KjML;W&i)XEcsi|{OhDH!p|abwHlB8jpmThr6cHjgWm zJ4+?*GoylG)TG`L6JmxN1+h%Cr>;pS&umjX+&d@mF1C?*pQPt&Qn?B>ML z*SROxJVvf*)1x5dBC$RXvUY5!B2%1Z^K2BwFPTnu$H|Hry#WVKPfOh|uTxgnOBF}J zo%u&KDlBpt58FcorA^N4nlcnr%e@hHUt{Vz1^fI)1cp4;| zHS=_f^`rTWZ_+8&u&EetafaOJj#7^Tiwq{_d7x@m6{Z^`ilRt`#lh@J1TJZ5S^MxUy;rfHjW$&w*_VPd~%Cj4&GF?~eD>pb_|S<%Trmz>1obkvmrj?0_v`~Pz5{;=S`93pFyig%+QsOZ zq^h}FPEIKFCMOV`J7K6dIq{fDWt+D684YN)P*ygT@#_%nq+;*F!9~eQeSJQG%;IzI z!Y8aTL`6d%Y{enCAM+T`ME~GO(BnWQzfz-t>*k! zuCN#gR%d`}v+R1bt5{CQy9^b2CQRoF&6a;JCnpx`vCL?DmK2L2C>X;VR*^*{p@t&v zvMwI+fhragRMa7a*4#{}AtP4>CDEF;5TMi83RG1A$+KoDZZy$Um5s1M)vuy;YQoaw zlv&e~Q#uEeQ#6mwY=tKy0ovt1T840CI;p`D;cAxq0u$L47)LjdQW0H_jD<}w)Tb6u zTU~r}f*#GCZRks}re99gdKq)B3t&S#Cv+1~Tr;R;8QgH2t{ELI!K78H$j)(oN@)A> zMIX+EH?|+Z9Z;z428uaPX~@9u_IH|1rIZK^x&j4j}Npm?@t^^50)R-b|U)jKO*wQDW8&zBMA8Fg7z5xc`7g*#a*owUu=Qg30=i}sq!C`t~{otxCti&Q2 zuw;H%5)6n*AYjo$6nnwh3)<$)OKpC|pk%uQ(&OfwJZJvQwmGwt1%*Kl7^%b@%1*Ml zkVQPhrG?e|(!#NJDH?lB%~-&Sr`C6*hn)mvuF=N^U4Sn+#NrAzwK}V0q!k$}r{}bv zixC;<#M+o|q4IPsti`evwWvf!DNqXLf$q`(hR3V2*n2~Lw6eNpm5%qirNE&)rD)xR zMbHu)Xzk7C_A4W+w3pe7&@|O&8MH za_i)&tnYKxBGihSv=BLB>3WgLIZ9Q_Lm}EaL;03j*``7)Iq7)qU}$fUfMfyOn=I%Z z>gYhpEwBJlumPS@1$caM5i2qTYk<8&;!U_lc7rBZATN`l1-KP$Q}}-pfq}MZNn40l zmK1!`6B5X}r^@6ye~<;CVtO2bFAS!%Wa$Er@w!ULwv@08)d^F!CT-0B7rRQf2@oyb zoAq#bTeG3Gu&_|V=9HbvV~B!qbxd_9$rvrtk6|UccPN&%H)R&nGZ|OyNXcoP;2wKy z%|<}0USa+!CJa+hU&@gt9nYQ|b6c?~fi|tjhH0*rtr6G`?TLtsXW0f9)XKsVfjqUz z*4Dfh`oXfhD#BD5C)zrDu8remmnKv<-bANb^nMkMO<#FygA*`T{8;DnFs9yW3^2>2 zbS-4=9l=3@U?>wU(HRjmBV#GZR<~=5Z7dZ<>|x9_dVWl>Ei7C-pLvlC{d8)lyg1Qy zdC@)s9}jcVyIh?Y6s^~6WU!Brtpa??mwAU%{8`id+DsH2ca4b*T;`hC+_W`ia&AhG zfCH|BhK03qUrxtW5-*`;bb>$p~wI}FT)bHG0}TT6$}%702r6aXSd=4 znMbEF!Hw$eViQ=L#-g8x;OsHXsLI9im|({xn?p>!2L^|vV4N>Qvw>C>jB?kX}(TDELiYo|Tf zic2ve^qU4-6UFJwv!gW^BedFrrjrM2xJ0^JghRTucoSUMIL$LZ1~S6pDlh~U*^(fq z)eJQKRrAbZDo2PrhL**qjF%*!?}AUsP#{Ng;B5v!K_ri}r$B&LUqI~~P2~(F zZGC;V7^vQtX#`qoeqq@HMRf(w%|-w?-5_re*vu$RT9Km!%s zOSLHMQA~a9&Snl8m(pO;HdIVb@695`XV&Nx;ns`^HIL_(yTlUm zvX>NakP%QA%t|THIL)8y%1L}PZU8Oe&@k^zjUBZ%NJwo5{wO zlQT+XV(hlhQj72XP;EwX=FIsg&pr9L>FF#SI-D)r2S$lmbOd*=nHrZegAs{saJuoe z_gi4=a$gVA2Of-e(+8#g8Fr5PddniFYYHp3_AhUIj3vYBOwVWB zGRbj_M0A#DY1TQX*lPg`&dr2)_T2e%W+B~YpWEC#!fgrsf^$c^Q@wF+npYRDCiE{k z+HHTN!O$R3W|n31asp_@q}`+j=F-+g1R`nosa4W`EPBoV_4y|ksI#0&;Xah{_OTM2ni>JRH~Ewc-6KBWh`#{*Q7bPlQ1Pl2U-X)tcQr7 zk8f)`Rr@2)w-p;Pk91-T!sT>gf|o**OeXN47Z=&Isi{%0WN|`cxr$x3(m`_yzUw-c zSFjzniGnq9sXPc-wX{+bEzOC%dfOi5Q_Elu2?%C4sF(;J3$kV3Y1~3P2wU4r}|M!M_sppouKql|Q28yiQvu9?}0 z_xv3Q2BrRPb%AB1a^r?Idxs*-+3HI$%?D%H>`wa1IxJ099_px_DKGd+r#SbhfQ}K+S;5BF7J1$>3srn5<2cmvdtt(2zS67Fs4le@WrCnL|C#q zS>VA^Hql;dbDAwI4wJh(J%2%)8HmEtJ~{tbNiDm#&7C)={mhwj+uZR? z=q&zg7krBwuB~RWNg+1Pl-2Iz9ZcsWA9lCbGZK@!uxFnESEovBGHwaJo~*tZByD;P zug?S{JtK*mMtg^rbkIpe#>zw{aZhNF#TmNsuCXkxlC=1(ZUnEfIvokdkyTeKD=Rvx z5fh!RB94v)5qSm5_h~ScSP7TZO1zqG3I8QLtv(&it#4f^MOBCX6Vm z3AuuNV0{9$6fe@YY#H4wCV~;q`O8wka+bv&8WhC{eSUzQl+lNYX6N2NtC6U2Ds^0R zI;tie%3Dl6>q#rkEAwg{la{a(-=oXf>^SKnV#8>3L72Fs#RlI82lhmFhS5@7!^fDB zvDsU00i6IP!xgxevfN*wLB8U)clDBU98P7HN#1`xZLeDtwaqKbGROw6wE75~o81!^ zkL?OCdrkBflI|WTEVS*%wlD?HWqGnjQ9hXzDqy^^#OgEpfhGJAZYYrKmo1kqo0GN| zd)#*VqIxPJFR)vRL6yNI-ZrE<(qk6Prk0LQ3AtW7S*%%xEQA(RY?}{J4Gd{(V$nW= zt<(K1LK>3zdavkxN~;9U(5@yC>--jbZ^t;(`l5aO{w_z{$g7wM(jtzvmwZ}zBC&Ez z=Z{y%q&|9zEp|29dg8he8tG1cukdG~&qMDu1 zR#6eha$n9b{=dJ8yyL{ao}zCqm#Am&Q>kyLsR2~FN45&K5z9y|Qf0nr)=AS^mU4Hg zdTKAZ`hYRQZt>7rn)^kOq9StwnN8Sp ze_1Q`2)S5{p{m(1X;Z&)=Rlz!FEUIzGe;`E6%|86P$j7I)+56KNHCXF&_& zma@ez9X~lelKa{yY!6JZ`uo^iEk{{eNAu7ed#9NWx3}WrYp2xH4bPk4@Y0HQpw#a7 z3Bsg@Y}cQRMBdZ#(HtoDxOwW;`V^xDd6p>a5vBg4rXQg|=1~^<=3Nl2;|KptP3_k# zUh8$l2eog*JaNoFq-7Sb!M8pAiP*fa_k!X;-$YyIQQz85Sr9fkh4Fw=(bV5#&#+Z$0^yD7gh=yX@x?-3m8HkISyNo%Qu z>?W>2OG~N0H8BZPNW?@rF1CzOjAM*%jv|YPbhAM;+s(D?PDc#;8`*emT`$gf?9U%n zps95JgzN#-020Bd%dnf}oAMI(roP0zX)kf_!0a9~+A0q=G~XK0iM<@m9?062U6J*L zRq~ml%U9}3U=LWQL*fS7=;P7*)e-mfrQ;RkWu5M&-u-nSrE>-XNCE0P3^h%`4BzLG$Dq_^a~Z$I0jW43Ztp1 zH9mWzqflVqn-6QX=!Sl3YUOs=`X{|H-$xln!>Z*(y?rxFxpssvAC@5Fjw_8J);xEZQ0dFXvfa2rJQNkpD%3qD`H7l zqevHPZzLiTb{r~JA4As&Ll1k&2D7|joz|6yFDw-B^q zXDzQjD`t&)3<1@uj!%Qf+*)5vnXQa+1${;c+N6UG5_L0Px3r;}V9cee<=rqJ>&nWl zPByExTi-1X#eCgfY_eg}<{>Sk+Uiw4cO0Y=FEZNxXC%@ZG*UIzVD$i_5SF>LTBLbV zXlK?oTPP%_zcWUb?2gYyl4FY*$*O zfpuo%Vum-#0&Y?zW);b8yJV{ano(LhkZJ1xD$2Y%t1e`3pfS88`=PJIh>2L)jgDs$ zs|cin2jK$dWF1BPB6(Py+65*yo9o?t^+Rt~)Rx3FPkS0{(rhb< zs1R{EW!W-@JtdZ*6LFyoeo-mgQZ2#ebqUG<*tQi76CA>U`%46W;}I|CHi6yO~eP7+b!RDVm59n+Ei974WFXwO~{*6Og}ml z*fdHr{k+_n(1}Y=7|w)~WsQ+z{|6UztYOY}xOVot;Qd9xZxq6EfUkwDuV08Pw(kdY;@m%-TTl?Bg+7(b#! z*30RD?bl=sd(k9Zw(ZSh3Cs9~;ObJOKEKcsc~^Xb8D!-9rOL%^d56 zC2oI*gmJazhwW8#T6&xvrEJn;Zy}!v(P}-BS6Ulbz@neo1|D14ptjtHI;smC+B?P? zxosg+3t`jTIom?ytk4UlA`=p}+btSwA$S_zjMsj^gm7#|-|E7O2B$h8HQ(XFo1i99 z)P6~HQ*EWj<%7W+uZb(G{b&@uk?G-#PE8&)>7S59nT(=nKCyZb=?yg+GI`Z$myAHe z&7po~I8mr9x@kN_PduKQJ&>zGVxm{t>(ptKehU<4&(*8l>XcA(XB$d zA6d*AaX^e=NI5b7#Rr>JDe4>qM`?zJs`<{^^rX6+YiwX?aRevGy{Kzvrj$L!U0!p^ z*12suu%vW;;_<1BIbKa9C_4F&Ty?z=d`c7Slz>Z;#xknLiUF*42{gXGl}z?BgnM&C)~n78rP zgp9`+LVek@tg2*P$X2LZ6K{K!rKL5^$eAaCYOo9vEOe=yAEtC+XcLte-NUM-)##Wd zEBMX?8?8VTDR=YY^d7THB+3MnH%=Gy&H}toc3*sogwl=4f%Lw5HV!IfMb|pY+u72`EpwNoL^! zjXDbI8q@Ta7O2VKoUc|CSqlod3Ihdig)`nT$|3IyyRZ?ZR+>pQ*OmBSG zkI52yXTb& zd>dI%EMU^rGSu&HrMoN9;79PRZvixGESDL>C@&Ya11Du$tW;oF+6;G-7|n_n$v#sh zD<5vy?8zdo)03fW%`WaNWO+YLoV+%5GdD<1i_zBj-y=tdD^`hjo=#E^XUGLQ@~!&! z?Wz#Q5nn3MWEhVO@RFWuCR=p`M`&+#An>3<7N^a3cjEu6=!+bs^ z?7Y!cg)yq`fe(fhRT2x(ljv5(F@t884p1~ig|REwzyBuE>-(Mg=ggK{W932kDt7*U zwqB~e@2pAN9+}Lpgu&pA-hn>NJ@Nh()I2W4 z)5D0Vf{}8nx3;8W9x`3lg*YH-eByyfR=L=$Z%!1@o%*ziHdzi7oAtJ#eDapLT`gyj$-^upihu zwRyh1Io>j_ys*^Oa?H@ea!VU4*3GA$($+Ey!=gz*%WMqC^mOXv$p^Jenc6aWYC7e> z>C>jQOg?n-WHPqQ=W~E6yC&b1mMK%x$p=qA@F3535-S5OZA_xee9)wiFXF(Fc3wOX zkMIa+GuV>9baZudfVPVt)g0erZ)qzQmP}9Q5Ao$s9QY%;`Z|y9DRlRp-^$w8QO)z% zJ5ufJl-9}3vz)D3+Sq18wdm_fI8CMA!*M3{*`mQCPj5T6<dI5YmkeJtd~szR$J(^=U}bIPk+iaUctz!*;Y%t{kbIIm>nm&0%EOh%hp$O1 zYlc_yBv&e{)8UIKUnWUcW79`v|2)qQ6hPXFBMl-c_#Yv2&JtKGq5zR z+(bP*U30@OuA%8GhObcX=}`*#Xa$X3FIo*>$=8gnt45*qkmYh~@VeovQwRx7X!7I3 zS5_V&gJ^Kk@HP74F@>##QtIIo{QD6rTo=foF;J&PSH@!a%2Z^h5i5KM^j&0Y+GAW> z$-Q+Nt~FG)RzzBFWO~wQ;$>5B>SJp}elnJN6@_2IAgMPD_u~}*#PB7p34L6zE5q-y zUR&|&RfdLeEyY8T%IfK~f?lM<*U(PbA$Cv0wA#AxIE6gK@kF96kTijQlK&#wLdn+8 zHBOdR(KQUW^_V_A?7gM2muvhP^xA?cNQ9xysg=tk#-n~^4bNO+4Tcx(&hXXN9~wl> zFmG)uSBEb&zjPz-)>C3TZ{)+qFzO-$KqVAA{7y1F3N0ycpR{r#jaUJhR#zSuwcu?% zJ6*SK=dm?DvNqTh0g)>;gZh!`<03duiBIz^slm}`Fn&BeypqX@KKg8;kRjFBj&iIuE_r-?7s_K#b82Le6)67sUn#Uw$Sn%y^gs%Z~1W>O2NcH{NP z*TXAQ*XE2-UN_@Vdl?Wrr@$cly2@iBjhJ1;_z2^{a7kVsmz@yTN+amsi^*eZ5*<_{ zIjb2P={cm@n3Qwcs~Rh}!EWo|egxCfcN$~38S*Q)id`sQ-FcLJ>y$6bc_upa2R&)G z@|JA1jGgQHOXvk6Y@JEfef39e*OwbFR`z2^EAfLM2-igMa zA(y5iYSrvo3!JN?E)}LaD^IGOEvh9`nvfPdQ)en#;;_+d=rtbGpI6Q6D1l~UY%~Ds z7=#uXB#GjVy5hLaMZUI;@o~i*yL}MNPyx6b(kjX6!Mr3m&!EqKVDc`)~kObf--7_JFMzVVc)hKaFN1E?ZwSSdgi zV!|YyT&B{zv4yqd2O0llwojiHj|vD*a#aLps|dJpt$%Oan!`1Q`y;ZsV)n?a>t0?7 z4Yn0!MvIUfkxNa*{MEMDhkAqU6G>zP;H#Vm@|3k!y>JyQISM{VlxlJ93aSh?S#Fn# zd00al*$s;fM+L)YuEMKskMxF(h=$43MKqD(_F!%6>f11Fp`zGLGG%559?Z&$-(TmW z>yok-XJZL^gWHm%8|+tBthm91Wj(%>LOaBk znaRA3;Ya^&k=wgiB(E zw^ms{!l&Y4SyT8jIq#H+!FQ{NFEc{q_HXla6l9ts7bdd|7*|?fPsXdO9bKJDsO#*B zJw?~!NU!xz&oi3nXo|l=?M)`D;HnES#kJd$@R-OfuT8pTO>%_VM^_%Prb#Av`lzIG zy$`OG0aq{*_+zG0(32VtQCc*n!W9(dqtBail~u5SjViu~dAUA3X>J~@Dm8#Bm)}^h`n<%QBmrRIU{f z;3RQ_Mh${rY41cJ&B4(%k0K7H5n4*g#cKFcBVG_I=^xP)*^up%yJEhVt0y~^5IIjO zJhB#flgwCpDOo8LBkGQ3z5)R{4k42-zsv z!W9%`J}#4skt##-AZlKz$C_#Te`npdLlsS=t-cLd(DAVi)&l4w?GzkPvr6=pc$O4m zu!+N$PS8-lf+|oH4U~s?rq<-|`=Bz8xq^+uMB*oG2#hOb(4(88(FpXH?qM{giLayi za6(I-$_dOLCqDQD3^0M08b%ymslS(CL)PHqiivZvP9%!L+-dSDsw*TjtyL>7H=w2p z9$JGT#PB;uNq3SXSQR<|mp6_S-pWNL2eOWqAO1=8hc0+tleAaR>W4)Wx6_(=nC6H5 zxg;tpP^$TL=$iAj^}%`EVsW)S3QYboC>G?c*0@;@hKVXtDf;`i%AE=E<*49YUu;lA zd1$%eK^snKNO6e-^GeY=?O z88nI1!Xr|UD#C+K@*-+Uph2)Doop;@y~P~{I8~hO>@bRcsw*9`Xgti>#2bw4Z@DbO zB-MT^y|33bue=g z78P{=Nm@(uZ-&J=Ne(x1Z7Mr+L*#-4ccSuOOVB1-sM4q-jCj+Ro7%$9%}*a534WpO zq1bG~GJJ6s`Wt1y#L3nmY=oNfu*c{aEIIw+cPlBggo?Uls}u#zE5zS?d(($j>4CBkG%c;49->^#U^h_q?*g zj7Mat-HRSU2fI@wBGGE|t6xeFXA8G&~>eoAHyp zNikyxIjJ92jZ3_9L#(eA922a(YRok%soV)ye%|sg|ch%h*r30?}Ve*nO3(* zQH(RfkrH%~kuPEApQNsv7^fWD)LsbcMk4x1yE;75?RJq0r^%KB)M+(FrXvVME%UCc zEdn;wpTA;S`~hag*TFj1@>j4}H4`I0^o7$?6vS?hTgYu7X&1YbycA*g5D*LKXh{D1# z!o$hK+^t3c%^RsL%lzHUos6^B)!9D8`nqfKYjCI&K4H|g7-@@5FvrWPqb3tFe5WjO z<Do=SnqBfv~kwD4I~aB_pDM0uECp;u&7G!3ioj8q^qTl38r(A)NYp4Q# zroIrutVYt=tk$qpAtH0RRwjlosW$Z`+Q~5AT(^k}W~sk4O7OrKp=O4THt-R)kd{4f-(ug-`{x=R6ITn6vO;W|t}`%3JKIxPXSL++fJW z{z4la4o>JORpO;x$B3&rY`>@p5l|y-lP6<3H~YA9-fEZz*J72XFSwu*V06h`Co@hF zYIlvQ6dOc&BTL*S%d)%KYxaRs0BQ)1UInMIy$9)m2o&gxdFHO#rW{JIJkp{XCA$Pr z)p~vAuElzV<5O7;74M`qFdZFt!$UXRH=}$pnhF<_neG!0)cFk5j9-91fybl`Ve-Hq z@ygtpth1eU5=?u>-DVmKX?aq;t=tu_ZFg(x#~As^KE>zpEc@3jY(aRjh*084L}xuk(Jf7 zH|j~P zSD4(2(uKMmmU={7sbvM*eXd@LZQ`o7~uvc`wpj}*&wSsX(Q7!76ZR~WGk=M$w z)s!#u;xvf+%%wF#Su{a=7_7VAjNz-%WHnyp8Y>UwI?0Alg_D52Zbe8mx;$=fmRSVz z$mxJqG}&(GTUJF!+0+oNC1Y(HL-@$GsSzXVw=G0lq(ff10&g#OTB3$=ueph@LU zS|!g$b6F9Se?%FDT2{y@2~kPLA_l~33Xrow9%)YxjItNjtjMD&e<`uWc=uuLx0m8X zq?5`GRwTq0Z6QJ9D2pv}uWw|dC!1tJF$jX297-?+AScy53kH($mhzCdD*9ox8@!fg z3J8V8cct_#Vr_1^TMtP3DIm<4Z-ztbw|_ByT70k%C0FiM1fGdH^xBo$V)QO*JbH_=%Uoto&l^tNiI1u+b%%TDPi8RBUd zw(158y%6JD32de7Dr=EPPA+CUz^ydM+W#_(q7618E2`^AP==}KOB77QgAT4bqSAC+ zjH=8hw?^Zv=}G0o(1dx-&BIq$9(SPgw^Xhpn3Nw*dwHmO!=%sn1o|K?w%8`u9XC-m zh}L4wYV^TeUN5y8@d%|}55de>xjHc0tr8SEQen2m(D|J~h7Wk3q~?tb^Y&!D37+KN z-^gE=s>(uiuDP-#d&;Vu5oj+x24~dgti7A9ImHk}@b9zNruMIuve5e+m`rt69;g(+dNIDZTfTsl2Z$03VGknXxVu;t z1f9+95{8tR%`LT(ZMKXeqEjpl!4TzkJ=d1#Y%jGCcEan)lmTIM#Tx#&5|7DPY53(X zvFxw?r`)g6;op)&xoS}V=)D&G1 ze`oJL&Pht}HPe?@%RD=mjIzs{kNxAD;o{Gs~0_IGjWDO#VY_CBn38;+3X1X3Ite0z71 zYOcYNLSt9;Kfc@TT+g`|BWVbvIJj0Ok90~8X-mNBWbSNHlOnVW*~*eP;f_@Bq+Aus zePQpd#jMpNni)eDuy8I#*ql}>!Y$q#+r>!AiFjOg8iutClF^2X(%E4q6mlYy!Sf0i zv<;Bn8jItfDZ(tzBD%N6=qr#u&!%a`N=+?Za#ctLHsq`$v&Sf`YCJ8uMtHa0uZHL| zo-Q(Eg+`B^KY$T7h`sWM(I&Qxi(kqYyK;XvSB2h;jB85jJcto@1_`94ndpD#8Xpg7 zbaTR2xYyLoYf9EqZ7T`tOWiWZP5j~XuRInUt{TgO8>zp%Th;dFMIQJvyvVy6>&#qH znj75Hsjd2}z4Xqe{cc|HNt5WkN?k)6Ib;uE+uXm?zyyhL+sv#+%HwQrDTD;$YwQ8rOL|XiNQWeypO(3PfbZw zCp)qXbq_`=)y^^MnKru9VtY9+*-WO+8ytb(F(yn{BnI|X0>(^APD3Y`Puzh3y!0}z z^RS9>V+zxtI`As=2ck_itS5$H^Aho7rg4Z$s#afO7cW|V^Qti^T8<*Gdr^`CF+!*T zl@pv6F=%x8LtSLlUcE;#OxG!wWQ!NXBw5%k?Nj$Dh1zH@!R36sD)r35#_Cbm!;@2Y;g^gur2-W0MrZ~;fDHVjyT8~uc|wmy%bbG?(Af( zQBVK-qy7p=|0?_Rst3UwDGYEn46p@`-zt2Y+%~viywD)EHyC+EVA&fZiHFN=m287T zgU1v961Y~?;8L-Mlrj21u_^N{Nbvf&g{oRKg0i)0lU`<%g+p*dyUcRk?o6ngrUPIN zj}0TuSx)jW1FXwBiMGexoL3T9aIxDE-$$C6?`kH`ryr6AYoqXF_F*_&gOrN0F zO(Gq#jzF3k(sT4mPE`;aX~+@hurli_cvSIu;WA+O2c^*FX&k5bcvOE7D|ok{nqY80}Cv~La!hg+9(l`V!%ZImX<<~%8D zinpM~$#{in1DRa$yUm)11J%MMj#3CwGk9EMw`BrkX z_H_xZzl1+uUr+69x)6n`PN4D)^GF3(Of`t%GXlHoSVP`C+5Rt}^(xWWHLw=F6e1i! zv5u(UY@{rX^>UwxQwHec(;u@S!`Dz!T{{>nTW1}yH5$em*3|RTfZ;_0pYB$7$%b0E zPqEeLtu1!vw@2D!BSvr8_=3icOE{5_vJGQ_x=nUrRW8(y)c9QTgO`t@_R&83Rbk z$)T;=L}e5c!CH(e=rkFbwe-<~$~Im+FN$XBnlXDHgpjp?JzSq5U$S9XT}777*Ybg{ zYfoU3FfoXX(5R~sKXE6;({3?n@P1T*T{JU4d}*~ZF@qMT6$9`u_-Ujb&#^xx`79#x zES5TMkNMvi&e3{nQ}=A0kZvGgkWK0(a2$H?{}cVyX|I2k=y~nLc#L8~tF<5~c%06= z*|NEWV1>z*eaA#nRapniT`zAl@6VWGYH(9!ysF_Y^pzAtZIm-}tTioI0jEpVnxd9e zp#SjWLr8Lr{_1G4JO=fb7fvyq3k$1fh@6|GtG%-Pax6D8D=CHOZ<8y=6&%ABnG9>h z>QHB$mggZW!Za<7Ba~Y$bJp^O{CVoeGLUo$cl0l{wB*5isDa0A8bwZkyg2#(=Bsjn zMopW_pEg*wthLjM)+bCSM0xk_*-Sr>j7Q^OF=NP<^;-EW7ko}nezsXpv|m;CH1LI~ zS*?synyq}8!I#5s?TgXl{1A{2%_e;<@bPdSy|&iHX8$ol19Xlx932cmUAg~V z)!CQ%RD67a9`>(Y3Z$v_lCXp?Os|<=BsP6x>VKzMr7Mi~bWlU41x`(K-TcX^@asPF z@|}wF3(FSxAJw8}ks{A}?r|v02jg7iU(XBV8HK}WPhCTNAFZU(7%#USiWaU>h*tsP zu;AT z3a;1Ku2Ji5toml(^;*M#_F`L2o3uuF8`SrY5SY@i3E%Jvyk$ixOl>IE5$Ij_%{`Qf z&$e9{HU1K?C*93N=y7SK+fz97eS`^7Xjx6M@=JNbS{h%qabvK4DaSZo`m*=Bum z9EGICY31tNOMNK7YWzSFBPUXli07AUkLVcJ;TsyFL9JVECJZMob#7CEikIXps4oQ6 zQHtSars0dIH`B>cZ|g;*7UbX#)=_TZxTA7ydJgH^IMcOTD|fY2?qPZ5J(c&4euEbR z({s~vU#cl=6nXXKZurX*BXrWp-#+{JHpFAp+u~U}cOH z(>QQVTLf%)VIyApmnNVf#Tt3LO-q}o2mMoxPBGRqWO7B->nnGMvl}@NpYz6$-He)v z(@7ga_ows~UTc`wV*6B@^UNlekb?416;0GSy*{mK0Vivi`x=BC^r4#D%xWnpV72&K zxt8P`_5|B2>vvMZ!?pnlwuTd3Fx|DXNn{{}8c7<55mzgdFA`LminB$L5G9n!iRFmI zn$cNV-Xutsd;dfIGZyBiJOxB3CQYUI?AB_e)6BpwCDy~&An0nSRST4wf!J0c#?Lkv zXXY>)PVHo+skfPCuZtX0Bh9x6hP4qL5)0TsFd5r9g3ZH?7|U1nO&YzN^q|ye(3Rz_sPU6Pj4lRUc)h2gpKB1IB45U6E}G zP0~kpwA#iMcdAGDEJZGuBXwn!Lt>R8tq=Q-7zqm$*kDUXshPnDe;}O}$J2KHn1-Ta zSHTKq-fImrZG#7Eb+7x1V(rkN7)-Z7Y|VgEWE9RZ*1ad`rgf6P(K{IaPQ{ow6EU{R zX?VEUCs*}1LZdRPBNC2UZwG&7V_C2MGKc4xyFesBz^s1WUS4rWbLrFD!BSPS^0JaN`g& z!uFLulopc}<$i>mRo(8ELpR_8*JBoeGOe;!wNp*q`iEqXJNHl+s~L&vwV~EJUVA2t zuo;3cyluyrP3phg=`IcMGZ>0sIljZ}#>?-+)h{Wxh-96ZP zZnzQky!-hO=$dviD8^?N#Qu?ct1WQZP7@6pW!^!Rw#hTH0D)DR4IWmUHEa~{wguyl zf#>czuC1cLhZDWxjqbCFSKQzwGK-BgKrt+Fjr1NitI>r(n(L=Bn7>C8N|im!3JKc= zvlm+Y53>h;wdql=A<~Mu7at%f4XEEhmpIM%R~wL=j>fEO<1!`sSz#Gd8(R3%iVZnY zNe$c}?`2K=^N4!GBnBJgBy&ryK->>wgOZETjM}s~oQe?fcM3F2_-~3&skIC~lTUvODhQEL-A4eU^rql8e zxu7>&MsLT@K{cDArZ-jJ7M6@~M6_TW}q2|~8OXZlpXI%8g-j)A-CCM=7 zwD7CxYz^N<;U}`Dg$RW-OsTw53QCa}@r`kCk2KuYdz9d-8V{*83q80>HhM}9U7>4% zIyU%KRN#Iqf*EXXTsda2EYgGO3a(AYq2?cktN;2Sj3Rv0FSkO%_h|SmNL~lMDoTzh ziLHLdg&?L^ z34@WX=fX^Dy;;6+>~1Y;1g;{Nb^%$$jg>i@UMeBxt(~T+M7td0a+E3B<`2rLeJ^Jze+r{#Ht#Caf2j;+@iRl27) zQ{^(~r4AXA5GkjIYr}oDQ}GCU*V8(SAddJ@DzU6td$5Y>V*he>y7$T$Gr~q4TCU)L zqTRfy$iUJDF_7+O8+d6m>W=BJ_0eYjF;*F*$j9DXO5;8SO( zL=Kr)?eUlW(pp0%pGJ_?cm!rA<$oXvupiA~n&*Nn_Sk(l6CNvhv3mp zw~shhA;RK(FJZ}fHt9J1HSckO0=XM>VjO?Ov%9o#T<*_njI;Qj#+Op;)%rLAhi>v~ zG;tA+W#3K_1!@+gy%~+&yGH6lgTMfo2DsA2jJdx!#+XYLSEb!Vgse7~QU));SWm-X z%W6^;C;`S;#%FEV)x#|_PvS^bsz?)>r{)U-NnZV`zYvLB#@wn+&$_0iiEz6Akwi1Q zuCe`GeGr|JB`vAm)nI zURKw9u_^j~IIB?5EDri#%TW5f3!M^8ZG_FBYi}LPc9tRcXxcy&UbYU?bJON5wTVf@ zg^XbqWvSJS?xAQBE;A7<`ztTU+FcW7$jUGV!N|pL4~IYkJ@Rhan48gp3Ctv$G->24 zMi2Kxj1U?4Kkc1et7TVKhWB;IsUnp?iwMU^ zP%uPW5c^6H`~%t+rnK@O>ii?0=N)s-HRsxUpHu}Kybv^9XYIA-$M|^1JI0)AE~`Fu z)IlqsB-Ez&QHOBKyM=>C*MI!}@ppgxdx(2Oq;R5k4kGf8I2C*bs0D%J3J}SNJ|o{l zOozDx{AlaW+AT)p?eF)t8Mu~P`R&ka*oAD{?C39yp0+$kdt35G8^X8f*`mI$3z>k&< z;Pq$g?X=Z0Bf0hd%z7Tw{sOf25cn37@*)n+D?GROECFAj%*c@OSYSXhx)X+|YPh~* zCwmdNk&N@L?)PXXSG~IOW7#R^|Gy;vcO+S8Th@f7mB|rH3tzJmkQK_kE5#36bV-QD z((3y=jgq13glx)Plmu^@({G zerUm}-+HGrVAFe!th{2-46-jCf(?ZL6^MnF+5`4tU{CL+a4%GrmZnz<@wB8SqgsiY z0_#X@A-ohOoB!6A){Bvzaj)-=&Jjiv3?HUFWC$&;Q#(NKyR%IRzQDnEVn z==k*gj~_nyAVi$ri$zV#n+$$iY70PA&6PLucCGOa_P1%ph^5I^R*aQ^&(`o0P!Uzf zC9&KLFmPR!>JmAFGW&TZLBHHm7cIA(U*_zq#9f176{4+sxKlEt0D!cO4S#!}!}ONb zPwYA-$zUA}!}O-?yc*Rt1uzso&Ov>3f=oYQ24a#CwVzYzN$5byit5GU|TkG zPYGoK3q8JfdV|HdXhknsj-eXbMH;h+*BIa!cT1~X^z{QHVTP~cR1D&*(h>B_Z zh0*wFE~ye}=MYC^3d*8&hXDqi411edf!6kxRyoP>?QiqYZ+)AGsJ6cT@P7NuLx2h` z!Gl#qTP4JUUsFSgNc%_{uRZM&>5i0Hg@7*0O{Md*EdtfpO%B*pPu$toA7=x+_G@lv zcCem9yh-~l`>%C}vTy=ID})fp_F0CfO#?HA++Mk?&``t#d*au*FYd1st7v@e-N(#4 zmtepzG5v_hr>N|2=E=ZP=Lo1k2-pT)m1f&AB<%L^602cm6T>YE05;zK!m!kML}Ygp z(cpg$!?4xdp=3LbRv;QNs01zHD(u}7X!|HQ7ygdpQ+a>Q49g-f)HCZ81|F{1SLL-y zi;3Damk38|J$}77KIkNn$5G(aBpj*1!<~?dm_eAO10m~Sq?aG~=a>Hi7aq+S=v>{^{=_IGw(A47yr>qO zdVc28jyYjLmsSC@`@v%Z zvB#bP1atFh&%(=0KVG5wfQ>UEoRg9KYBVJK0*SL})6cEZ|eN!8A7p*nhXWY*FmHvBU4;%4cU2Hwh3dRfi0 zPue%h*Rn~@@KciJye{`?i2vDY9uJ?s_w>f&lL zBFEcGIrE%)`(i4gt5Y3_$+t z>N^JIKb1=b4G4#^ue~C|zqTO3eLCC?|4-ZrLZi{GGA?Fm03P=F=J74F=vHq;{ye6! zCA*B`aPmtX;ZNv-yTC?qXd^mRg;a?fH37D{K<86}s;cdOVMF4rE1Jxxr3=p4t`wqv zwbP?zVM$;Pd#V|qWB8tlb7m^B_Ds9IfU>2Au~YQ!z#CoFkQp2Pp;xX|4$Pa$#9Ed$ z;1!GVVB3l4i9X1v+4P22&4t|Rj7?Nu4g!rP2#+DE-C0)g9|zm!A~8KPXJ&v|k5$QY zV}4F1y2aUPS1kGldyyIl`|q`r5m2yz%!M;@k2*oJ_Ns6ok6CFu6>Ersp~{5(p+UpI zD~+5UVPZ%zM3`1LU;x_HR%*Xxq}1Xft){&u(X;);Dl%1*@j53eoCI61nsJ#kA}B8Q z)g8^GBlN%_Uq)HvN2)n*8^s{FO~pZ)3! zu4G7)6UaxI2LGpROlWg!r zdon~>YaA&y`m={WfAaX_PpXG@S{9+!8(tiLcKuO)1d}k-o_fhevH78-(q{oNvp&51 zSH|sEXB;*6PTLf3Kd*fABw;BD2%80LlId2&$jmNF8GOo!W{TPBvq+9N(Nv405 zC}-nBYgCWF+rB3y){~4J=g+XKcpT7yF~wSp<r1exX}SN0}cI^yK2+B=1Nn_g1Jc zoZk{0e~ITb20-(+G(LOa9Lfz!;u(=Okeb8L}1R9eIp%+nBq*>0}| zu{65Apw$-*I`x9K)ij7PX-K=GqtdUeGCe1X@WaMKiZ}bCW2C3#riZYV6Swp6j$7P^ z)fI4r;iQQ(#@ESAFD53_rZan#%VM+)lUg(QP#J-(3f+c4z{45cg#sndwPy;FYt0jj zbF_)eu5?ORR|@jH6r=cw8i;eVeJ@}z10u4dE6F8=Z8 z^4IpZe4^XQAhi+%f9PIYF<2e?VlT|6V&rc;otC@k-;Mkcd-dK`Xw^D)sh=R>`~fm4 z`DVj_0ZGQpZI}now5$%HzM)_H#BO&}JsF40?u6+fXU*gT0Vk`@$GV~t=WG;!fP zC48}fw`w?Ksfq{N9Ga5)dXrk12GSyis_EY~8f8&!@cN?BO{Mr%EN)MXo@9-6DTxyxc1``bHy{TBW47)e&^f#&3 zX5dOui?Fyzpo1ZP-614E&RC@ntc~Us6#o&dswT7&6K!8WGhf>Q_-$4u!T$2=*Mjfn zN_?V0|H%ORCZ!`CI^ZmX7Kd1lE=Ao@J0jtc$PaxZ?05$ae_?}|F%Ecx4P=EY750&x zU?Dl9TSnMomz(6RSn%O5@dh-KfWPd<46`ort@yZN|nAcgLP5rp+0YaHeAmip2ra@&Z=SmVC^oT$i1 z2}AqmxqdPiOyo~|HR|F+4E^7twP{_sIxnYBNkxUzXRCKud07r0fgR3cA~>yU{E7>| z$vQL}JT&rvM8cG-?_=e!lPKh}U;?HBVIKs5=3X4`Od7v|u>|EBV0FfVp~=lSS`FUA zA1!>J@Tb@Bc$!t1sY)*YVODAlL0~=hc#0pr1ZP19MKwHYT+&6s*B{RS84qNOi~BAg zG*NGrsgMF=`q`6k!p-t|x@|@b+jLn~x|d?)UZvm=g1NpSh*gg%1J#~gLCZ9Wr_ljV z8l%ehVkSTYHKK@HFf+2<{qoeJ z>g`yeg}3QPTbkrv>wAh6WorcnX(-G$c6su|H+2dL?8NZD!!eV$(=Q;PdfK`F1dHQ6 zEGDEuk4%)jFe2T~EKJ%NgY}!ur;lDzod=~Vy6DDQU{(Bv| z+%P4`{I8jBI>tD#226YMZ=CK@Ia=pMKCR%yqp*u@txH&ztSuT97PGVHo1AUNS9%HS z(AlH8{UgVY3i$$zn2+_0@`9=<#fZd{t1Al1?|u5j^GDwM_~9q6QvN;2 zsA^A2s9IjfvsQdl_r?JC`Ort(CJ;l9$uRjC{#HoxL$NB}1e{LJnr3NA|4!ko?nA#j z2a0uA-%1TF{W-~AcViO#IR!`Nwbb?>ENY0IHtg8GgMl?MU_4;hFuk=%;|z@1-FCxv zDr$A3*}}RxxB^{ z&pOhq(l}BprzAjN49iYWqhG*Gks|C-g;so8SwD27*qLD7XkJ)s3o9-KE*wz%=(Q7& zpobk?ub9=$C1rDmJF@^8M5|G1ONK6q?OlvNliF1aUXoEuXSU>^qhhQcMHHVG(Ui&Q z<2BvQ7tN1A01#hP(J=c4t>pPVBn$wrCnvnckrJ|Y(;CNuffTeY(a-Bj?ag4P(Tffc zt!Tng^w+cFf;Y{&;_^ z?An+j!ujm@>Boou58@`qLl$dF?a(3zRjmtwv@?4p%ZT@$pk`&0=Or zv`4sBUR(4yYRNbZ_Fk)}ja{Ik)$)gl9P*1*a3@IHRP-qg~YwJW7+DB z#XfpW2$HH`R0Y0y3DhcuLeao`nWfk2w3C`u#Q@=fc+)70IoBz}PCpr|1PXEKmy7|! zS*Q6`y#zpTAPh~fl+>gf5VVn$mPD?i(^RBj91!00v>$@XiUL=rPyXSU;~Ff?adBxjK#kcrGOBIJyvP~*Ducu z%Ztvm-j%symb9B3jC=VfURlHl=j~sHx-js&+Ki7S7FZ~kW^NXwnJ^szr;?#Ckj2&= zON&d{+GV+7y#eJKI2w0HUd>2jqV_)F)iAfkNbI9&Eu&?Seb)dh9j=Ec?1I)G{p61h zu@OTmIoP^b)4Vlu3%T1L@FF#2y7b48Z&W^DQBZ>L3oPd8(lhjl5UVb@b)tXl4szB^ zlhJNu$%_$@kDemY1kW{T`K{HZmUz+wF0Dc82rXkhG_zGvsW>Y~tvNi`WeX0-dm4K! zyzIq4oHqW{bkd!DTAWc`tl^J!m#wynZBOTLsK>5ZYXHx#Xqy@G&jdzuMl@}ybZjqr a`TRTnNOb)xT?t{}eR^i{r`s>SbNC-tx44i1 literal 0 HcmV?d00001 diff --git a/locale/ru/LC_MESSAGES/bittorrent.po b/locale/ru/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..f2f5dd0 --- /dev/null +++ b/locale/ru/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2884 @@ +# Translation of bittorent-4.2.po to Russian +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# Lozovoy Vasiliy , 2005. +# Lozovoy Vasiliy , 2005. +# Pavel Maryanov , 2005. +# +# Translation of bittorrent.po to Russian +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-11 06:45-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Установите Python версии 2.3 или более поздней" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Необходим PyGTK версии 2.4 или более поздней" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Введите URL торрента" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Введите URL торрента для открытия:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "модем" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/кабель - 128 кбит/с" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/кабель - 256 кбит/с" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL - 768 кбит/с" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Максимальная скорость выгрузки:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Временно остановить все запущенные торренты" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Возобновить загрузку" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Пауза" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Нет торрентов" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Выполнение в нормальном режиме" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "За брандмауэром/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Доступна новая версия %s" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Доступна более новая версия %s.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Вы используете %s, а доступна новая версия %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Вы всегда можете получить последнюю версию с \n" +" %s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Загрузить поз_же" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Загрузить _сейчас" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Напомнить позже" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "О %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Бета-версия" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Версия %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Не удается открыть %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Пожертвовать" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Журнал активности %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Сохранить журнал в:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "журнал сохранен" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "журнал очищен" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Настройки" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Сохранение" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Сохранять загруженные файлы в:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Изменить..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Спрашивать место сохранения при каждой новой загрузке" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Загрузка" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Запуск дополнительных торрентов вручную:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Всегда останавливать _последний запущенный торрент" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Всегда запускать торренты _параллельно" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Спрашивать каждый раз" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Раздача" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Раздавать завершённые торренты: до тех пор пока коэффициент раздачи не " +"достигнет [_] процентов или в течение [_] минут, в зависимости от того, что " +"произойдёт раньше." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Раздавать бесконечно" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Раздавать последний завершённый торрент: до тех пор пока коэффициент раздачи " +"не достигнет [_] процентов." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Сеть" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Искать доступный порт:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "начиная с порта:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "Сообщать трекеру следующий IP-адрес:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Не действует, если вы не находитесь\n" +" в одной локальной сети с трекером)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Индикатор выполнения всегда черный\n" +"(требуется перезапуск)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Разное" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"ПРЕДУПРЕЖДЕНИЕ. Изменение этих настроек\n" +"может вызвать ошибки в работе %s." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Параметр" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Значение" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Расширенный" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Выберите каталог по умолчанию для сохранения загруженных файлов" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Файлы в \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Применить" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Резервировать" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Никогда не загружать" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Уменьшить" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Увеличить" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Имя файла" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Длина" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Пары для \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP-адрес" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Клиент" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Соединение" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "КБ/с загрузка" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "КБ/с выгрузка" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "МБ загружено" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "МБ выгружено" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% завершено" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "КБ/с примерная скорость загрузки" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID пары" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Заинтересован" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Придушен" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Застопорен" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Оптимистичная выгрузка" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "удалённый" + +#: bittorrent.py:1358 +msgid "local" +msgstr "локальный" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "плохая пара" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d прошло" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d не прошло" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "заблокирован" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ок" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Информация для \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Имя торрента:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(торрент без трекера)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Url трекера:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", в одном файле" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", в %d файлах" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Общий размер:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Частей:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Хэш - информация:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Сохранить в:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Имя файла:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Открыть каталог" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Показать список файлов" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "перемещайте для изменения порядка" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "нажатие правой кнопкой мыши откроет всплывающее меню" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Информация о торренте" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Удалить торрент" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Прервать торрент" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", будет раздаваться в течении %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", будет раздаваться бесконечно." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Готово, коэффициент раздачи: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Готово, %s выгружено" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Готово" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Информация о _торренте" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Открыть каталог" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Список _файлов" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Список _пар" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Изменить расположение" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Раздавать бесконечно" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Пере_запуск" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Завершить" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Удалить" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Прервать" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Удалить \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Ваше коэффициент раздачи для этого торрента - %d%%. " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "В этом торренте вы выгрузили %s. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Удалить этот торрент?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Готово" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "перетащите в список, чтобы раздавать" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Сбой" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "перетащите в список, чтобы возобновить" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Ожидание" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Выполняется" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Текущая выгрузка: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Текущая загрузка: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Предыдущая выгрузка: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Предыдущая загрузка: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Коэффициент раздачи: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s пар, %s раздач. Всего на трекере: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Рассредоточенных копий: %d; Следующая: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Части: всего %d, полных %d, неполных %d, активных %d (пустых %d)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d плохих частей + %s отклоненных запросов" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% готово, %s осталось" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Скорость загрузки" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Скорость выгрузки" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Н/Д" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s запущен" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Открыть файл торрента" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Открыть _URL торрента" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Создать _новый торрент" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Пауза/Продолжить" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Выход" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Показать/Скрыть _завершённые торренты" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "Изменить &размер окна на оптимальный" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Журнал" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Настройки" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Справка" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_О программе" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Пожертвовать" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Файл" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Вид" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Искать торренты" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(остановлен)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(несколько)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Установщик %s уже загружается" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Установить новый %s?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Выйти из %s и установить новую версию %s?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s справка доступна по адресу\n" +"%s\n" +"Открыть справку?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Посетить веб-страницу со справкой?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "В списке один завершённый торрент." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Удалить его?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "В списке %d завершённых торрентов." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Удалить все?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Удалить все завершённые торренты?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Нет завершённых торрентов" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Нет завершённых торрентов для удаления." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Открыть торрент:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Изменить место сохранения для " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Файл уже существует!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" уже существует. Указать другое имя файла?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Место сохранения для " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Каталог существует!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" уже существует. Создать идентичный каталог с тем же именем внутри " +"имеющегося каталога?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(глобальное сообщение): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Ошибка" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Возникло несколько ошибок. Нажмите ОК, чтобы просмотреть журнал ошибок." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Остановить запущенный торрент?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Вы собираетесь запустить \"%s\". Остановить последний запущенный торрент?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Вы сделали пожертвование?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Добро пожаловать в новую версию %s. Вы сделали пожертвование?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Спасибо!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Спасибо за пожертвование! Чтобы сделать пожертвование ещё раз, выберите " +"\"Пожертвование\" из меню \"Справка\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "устарела, не используйте" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Сбой при создании или отправке команды через существующий управляющий сокет." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr " Закрытие всех окон %s может устранить эту проблему." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s уже работает" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Сбой при отправке команды через существующий управляющий сокет." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Невозможно запустить TorrentQueue, см. ошибки выше." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s - создатель торрент-файла %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Создать торрент-файл для этого файла/каталога:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Выбрать..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Каталоги станут пакетными торрентами)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Размер части:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Использовать _трекер:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Использовать _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Узлы (не обязательно):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Комментарии:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Создать" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Хост" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Порт" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Создаются торренты..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Проверяются размеры файлов..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Начать раздачу" + +#: maketorrent.py:540 +msgid "building " +msgstr "создание" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Готово." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Создание торрентов завершено." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Ошибка!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Ошибка создания торрентов: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d дней" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 день %d часов" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d часов" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d минут" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d секунд" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 секунд" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Справка" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Часто задаваемые вопросы (FAQ):" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Поехали!" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Выбрать существующий каталог..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Все файлы" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Торренты" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Создать новый каталог..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Выбрать файл " + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Выбрать папку" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Невозможно загрузить сохранённое состояние:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Невозможно сохранить состояние пользовательского интерфейса:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Неверное содержимое файла состояния" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Ошибка чтения файла" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "невозможно полностью восстановить состояние" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Неверный файл состояния (повторяющийся элемент)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Поврежденные данные в" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , невозможно восстановить торрент (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Неверный файл состояния (плохой элемент)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Недопустимый файл состояния пользовательского интерфейса" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Недопустимая версия файла состояния пользовательского интерфейса" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Неподдерживаемая версия файла состояния пользовательского интерфейса (клиент " +"более новой версии?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Невозможно удалить файл кэша %s:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Это неверный торрент-файл. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Этот торрент (или торрент с таким же содержимым) уже запущен." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Этот торрент (или торрент с таким же содержимым) уже ждёт своей очереди для " +"запуска." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Торрент находится в неизвестном состоянии %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Невозможно записать файл" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "торрент не будет корректно перезапущен при повторном запуске клиента" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Невозможно запустить одновременно более %d торрентов. Дополнительную " +"информацию смотрите в FAQ на %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Торрент не запускается, т.к. в очереди уже стоят другие торренты, и этот " +"торрент попадает под действие настроек, останавливающих раздачу." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Торрент не запускается, т.к. он уже попадает по действие настроек, " +"останавливающих раздачу последнего последнего завершённого торрента." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Невозможно получить последнюю версию с %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Невозможно разобрать строку новой версии из %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Невозможно найти подходящее временное хранилище для сохранения установщика %" +"s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Торрент-файл для установщика %s %s недоступен." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s установщик повреждён или отсутствует." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Невозможно запустить установщик на этой ОС" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"каталог, в котором хранятся изменяемые данные, такие как информация " +"fastresume и состояние пользовательского интерфейса. По умолчанию это " +"подкаталог 'data' в каталоге 'config' BitTorrent'а." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"кодировка символов, используемая в локальной файловой системе. Если оставить " +"пустым, будет сделано автоопределение. Автоматическое определение не " +"работает в python версии ниже 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Используемый ISO-код языка" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"сообщать этот ip трекеру (не работает, если вы находитесь в одной локальной " +"сети с трекером)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"номер порта, видимый для всего мира, если он отличается от того, который " +"клиент прослушивает локально" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"минимальный номер порта для привязки; автоматически увеличивается, если порт " +"недоступен" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "максимальный номер порта для привязки" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "локальная привязка к указанному ip " + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "секунд между обновлениями отображаемой информации" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "минут ожидания между запросами у трекера дополнительных пар" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "минимальное количество пар, чтобы не повторять запрос" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "количество пар, при котором установка новых соединений прекращается" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"максимальное число соединений; после этого новые входящие подключения будут " +"немедленно закрываться" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "проверять хэши на диске" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "максимальная скорость выгрузки в кБ/с, 0 - без ограничений" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" +"количество выгрузок для заполнения дополнительными оптимистичными " +"непридушенными парами" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"максимальное количество файлов в торренте из нескольких файлов, которое " +"можно держать открытыми одновременно, 0 - без ограничений. Используется, " +"чтобы избежать нехватки доступных дескрипторов файлов." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Запустить клиент без трекера. Этот параметр должен быть включен, чтобы " +"загружать торренты без трекеров." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"размер паузы в секундах между отправками запросов для поддержки соединения" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "количество байт, передаваемых в запросе" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"максимальная длина кодировки префикса при передаче - значения большей " +"величины будут сбрасывать подключение." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"время ожидания в секундах перед закрытием сокетов, которые ничего не получают" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "время ожидания в секундах между проверками тайм-аутов соединений" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"максимальный размер части, отправляемой загружающим - соединение будет " +"закрыто, если будет получен запрос на часть большего размера" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"максимальный промежуток времени для оценки текущих скоростей загрузки и " +"выгрузки" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "максимальный промежуток времени для оценки текущей скорости раздачи" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "максимальное время ожидания между повторными обращениями к трекеру" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"время ожидания в секундах данных, пришедших через соединение, перед тем как " +"считать их временно придушенными" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"количество загрузок, начиная с которого переключаться со случайных на редкие" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "количество байт для одновременной записи в сетевые буферы" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"отклонять дальнейшие подключения с адресов с поврежденных или злонамеренных " +"пар, которые отправляют некорректные данные" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "не подключаться к нескольким парам, имеющим одинаковый IP-адрес" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"если не равен нулю, установить параметр TOS для подключений к парам равным " +"этому значению" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"включить исправление ошибки в libc BSD, которая очень замедляла чтение файлов" + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "адрес HTTP прокси для подключения к трекеру" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "" +"закрывать соединения, используя RST, и предотвращать состояние TIME_WAIT для " +"TCP" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "Number of rows in translate mode" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"имя файла (для торрентов с одним файлом) или имя каталога (для пакетных " +"торрентов) для сохранения торрента в него, переопределяя имя, указанное по " +"умолчанию торренте. См. также --save_in, если ни один из этих параметров не " +"указан, пользователю будет предложено указать место сохранения." + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "показывать расширенный интерфейс пользователя" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"максимальное время в минутах для раздачи завершённого торрента до " +"прекращения его раздачи" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"минимальное соотношение выгрузки/загрузки в процентах, по достижении " +"которого раздача прекращается. 0 снимает ограничение" + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"минимальное соотношение выгрузки/загрузки в процентах, по достижении " +"которого прекращается раздача последнего торрента. 0 снимает ограничение" + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Бесконечно раздавать все завершённые торренты (пока пользователь не отменит " +"их)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Бесконечно раздавать последний завершённый торрент (пока пользователь не " +"отменит его)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "запуск клиента в приостановленном режиме" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"определяет поведение приложения, когда пользователь вручную пытается " +"запустить другой торрент: \"заменять\" означает всегда заменять текущий " +"торрент на новый, \"добавлять\" означает всегда добавлять текущий торрент в " +"параллельном режиме и \"спрашивать\" означает каждый раз спрашивать " +"пользователя." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"имя файла (для торрентов с одним файлом) или имя каталога (для пакетных " +"торрентов) для сохранения торрента в него, переопределяя имя, указанное по " +"умолчанию торренте. См. также --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"максимальное количество загрузок за раз. -1 означает (будем надеяться) " +"разумное число, основанное на --max_upload_rate. Автоматические значения " +"имеют смысл только в случае, если одновременно запущен один торрент." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"локальный каталог, в котором будет сохраняться содержимое торрентов. В этом " +"каталоге будет создан файл (для торрента с одним файлом) или каталог (для " +"пакетных торрентов) с именем по умолчанию, указанном в файле .torrent. См. " +"также --save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "спрашивать или нет о том, куда сохранять загруженные файлы" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"локальный каталог, в который будут сохраняться торренты с использованием " +"имени, определённого через --saveas_style. Если оставить пустым, все " +"торренты будут сохраняться в каталоге соответствующего файла .torrent" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "как часто проверять каталог торрента (в секундах)" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Как называть загрузки торрентов: 1: использовать имя файла торрента (без ." +"torrent); 2: использовать имя, зашифрованное в файле торрента; 3: " +"создавать каталог с именем файла торрента (без .torrent) и сохранять в этом " +"каталоге с использованием имени, зашифрованном в файле торрента; 4: если " +"имя файла торрента (без .torrent) и имя, зашифрованное в файле торрента, " +"одинаковые, использовать это имя (стили 1/2), в противном случае создать " +"промежуточный каталог, согласно стилю 3; ВНИМАНИЕ: в вариантах 1 и 2 " +"присутствует возможность перезаписи файлов без предупреждения и возможны " +"проблемы с безопасностью." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "показывать ли полный путь или содержимое торрента для всех торрентов" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "каталог для поиска файлов .torrent (полу-рекурсивно)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "выводить ли диагностическую информацию на stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "какой установить размер части" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "имя трекера по умолчанию" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"если false, создать торрент без трекера; вместо объявления URL использовать " +"надёжный узел в виде :<порт> или пустую строку для заполнения некоторыми " +"узлами из вашей таблицы маршрутизации" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "загрузка завершена!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "<неизвестно>" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "завершён в %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "загрузка завершена" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f МБ выгр. / %.1f МБ загр.)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f МБ выгр. / %.1f МБ загр.)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d видно сейчас, плюс %d рассредоточенных копий (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d распределённых копий (следующая: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d видно сейчас" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "ОШИБКА:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "сохранение: " + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "размер файла: " + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "процентов готово: " + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "осталось времени: " + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "загружать в: " + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "скорость загрузки: " + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "скорость выгрузки: " + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "коэф. раздачи: " + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "статус раздающих: " + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "статус пар: " + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Вы не можете указать одновременно и --save, и --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "завершение работы" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Ошибка чтения конфигурации:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Ошибка чтения файла .torrent: " + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "вы должны указать файл .torrent" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Сбой инициализации текстового интерфейса пользователя, невозможно продолжить." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Для этого интерфейса загрузки необходим стандартный модуль Python \"curses" +"\", который к сожалению недоступен для родного Windows-порта Python. Однако " +"он доступен для Cygwin-порта Python, работающего на всех системах Win32 (www." +"cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Вы должны использовать \"консоль bittorrent\" для загрузки." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "файл:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "размер:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "назнач.:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "прогресс:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "статус:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "скорость загр.:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "скорость выгр.:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "раздача:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "источники:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "пары:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d видно сейчас, плюс %d рассредоточенных копий (%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "ошибки:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "ошибка:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Выгрузка Загрузка Завершено Скорость" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "загружено %d частей, есть %d фрагментов, %d из %d частей завершено" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Во время выполнения возникли следующие ошибки:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Использование: %s URL-ТРЕКЕРА [ТОРРЕНТ-ФАЙЛ [ТОРРЕНТ-ФАЙЛ ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "старый анонс для %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "нет торрентов" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "СИСТЕМНАЯ ОШИБКА - ВОЗНИКЛО ИСКЛЮЧЕНИЕ " + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Предупреждение:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " не является каталогом" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"ошибка:%s\n" +"запустите без аргументов для вызова справки по параметрам" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"ИСКЛЮЧЕНИЕ:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Для загрузки вы можете использовать \"btdownloadheadless.py\"." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "подключение к парам" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Оставшееся время в %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Размер" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Загрузка" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Выгрузка" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Всего:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s пар %s раздач %s розданных копий - %s загр. %s выгр." + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "ошибка: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"запустите без аргументов для вызова справки по параметрам" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "необязательный комментарий для помещения в .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "необязательный целевой файл для торрента" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - декодировать файлы метаданных %s" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Использование:%s [ТОРРЕНТ-ФАЙЛ [ТОРРЕНТ-ФАЙЛ ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "Файл метаданных: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "хэш: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "имя файла: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "размер файла:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "файлы:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "имя каталога: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "размер архива:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "URL трекера: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "узлы без трекеров:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "комментарий:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Невозможно создать управляющий сокет: " + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Невозможно отправить команду: " + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Невозможно создать управляющий сокет: уже используется" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Невозможно удалить файл старого управляющего сокета: " + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Глобальное взаимное исключение уже создано." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Нельзя найти открытый порт!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Нельзя создать каталог для данных к программе." + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Number of rows in translate mode" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "В прошлый раз BitTorrent не был корректно завершён. Продолжить?" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "недопустимая закодированная строка" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" +"неверное закодированное значение (данные следуют после верного префикса)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Использование: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[ОПЦИИ] [КАТАЛОГ-ТОРРЕНТА]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Если присутствует аргумент без опции, он принимается в качестве значения\n" +"опции torrent_dir.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[ОПЦИИ] [ТОРРЕНТ-ФАЙЛЫ]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[ОПЦИИ] [ТОРРЕНТ-ФАЙЛ]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[ОПЦИЯ] URL-ТРЕКЕРА ФАЙЛ [ФАЙЛ]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "аргументы - \n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (по умолчанию используется" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "неизвестный ключ" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "переданный параметр в конце не имеет значения" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "сбой распознавания командной строки на " + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Необходима опция %s." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Необходимо указать как минимум %d аргументов." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Слишком много аргументов - максимум %d." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "неверный формат %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Невозможно постоянно сохранять опции: " + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" +"Опрос трекера ещё не закончен, с момента запуска опроса прошло %d секунд" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Проблема подключения к трекеру, сбой gethostbyname - " + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Проблема подключения к трекеру - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "плохие данные данные с трекера - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "отклонено трекером - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Раздача отменяется, т.к. она была отклонена трекером пока не было соединений " +"с парами." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Сообщение от трекера:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "предупреждение от трекера - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Невозможно прочитать каталог " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Невозможно выполнить stat " + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "удаляется %s (будет повторно прочитан)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**предупреждение** %s является дубликатом торрента %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**предупреждение** %s содержит ошибки" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... успешно" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "удаляется %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "проверка выполнена" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "потерян сокет сервера" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Ошибка обработки принятого подключения: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "Вынужденный выход из-за срыва TCP-стека. Смотрите FAQ: %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" +"Слишком поздно чтобы поменять RawServer серверный процесс, %s уже " +"используется." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Пнд" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Втр" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Срд" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Чтв" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Птн" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Сбт" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Вск" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Янв" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Фев" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Мар" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Апр" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Май" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Июн" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Июл" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Авг" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Сен" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Окт" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Ноя" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Дек" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Сжато: %i Не сжато: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Вы не можете указать имя файла .torrent, когда идёт одновременное создание " +"нескольких торрентов" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Кодировка файловой системы \"%s\" не поддерживается в этой версии" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Невозможно преобразовать имя файла/каталога \"%s\" в utf-8 (%s). Либо не " +"верна подразумеваемая кодировка файловой системы \"%s\", либо имя файла " +"содержит недопустимые байты." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Имя файла/каталога \"%s\" содержит зарезервированные значения уникода, " +"которые не соответствуют никаким символам." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "плохие данные в responsefile - total слишком мал" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "плохие данные в responsefile - total слишком велик" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "проверяется существующий файл" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 или информация fastresume не соответствуют состоянию файла " +"(отсутствуют данные)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Плохая информация fastresume (файл содержит больше данных)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Плохая информация fastresume (недопустимое значение)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "на диске повреждены данные - может быть у вас запущены две копии?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Невозможно прочесть данные fastresume:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"при запуске было сообщено, что файл завершён, но проверка хэша выдала сбой" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Файл %s принадлежит другому запущенному торренту" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Файл %s уже существует, но это необычный файл" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Короткое чтение - что-то обрезало файлы?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Неподдерживаемый формат файла fastresume, может быть от клиента другой " +"версии?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Вероятно, файл был перемещён, переименован или удалён другой программой." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Вероятно, файл был изменен другой программой." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Вероятно, размер файла был изменен другой программой." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Невозможно установить обработчик сигнала:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "сброшен \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "добавлен \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "ожидается проверка хэша" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "загружается" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Повторное считывание конфигурационного файла" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Невозможно прочитать %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Невозможно загрузить или открыть \n" +"%s\n" +"Попробуйте воспользоваться веб-браузером, чтобы загрузить торрент-файл." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Похоже, что используется старая версия Python, которая не поддерживает " +"определение кодировки файловой системы. Будет использоваться 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python не смог автоматически определить кодировку файловой системы. Будет " +"использоваться 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Кодировка файловой системы '%s' не поддерживается. Будет использоваться " +"'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Плохой компонент файлового пути: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Этот файл .torrent был создан плохой утилитой и содержит имена файлов в " +"неверной кодировке. Может оказаться, что некоторые или все имена файлов " +"будут отличаться от тех, что подразумевал создатель файла .torrent." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Этот файл .torrent был создан плохой утилитой и содержит неверные значения " +"символов, которые не соответствуют каким-либо реальным символам. Может " +"оказаться, что некоторые или все имена файлов будут отличаться от тех, что " +"подразумевал создатель файла .torrent." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Этот файл .torrent был создан плохой утилитой и содержит имена файлов в " +"неверной кодировке. Однако используемые имена могут быть корректными." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Набор символов, используемый в локальной файловой системе, (\"%s\") не может " +"предоставить все символы, используемые в именах файлов этого торрента. Имена " +"файлов были изменены относительно оригинальных." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Файловая система Windows не может работать с некоторыми символами, " +"используемыми в именах этого торрента. Имена файлов были изменены " +"относительно оригинальных." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Этот файл .torrent был создан плохой утилитой и содержит по крайней мере 1 " +"файл или каталог с неверным именем. Однако т.к. все такие файлы были " +"помечены как имеющие нулевую длину, они были просто проигнорированы." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Требуется версия Python 2.2.1 или новее" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Невозможно запустить две отдельные копии одного и того же торрента" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "значение maxport меньше, чем minport - нет портов для проверки" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Невозможно открыть порт прослушивания: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Невозможно открыть порт прослушивания: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Проверьте параметры своего диапазона портов." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Первоначальный запуск" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Невозможно загрузить данные для быстрого возобновления: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Будет выполнена полная проверка хэша." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "не удалось поверить хэш части %d, выполняется повторная загрузка" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Попытка загрузить торрент без трекера с помощью выключенного клиента без " +"трекера." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "загрузка не удалась:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Ошибка ввода/вывода: На диске не осталось места, или невозможно создать " +"файла больше, чем:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "убит ошибкой ввода/вывода:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "убит ошибкой ОС:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "убит внутренней ошибкой:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "При аварийном закрытии возникла дополнительная ошибка: " + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Невозможно удалить файл fastresume после сбоя:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "раздаётся" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Невозможно записать данные fastresume: " + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "завершение работы" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "неправильные метаданные - не является словарём" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "неправильные метаданные - плохие ключи частей" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "неправильные метаданные - недопустимый размер части" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "неправильные метаданные - неверное имя" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "имя %s запрещено по соображениям безопасности" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "смесь одного/нескольких файлов" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "неправильные метаданные - неверная длина" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "неправильные метаданные - \"files\" не является списком файлов" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "неправильные метаданные - неверное значение файла" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "неправильные метаданные - неверный путь" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "неправильные метаданные - неверный путь каталога" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "путь %s запрещён по соображениям безопасности" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "неправильные метаданные - одинаковые пути" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "неправильные метаданные - имя используется и для файла, и для каталога" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "неправильные метаданные - неверный тип объекта" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "неправильные метаданные - не является строкой URL трекера" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "нетекстовая причина сбоя" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "нетекстовое предупреждающее сообщение" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "неверный пункт в списке пар 1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "неверный пункт в списке пар 2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "неверный пункт в списке пар 3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "неверный пункт в списке пар 4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "неверный список пар" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "неверный интервал опроса" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "неверный минимальный интервал опроса" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "неверный id трекера" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "неверное количество пар" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "неверное количество источников" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "неверный пункт \"last\"" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Прослушиваемый порт." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "файл для сохранения информации о последнем загружающем" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "тайм-аут для закрытия подключений" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "секунд между сохранением dfile" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "секунд между обрывами загружающих" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "секунд, сколько должны ждать качающие перед повторным анонсом" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"число пар по умолчанию, чтобы послать информационное сообщение, если клиент " +"не определяет число" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "время ожидания между проверками тайм-аутов подключений" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"сколько раз проверять, не находится ли загружающий за NAT'ом (0 = не " +"проверять)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "добавлять ли результаты проверки NAT'а в журнал" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "минимальное время между глобальными чистками" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"минимальное время в секундах, после которого кэш считается устаревшим и " +"очищается" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"разрешать загрузку только торрентов из этого каталога (и рекурсивно из " +"подкаталогов самих торрент-файлов). Если параметр установлен, торренты в " +"этом каталоге показываются на infopage/scrape, независимо от того, есть ли у " +"них пары или нет" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"разрешить специальные клавиши в торрентах в allowed_dir, чтобы влиять на " +"доступ к трекеру" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "открывать ли повторно файл журнала при получении сигнала HUP" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"показывать ли страницу с информацией при загрузке корневого каталога трекера" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "URL для перенаправления на страницу с информацией" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "показывать ли имена из разрешённого каталога" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"файл, содержащий данные x-icon, возвращаемый браузеру на запрос favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"игнорировать параметр GET ip от машин, которые не находятся в локальной сети " +"(0 = никогда, 1 = всегда, 2 = игнорировать, если не включена проверка NAT). " +"Заголовки HTTP-прокси, предоставляющие адрес оригинального клиента, " +"рассматриваются как --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"файл для записи журнала трекера, используйте - для stdout (по умолчанию)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"используется с allowed_dir; добавляет url вида /file?hash={хэш}, который " +"позволяет пользователям загрузить торрент-файл" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"сохранять мёртвые торренты после истечения срока их действия (т.е. они будут " +"отображаться на вашем /scrape и веб-странице). Имеет смысл, только если не " +"установлен allowed_dir" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "разрешён scrape-доступ (может быть none, specific или full)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "максимальное число пар, предоставляемых на любой запрос" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"ваш файл может существовать где-угодно во вселенной\n" +"но, увы, не здесь\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**предупреждение** указанный файл favicon -- %s -- не существует." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr " **предупреждение** файл состояния %s повреждён; выполняется сброс" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Журнал начат:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**предупреждение** невозможно перенаправить стандартный вывод в файл журнала:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Повторное открытие журнала:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr " **предупреждение** невозможно повторно открыть файл журнала" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "функция specific scrape недоступна на этом трекере." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "функция full scrape недоступна на этом трекере." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "функция get недоступна на этом трекере." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Запрошенная загрузка не разрешена для использования на этом трекере." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "запустите без аргументов для вызова справки по параметрам" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Завершение работы: " diff --git a/locale/sk/LC_MESSAGES/bittorrent.mo b/locale/sk/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..e1ea259319de245e3a45bbb535109bc51d241486 GIT binary patch literal 37478 zcmd6w33y#cdG`+?A;cjGfdoP}j!lfEU|nz7P!c=xu6T_lJH#P~Bi$qE>R#O=?&e5r z0TPx%2zx0@idhN+V(`fii=s16iJ~`Lpu17@iI{8fli+gj^I$)C z%Hk-x2;2_p{y6wZ@YUcXcnItRAH5`s9t7S3E&^`_9|Mkp4*~B0yTBKKr-SbWPXj*) zs{Ap~z7L+o_2>!8X%AAAD%K~UfM zI(Q-YeNgRLbXgQ_0oQ=%gHH!l?&aVa;2Zq?KLXXR4}1I+sPB9cR6oB1s{Cn7qv&k# z98lMnf;@`4K)t^MRJ(8WSOisW(qA6{W3KN29}gb%_z6(&e;+&z{5i;f(Ss>OSE6q4 zTyO`d_6&KP22bVsmEd{cYr);%VGxo=zW`N!@iNzrYr#ixy$O5>_+(K0G6F6J?*P@_ zH~Z)B_Sf$NMYp5i!@*C0G595L5c~<)5AK5KqQ@VAs`nUpIrtBt+W(Ml*PaW&tGQkc zYFs8j)q4l1_PyL+zXKG#{~Xl#e*#oJf9LTV;6u6oFMs_YJ{EKRNboxF3Q%--8Ynuv z3RJ(}1B!0%2OkX{0afqk{PovCjl<7C)qe_1CVo8=)Hq$_u^T*->#M<2zzyK(;AW66 zM>|2)djQn;Uj$wPz6Df2KMG3Tz6h#a-}U%Iu#fAXfTGiN2qz*PHNZvSb3nE0C7{~# zYEb3h;_v@6sPBFclzc}$u6-ASy8l@4JQ}Ve+mAe;A zz(b(=app?b{%%muuLmy$w}Rq>F;L%s33vwh4p8*|Q&4pJ6sUfG4%BzQ1nPS~0M7&^ zph8^>yHL!MB4C1}|UZ>M4Nda(z9hcJA`mw}I+M=CK9p`_BaR{kuSY=T-jxo4|Ek zzXMc#-vZA8e*#_sF5(~2Z5_A;ycN`Vyag29-wmDzehO6mUjZKheh<`lA9SUYr!&AM zTwe(4{p&%M+YCMoyaf~=j)H3cGr>oKcY>nBYr&1+gRgS!+zM{sdOs+7-wWz{{|Jg6 z{|u@hKLpPQ9}M%VeUAa954u2&*CtT!-3aQvJ>cWPr-FL#1)#?9jiBW4P5%0iK29; z?fN#TariG#^g8cacYiS`daeL9uGfI-&qh#m*$#@HFZR!00jeGMg7<)*0woXoQBwL& z5mY~GpycRwP~-bNQ2l!?sQSMS>b>uR>i>U&d%(-DHxZAX35u`Z1tOx+{h;W&h(@XW zDv+UxQc&%A1E_X>!sB0q8ow`q4+p;i>bpM%)xKYXYTs!vukJq_)cp%QUJ7b_F9TIi zHz|US8K`>i0L2F{1oi&Cp!)qMpx*ls2&+dQ1x3IA1T`L~ z-r)Lk7O3*)fsX|*1@8vef{-lw45;#FpfpA2M}Ut4mw~E(EhxHd1oi!GAfgaG1-uu0 z6{vdGtaslT03mgB8>sTH2i5=g`0Hc-`m>8}OUp7eL9=F&eG$eO|w7_dTHa>kq(D@C0}>xco+U zeJ7}Pd>bvg- z=|c21Q*LtOeLnbN?q34( zUv!9nJ_7y}Y=R%!gYE!V4LH7f4R{XM_k*ak=-Z(Bb=jc1UjT35dMzmaeKxop{6ml- ziarDG10S{5wPzB1@`Ix2rJ(5j9Ufi<{uo>V78uk^z^8yWfX@IQ2_6NhD*7y_`XB!! z7e5SuYR_KqLU0Haoo2u_;B&y!!S{or&rxs@I15Uy{t7%B{Hn))1DA3AOYll?*)6W0 zw}GPfq{kL0x<4CKJ$Hkvz&C-HgP#M{?w^AfgXivdes=+6Xrevf1>l=OwdX_N!@$1) z9|is`DE;+qQ1$;5JRdy!R!7InK=peQsB*jf^;7-x2~gwqV(?V(^`Pp1lfQo$6rGNO z8n@%1`1tFf+JDBA-8ftUs@xt>_iq7v!8^eV!H$Tu@ z;9Ehx_f=5+{u#IwJpC!IeLdh3u6sd^-)*4i{&G<5cpWIdISA_g!=UK=K~Q}084!|3 z{|yd+14B-}-wt+h{dw>T@E4%yyymH{-8X{kxSjwn1>XsZ?wb(qnJa`wV{=XZ1Ech>=zJCTnu5pY(_3v^}{a*z>1{?&{o+_yE zyBk#b*MS<}w}Rrs`@r+SkAb4k--D-sUjx;iZ-8pY_rP<(^HIL4cNr*t-waCrs^CT7 zy`b821l0Q<1$Tp=1aAN@EV}RA3hMh)pvpfBlsw%9_Jgki)t)bd`tG+u@%_(0$>aGj zhwfhlcAWwpLG^Fnn3I>Mg56x-3F`iPKz;9npvM0%z;W=ipvv`fp?(!Xm46y%Jq8*csAE7K-Iez)O)vpmw;2CzVlM> zOz^d!==oMq{rZ5v{wk<({1GU={jtCPIjC~c)7*Gp4q~FB5~zAV3a$n}4T_Gx09Sxl z*Bl+jz%O$BO0Wy8)Ls1WYH&T*4{f;kVH+s=yb=_@90VT*9s||CPlM|B{h;*W*FcTy zk3rS*OaFX*)Aer~xRU!%0lxs=1FF8!mK%>csQ2##)sL5eG58u#di4YT`I!eCpFI*> z&ixC)8^JC9`W2w$?<3%q;5Wd>ffwKI{M#GA8@PTJxC;CTsDAuAsPXs-crN&mY1i%x zz(rg?0aW|00v`^p_1C*V@%_!9#_1{GsbCR22P}c-gVUhuzXufkUJt7LJ3-a^UQp#e z2%Rf@-q*mFgO@zR*~>o$_5RmD(fg<1dElyNI=}NT@s~c21p5^f_Q1p5Ucmwzf@V(&Qg5L-4e6|~x z#vQJ`cX@m*DEht&6y4qjiq0PfuK_;?UJai492YNa0RN2ZyFl^Xb;ccZi(D^wEm#Ks7)11&pz6K&g|5Fhf*IGhg6hww!PVfYFLL_hYVabid%>;XKClb? zLs0zr3GgxC7r}>uKL8zT5H7OF@nITfpB34}nht`(BD{fUg5# znW%J+v&Y{A*K)o4Wp4cM0k7lw&7k=6D;|Fg-oW)aF!6G5x5sCKeO$j2yaoI&_*iiB zE1ciIigVR38PKmrn=j|s%^^P4?-tJg5_~8~b8Osp=|RV@#j}2{Z{XO&`6T!?jyH3h z&b5B9baa&Cha8Xh_r!bWa9q!U2pTOP3>JAl4Xy)U4Ze+IjN{`Rf5)M*eHPE&1nSqt zx#;l_yK4XQC{9=KtibUkj!$xZz&{p$K81Tf1NVae(j&hvI`5QTg zIrO`kdtU|1pnkVHuz$s?kM;L&3)u1e1Dr4O_rvWet~EA~0~OneU&p|+Ii!1@4W7yI zdd?4kPvy|>VI1$$iN8L==~9m8aGb(1!u>x2VMUWwz+`n4{5r=eJbwtsWt{&x2cl}f zYq+Q1wH*J-feMWNi9Vtn~Lo$<176{@!P~DVdWT zq#WmR|NM^f+m~+^Ag7~ZtUmyvVZU|;Gc3_$g@pgkz;`KzX$c(!1=#{ zJ$6N01zyCxi@>LY(m7A&ILvVx*ULFNf4|`3k=*-(j++h6pUJ&%g1f*a;B&y0;2&~? z-+%a%-Qd+6H*@q-?x+6#KY$dl!=6EYdi9@zQzk?2<=YjvsvCm&$1HPQ&LXNvRe!$WByO)b| zs8_%DaNK2Q&X&KB^QZCb2LF79>r**C%CU}PlKYS1Sj!P}T+F@I;91~bap?CK9BVip z!STl&`u&9CZ#WinoX?@(agIUW?c?~i-9e9WekJF1@RwjW#|X#IISz45bAKGv?{tpy zxPG`@wf|Y~PjBK`_)Ynf8@YD}=e-=uIX=&EJNH&`{3GWVfHC;r92L&DfIs56f+PH% z&;5sU{7JY0ZsU4~zkUta&-HUT^n0|&KF;6CaTnL`0C)QPoJP;!JOkgW3;+9T@MRp= z`Rg9a+{gLZ{`y+3Cwv|M$KU&mN5TK%IG5x1I68md;NnFb3CATIpW_I>raxH`Zh#ez zjk;d6=}8+l?H=skwX-)`RBKk_1Et1zT+QO7Hdc>Evsyfr)RM`xk=Ek$_NhuzO&X=F zT94xRaj|~=yA3-3**jIql48f5joE=}errQEIaQ%P3Jgr8X)%hI$0JF#nl<8DT5n{v zH0GaLT5ZH#QM{p&)l1c}IH^?PrFB|YEoKMm@nkX`kCtwa8{=s_Rm+Ae>0}{_OLbb_ zh?BTjs-+{;G94{hT3^D;wKOSC(}7aGQ7^C(8ERnz6_eJ!0#N>#oYEiJ~wNzp?*RZ2(Fdi(^HDOIVsK9bam zP`H*ptqD!*Dp*XW4YRVY>gh;UE!vHGnpUCP0dDs$UAej#k7v!Ap17;YQnlGgxvs1F zp18=HkbrZzg6527j6@|b0EHS17VMHtO{Gb#u09W^bgEWsPBmgUYO++ zDmA9#?HRqQ$D3-ktfrH#X=O?{kTx0=w(o~=gijq6>hU39)t7|dueyk5&D<3=qRDW|pGc&UAmuGHXEy%u=V z#>)7Go=~c5qvy3!D)xj;hau2p%J?)!#=~p%?x<^PBKC|^Mt!6aH>=RBZcR;ST~<{y z7u8{cxRSwtaW!om$ZF-7x5VYXWz;iP$%c78$?M5j+8tYCyC$2JMhU^9073-mi=6qF z>`T4_-O+OK2rS@6&8}cDyX2X5L6kA!r-PlhkiK*j4s4{A=|Z$J=b}~OF4gH+=elOK z47saoqdvNE0A6T8bJRwhjY2aUuU1m3B*<-HQPek_)g&4w^tx&`MA^P#E2)k^{XU4g z*;tG-Xwyi!5N6pUT9(HlqWk;Z6!vs5XH7@nH-LZJ|C zNUF=MPw}K_*Kzb5V-#C8H{7!VNDN18(lSNm917ZWT(;RuX73 z-X^+ZVuW$mK(v96jHRx}Hf9=qnG^rS+BKezl+{@4P`xyhy5^2&Wk!92*OOJJwyj)N zDW)~|swq*pF`?->Dcic(ziwqKB`6eOcP7DlFK5*%B1nrkby}&IG!lsgH>5z+yJ9LU zg=rcYM;Kr(wNfwV1%g$hSJ@OgR0?RYHXS#e#flH4!|`wpbAxG^>;CJ8K$CH9~0aMqnPN;*hNN=gcaLEwKn< zKlrHq5Glb>iB*I6)*Ce&2dTsl?o?JuA5)KFH&mg30@m*Mpf89@$dpQ zVfW1{;`QLYA%H5*sEo@z)#UZ5KTDU|{R01b?G;X9R3~0y{vaNbPmw>R27NqN*U_d` z(WX6ncJ1k16m7y0Lqy=`y?eH+LrG9hZn)uijdO1(=w*k(k@*V?`vb$dCt^&oY{6?g zC&lxh;tP$I#umI}ddXF^INFTCf+`Lq&)#W-SL<>k(Z!P*%f@&uYmSY#wHB2(YFQ<& zXSf!PLPrh1<$HYJyRfuI7jhYU?Nn!WVh*58kGq<#qd?-cipwS{EL&P%7QEzoa|+D@ zw-(~Prm&VJ^^sDE=NM6_Mnkdmb(9|`we)}tW^u*NzCk%eo6WPVHY(FG77mU_hU*p> z^hR5l`iU-#O{>v-$V12^D`-ncaC z`urPx>sM7rK!!nXM<*hewaH$>=bMHhR;^gwy*$p4q}qWJ1w4x?u91jMro|G&(a{Z@ zOZw(sUIWQC^zF4+5P7rFj8_>ER>$KSQAubrT&l=lmrP<7+Dcj8Zv+3Y5g$lua?kBe z1!_~oby!|`i%oR+G#prmT?!GgV^S>gw60TXtfgW}o#|7-8ISr0cE#KACz|-X$e9AL zO#Bk{SG_v!w=e`zG}gDP@uWW9ONmmWlvMC7q*R=DZ|?Ajc?E?y9vsJGnQUSviBi(4 z41g3efeOBcJ`~t=&g;Q>q7%;NjCW7d`)a(putqV?nAxLR{#05WWp6=9zs3S_L5}*X zEgI*IuTyqi1a`EeQJd~Q>Em`-`oM*xa(G&gwyj@Lw+^^7K3cEvCS z(e^AWoBd6KgC1*0dZQid^LJ=BSGk?ok(AR&|Df^drKgO$)2Vf>+J>ktv0jnO5_KoH zn!uKbtB9(*=0u2+j`J??VylvKKV zxq~Puu#}91Y9)wdE__%snWhaFkJNqmYab$zKoJo~5a7vOa-Ke2wxC79fJ?0SO4X2) ze@Y4hf#5J*5n6!=Cy0wROEJ)L6JZ-NMToyc>k84X4QrxZ@{aTIc9)^!L$cylz~AZR zs!<|GKpMt#gx$eg-<=@z#b`GXeB8g$(B-I1>US#(LNGG}^Vm7AzDF1C5a#3In58yC z*#%Cn6oj28N=Bq{7iDm}8wlX;TG}cR78&E17nk4h9^~#?hO86G4<~2~d_9Y9UGzCz zA)BzMOSTdVs{DzNc9O?679ILqW9{eCDdEeKGJ8!;7$Cbu z_^H=?!|U8bc`pzI9E>JeJzTK1GYi2L+12A)hi*e9)<)2mn9iEjr+Yr{MfzjBL_ui} zD&~dJQVligK4roDg74AFcAg~ea^IF}f_n94SV66rteuj zLDD)u^J^RB2wV}T16%Dj$iD0ZOtXxg5lDjy1=C)OkV7pwgRVmY<1-!?i zv6(a)s5Xa(5$XYH#GusNl@t;F0U8M}vXT!n$=_;Iyap#o5zb52tcwO$@!tyKi@`O~ zppTzRc&es0B?j}}s8j0p#-#j;Ekvx!Z<)(rneNyLVxFTW+dKl36{0~h9A&3|%*&;< zi^(Ozt8#hcWGpG6KS8ay67E@=?%c!6Q1fykU;6&L% z+)GJ+=4Cw^_Dc_UC&J_#dqSh3!1*C4Ruh`p3Y_cV@ zai|f3;PM40!W0GLkB(4!CVi3dVH`wq-0=z1t;@on*KluhG7f+f6hEU`@v#wohIF1opI&(8jxTY6*5zj~gdp4^SZ_$=a!Ev%jBV}u;^tPRl3aLQ2dO zv}!iHHBU=xBIH0?sjQ1al`hY!6q(Dr%xw|!LyHz!X?l$+u^9oSMcpSBrbbENhT2d`KL@xD_{7nT2F2+!tuF1q`nAvMQ zm^`T(!EWLox%-+%aT+psiTKDP3=XjdJA6vTMXHQh?T9xqxoO5EIEfB;M%enM|^ zqEHms73;E0sM|_*pb(ii+f^s`VrKzje+kR|R!d*(BQEW#1}S-7Nqg+BS8VleIj{NP zyA*Jj3eQ^=V1ui0Sn?ILVgjL+TdkGy1W%AI`>GEEd~uxRRJoaY)?tRx;k~A~6CA6SOfjX?AhA@>RWfPlWFj9+Dxi!i=X^9!Ta+lbcxh$d~f#Cpz~-arge#<;HQ zH_!%T_~$GQ$}0?vXRu3!{Bk2NOV)v@4^2~P zNn!4i!Q#u{`~(xJb!#YOqy7OJNn*3Y0!i)|daYK2xYUs zG|`MY`K5VonDk>3KI2u76eS){ioa9L>#a5?hiM72-2S@t9qGvq;4Pwa)O6le#HP%P zP*UPF@pvGo(vaXC$=EZN87 zXwK3`GcS`ZdsOnID(CXw-L1)6^LPWCm)46nIomjl_RSWziOo;4MukG%PgPWQHARlE@u06 zrCD8C)bzdBsDpbt-t|^XwNE7qr2^r_?4rA<%#3G?fnp)5l4!ZDl9^qqMKe6I*=Lw( zyoo`^$xn*r!~1B%swbO(#tYi6{R(+xNuz0FRoP);BX!N3`zGJP%k_DGSg1?VGAjD`kCxJ*|fa==1fSbO6o zxH3!(lI?LRM4y=QckNsAQ(t-FSCR*>E{~VMfb%Ng&PiWJO2T?qmnmC0tKbS~lwoNpInslQnh~r>^#$9|)=Uye<^3^gwpQ5$)DuP2 zGX1M%UaAon7v@`Nvo+gE6DaP|5`j?4Eg}F`CqC*(tu#f|xH>0qONXX4W)ZK=n>-IJ zr<~-J`l*881Jvm3QQPdQ6Xy2E?ZhwMD*YS9ou2N-S|oLpgw}X^8Vx5t2h`I8^@d!H zLo#ZGcu)*To=16#k>GSFt(sNgdsIrjq?(K)bDA(?5a^qe)KkP;C-;pNVVGr;OL*@Z z>o6lKQj_%}0r5Z-G5)cPt^ZmfPlN|o>wn;@5A=~X!*vV^e1T))^3Ntq%=gt2i%h~o z16DFKOI44|nUUk_G;S0qXdaTXdIY30o3=3kwh5D1WRLvRgnt?}^MsCTiFrI`b{Ho3 z5|@q11!@$D5kqN096l{@S1yXXa%pq-2DT3(6om>XV_ICQR&&|P|CQ?H&gUWRgjY9K zl{FeM<6za3Oh&nPR2B+LYQ(1~4jg0Jr5k|~*a;T{sliTVIKMt3=U6HBw3wI>Gn(t; zhXWI1Dtq31ovPKume5nrxtG=z3sVRHam3vMEvJ-8q2*@ZNWvCsCcT zkpv3XO69l~UkA@&_8ax`4bus0+Y6|iwUl?u+Ij}lWU@Ej-nVnh-o7oH;_J3=zoAkp zWVNxii*}H6ZFg){VdbI?ZU}k?r>AJKR-LTCq?D@H!VX%r-MD`5;O3rd+U3+BvJpL- z{7TT?_!^Rxi=Nc8C9RTKw3hD9vIfJpvT#*lO+i$kLsu<|7RCE!-?+1X$F@Fph>@mY zrCjO6+Yo~p=5@x%ppxKgDR?p~gX3JoeVIKJx27i&*7j9PY4kYKlUXr?Bvl^pelm`y z%V{wyXVv3(r@CF6JvuUuKXKx1Y&ogo5S=)N`pAZ>Sxesw+}9QDPZ}+p0Vl5fytv;MRSaUnKnkSCA z1-8uzbnfn2GNBy+^%8IElWK-vfyp=F@8T4d9>2R(WzAd*FQ$rL9d4DIemmIQN;iy; zsLs|jGmNTEJ%@z+9X{>+8mDEg*+XIDmtCTd>D3IPJA1H|L`#eD49OM)>v(zgNWIJm z*zT`ZJOgjBO4J@rLBkTRbE`aiaAaKX6sxm`g<%sIFIU;#q#%m$Etz2zoxRMhuotX2 zd$^ikVmN1yG$I=E|#OtXIR#6c!}XAd%ZD!_mBB%UeG z9%Pt!XJmYOn5L4wOoye)W{(ahwk=EneNuK?!=eq8N_aQo^{H$!8_`J>K|?)OOOT`< zGnAq;ugo59RUwZrsRz|0*3Jx3zETo<5WmKagb>JjJbM_HJNeGA4QU0+X7Nl|`q{MT z#J;YM)fg>U8urr%#Udl^mFtcM&6sv~?avvFff{ZWXOGNH1hdktYiBwMS!}>?#+ef? z%dsk#lH>o={yinhPdBtznRnr;ey4SLV5g{+JI3umi0B)?&C5`4(b@m|h zyL(NAl!AhYc8TJ9vY8VHXAh$#kS3=k7gLe8TS^OCh~4&0VH1Xbk|L9<#w=Z#M9B;(RG*xInA|0d1lDO<|6S7U9 zm{2%nQth@EZ68V#)tXGOM=lqOY3;~@)tz>qRQtWqPNT%dn#RU(f@enrrpj#TjPx;j zQw3abi%Kg&akMkG=lI>Tha1U6Bh@Z7sKLzt-0>BWQt6%CfKdv68j|6Y*OKFR8$+|U z5}QG?e*dHx@+3q}^+=pYv$dl+fk5+xR(kwcS&Euw8L_gKO6|sS94xcd0+L7j zrb*VhLAD*ldKV@MhDhZ@5k_#5wHLO4-dh=&*)YUy*D!0jcdSWnx7#*C=_(eZrp2&C zLpVsX#Je+EV)g;!i(015j0TpBS<;Fe&Uj`rnbD}&zBi}dBy_GnEMA^dIGFMknc2sN z^z1+x4?*5vbB4rQ=N>qzB5(WAXF=UCpPJQJ12?y3WP1Wh^!kv2M={7&7PI4bCv}~% zURgXlx4F;J&B2X($$L38mJW69;3*ZSc73G`aYmJ@>%zPr` z>_^F3iuRaEMhFqB;t}gB#m#GpJMVtr*rNdbiVCPe(M}M z&@m#E4`pRsr{{HQCYgc=>XRE#9^)UeF3%63$l#nE^?(iszKr_HjixgvQX^&u+qdTL zrgQeZl1@np&)-=0Ko4z?-Q0%~HHHa&BgNwMvzMB*z2i@Z_S_wRX;R@m zU9mOLDNtwao6cH50GL{e)3XhAa8G?c;(0=D*Shes(psGw*qfC6IqI?FF}k_NY=4SA zV&fA|LdMQF`>^bhd6QC%;@n)z6?{qa_FTZ|qz{wp>R2x4C#~T=;dCC8j#p=GLtb7t zYk!@D;YGW%5}PvW<=Ojc`Lz)u+9S8c-0j>hG@}98K7AHd!TQ+^TW?w4$Ns$in3M_I zo0ki%w*`o_agHe$S1c6Kx_;-m;X#R~tjnmzyvweBGgMVCY`CZG*v=aq_S~u+3(C=H zmRK}Rch7bhD9W3|i29732&-0KnR~Vvj+!1%D%m{oX#4q&4`t287dTLd%Xr5lxJI2? zJ8NMGi^+)U_q+S%%Jc6~!GJTxongb`Xa^xe=mN{0t%!$d{4v}Au+6#R;wsCWa$L{N7)@Vk{zuoq~Y*O3*qT??~Z`)pUBV`#72EsByo3!UNRVg;u(D>mab*Y4fDYyYl2J2&m@-_+|oHSD&w z0>-OJ?3%Mfwrq-YlF3Fo*QT(30x@CTl_`=$eVM)Q#4&8`bSpD);`tOVo6=DlG|xbO zKOg~l5{399&SvPvq=ukD;F;;q%~+e8Z0%!LpoTu4NM@$XO>?bfqV>Iljv54mh;OvN zHT%}%cgv9UYoDOJ1(O)NQtHh1369vJ|K^0xL_rO@;TwV@7qea&!ZH(145`qJ&X7D| zVXKQMm1ii)ZcBkGsb^#5h|#Vk+8HcP6YC)FwPW9)8zXZ~Fq?Tv>ZAY89xKjN*oukC zSiv@|Kt<{Q%h`~Er@u&#c<>CBeLSrR;-r{N-H~l%u0t1hQT|uh&tb5=<37_?z1e62W>Bx zgW~BN?gr(dF;!qZU6QRg+21Pjz~3aAhfL96b(zP&Td9&}al>6v4szuKKhmQ0xq z7)z7H#>D6rCeGypy9jxzQe`t0Dgzr*En9p-RN^vuvOX>efP*3r{AAVP5ipBN8rju{ z8nZ+gpJT|B-*rPL8_1%`-}qy;*HDp2uGgYnb{Xj4HXC-{>fCLpq@Lr5XdkROoFHTE z49UE0hZ=8FBKus>hlE-t4#l)h89D5sN2N7LJt>ofbEg!CCHd@}uujGlUC3k?&q4yr z_8=;4GsAeT%|0h~&S+1(bM`qq`Zo=3>x=i@VtX5R?d#)Sv{ya@1H=Xn zI}3hRE%i5)+qB1)s+o{tZ-?^J9gpONZ&f;HA~c=tl}@(cwt0k*;PjI2feVjLh8RJP zsS6s=4a&NwbGJJNFPF-OoA$^hc$eci%V$Fk@`{BIZdai*MV3}VSlUg<^{~(HiJ{|S z1uv*8Zxa{hqR1#W5E_ck)S8MA-9AWHx0Yg{O5`3S9lga>kVZb~H+z4JK6iGbovZtQ z+YzZwqG&D3at!Y;f(e2F7sPR4|Kwg$x(wnBeh(RH_d4kvcYDP^ndPWMUV*fkB3D7q zDbT2qY1$8u%W=rnaT=X?Q%G8)rjOsFAbIvMp{Fsikw`W$w1hjV=v? z$+L1O7EQ#+*}(-Ry&P(UVKrf7CQ;K=-i4UNZEM@k|$S- zDIyM06h>6t%F2u5zH&&6TAU#x8_ys~P14go!?t91UVe%5_?z((NS}=?Y1g|r+UJQ4 zpDQ2W)vT0p2Um2`2&3jgthmw4^Hc4zhw{G5GYDA$QGm=ID-RVL&G{0^bWC--f?Sr^ zd`Dhi4hM-Gz0-2uh$0VV!L){ezigpIC?hs#-cDE#%-+{h z0#7q_E-Yy|fBjHgA~B8WP!ln1^V;9kK3DnOifXY_%yOC*2nO9dHh!C?3PPs#{1QBj z4Gm6~w^d5Pb5mZA0%Dmzt!Twwkq7JuCec^HUdhVBmoBxQc0|gK=%F=Tjxgbp0dm0^ zv^Fm~o9tF6m|2*n^vq8IMe+|dzp zQ#KBQmMuG-ux)b} z7D>TiXClfuUrp2{U6h$%)Rn@UvvYIKmQFI>@ol%E_ILqrqli6GqLxIdG=drvw6saPvb+i{NXko!f%Mr2EX&HDym0OnnOA3+$4ai^ zX-g(0V5Z2S-C-B5r;8AV;V|Q*NX5@1YMz80qhoYLg_RD16DMix4C@`(mTL1b6qjG) zQ{W{Ak)>Pk?cB^zzXY$H)RsTZA9eBhT113F#1`hJsBN%=_yk?6aG0@hu7ywFigD0u z7HRn~3*oapp*t5&0NC6Bjd3n=R%9vzHn+@$+IZri+n<6LFPoYTGocdp+n|Y)aL$g< zz4iyxEEk~9q1kDrY<6fYf#D`RTsltXj1?D3v2f+MsWE3`=oJ1}Wr>C~#KtlsJCsi` z%DDt|b-i))xhE9qRRxmjm z4Y?^&RBnArlacHvb@OH&b2EA~hgRuz%E|wcK?Y znj6qL1wCgAsjquTIS4!_s?;{pZESB&N31dGw$1Iy=2>QZ$OjrHUg%ppdtW^pW|0Kh zNK5Zvp~)57wo*6#bG+1{onCfWi@@i`mEMS~#YyMpQnoa~hH_)_vBs!rXuTdnQbVE$ z|1l3Mwd)kdMmJkNNBs(0PG#AZR>$f^X3z3zynNk^lyW?KgeW?Vlr59k@>vv<7LByR zA_AEQ8yuS{*58=1dC-_)?~Lf0Fb%W!RKv7^D_8M$B*TkQ0=|IWSUp0y8(o_ahY`uHl`B%dHxC6lc}tdu|mCEYcjvc z+LP}5ODM1HIOi4quBYMY%#^cINM_1O ze1_#@de&kKh8w?Bv+_>f#KVj-UM~NJWNpUGlFN&V^)%xAwH+q#PX39A!S<6-^5)c8 zO-^&$){W5#Mb9b(kHLm`>hgw(-Io)tyBlGDYSvoLq5M*1v4NDldSuZ4EY%> zUJCMAi0t)V0|rD_iNAnxf4en$^;XKFKlO5wuyY zdDpz=Z`R--5f9i@n82a~H6x$<3GO@^%Mzg-t@ZlGcd6i;Dz7DPCazvNL@!OYZJBq9 z3U<_Gjg(nV7{pk;Lj+B-It^)Oe@#QRO@yaHZ->>$Z@Ci$#?(7$Nr|5_a|ng4@pGGB zapJV3k;RxSaYiC+-Hl^D8s`H}aRfeHdtD*%OPN$Dy4=6R0)vuPG?|p<-nO)h+Yg&B z=ZRzhOl~b^)07R{eDT)wDjFuNtCT*mB=lrS`ji!8>=)E>#sW1!JyZKl7JEv_&^id5 z&Byw;mXk(tE2G3`JWN>~MHjR&Hh13x@Oy<7`k6D?Ai=`HE${%!YR?5?Aw$!*5MQXX5e0Ypg6@J5(W2bU= zSDR-ghaHAdN*4Vf0kP>Y_kNQNkhT<%zhOP4hhkzIC)#yH6lD`_u47;{TdNlqpFy{L zx{bL2jf9doMHU{-9&ziA;QIwD5q)sWXMW{6ME`J_-ECT~qrZRPmfV_MwT5`*0P)>i zlOH-{f53P)?)r6_D6g~2>7QJGNdMS3LJmZ;MVr~Pxh~U1 zm}M=RA*@6#wC1}2S}E*Qltn8&JxH?sp_m8kG1DEP%Wb7966cMu&(0`SqRA|>NbrKS=qT(q zmUrQ(+i~e8)H*D>59Spz_t;dbZMtoCmM*#pLD8I@w?1`{JE@81*du6AZNYWczK4dK zAbP|#9^^ta zP_RZwr7Cbe#MfAQlu!KRP0?b5u%hPB+)wgX^t=YZ?^FxC2Iy#))GoCjW!8jYQT=5e95`t2qg@>zt=5B;Wf1dd<!|e)#TgtShUvsX zB^pSf`NguzIxr5(9BWzg1eJvU5s9~Ta^IQADB0{yJ`8ST8S&JnVok@%*kFe8O!(Z_ zPD)C4lFx_*<(#2Poi=A}DIu$tBqI*CM&9*=>Rm@P)uyHR){_o@IdZDDBVq2DCXfhY z0uOjL#f;9N8)WL}vnA1I*iUFXdY3SfJ9|(vF?+OIz(Mbh$}dP7f>iI$SZm_Mcc zsTLOKj{Nt$`yRdp@1TvaOC4l#92u-pc+s!n_WdM9Q%beZg8|F;`m!^GzkE(i!L|eZ zcGjNzbsZ+AGI8wtWz0}wOsH#7z(Kc)(H5Ar!Xg~>50gOl{0N+FX-)E53pH{_MMq-` z^o-jbchK*g+G-8Pngw+JKNW z-iU0fTY@lEOBhS$>nnI7rD8>rPcLDWCIL2~F(1YQbgS+CNLhve*90-~3m0@@fnetX z>yr;NKBU&0;#+B|5Qn71b_LSvv?0)f`GvGKJw^0Sc0bn^?k_I{#poM^-j+JEO+Bb> zTS;e5l&e#71`0aS(53c-i&ih^T{5-7h`{znB~MAypUgCA-JWk3N*vM@+3-4hM9%o( zNw>^i(mZEBF~elvbPKl+I#y|GGkC@3G{g`reCcGOz)wudKmfKgBpvCT-Y8EcN`uG? zMvF|MNcg`^;lwF}!s04(gY}2?=Z6JxogE39oz9m6ODyv_BeoY;6XxuX-@}|2AEt-o z=lxCw?iZyy{45<&m7g=PDj>uXdR#;&cD$=aA8G>+sEPjxhLX5$PR}^b)gXprl|FxE z2C|`gI-;7B)n)lZ-z=Xx)P%EKPv^-Oppu`eq`g5Gru@AP3BFIa@lnZdN}5L|6#d59 z2%fVoN8HY%-cE}Zn9irU!opSKcr8&SiQzPa=n2nx;;`psz7Hdh4>~B7B-+R)NZGam zJ28diOhM96=G}kFs$*Mn*=0vb`n8z`{QsueS=)cjKo;y zP1Ckt$^Vu*-8k#ZeSP7FJO|{o zmi8v>K$?^;V&Z(xZe?dP_ybScvfMLSits(m6|$`)8uol14|cTpCoJ%BIzBF=Ys=yd z#yem9!y0-wJ=d9-)4t8zJO=d#W#`=Q$YHoJ8GY?{C&4Otq@^M7vk)c{K|Yv7!iIR8 z;#HqBFk%|xWLAYqx3jsq>9d&&%C)VQEH_`W-Oc+g_2~*jPuP(^WJj9MwR3L3DLHm~ zrrHX%5J{n+9r!!c=6bNA()rE&p)cYG{6ACxt7kD!Qs{U9a_c)iYDZO*C;8%eyd1HZ SlpQ8yL~HaPn$8QqqW=pUi56P` literal 0 HcmV?d00001 diff --git a/locale/sk/LC_MESSAGES/bittorrent.po b/locale/sk/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..22f955d --- /dev/null +++ b/locale/sk/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2782 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-09 10:11-0800\n" +"Last-Translator: patrik r \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Nainštalujte si Python 2.3 alebo novší" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Je potrebné rozhranie PyGTK 2.4 alebo novšie" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Zadaj torrent URL" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Zadaj URL torrent súboru na otvorenie" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "dialup" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cable 128k alebo lepší" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cable 256k alebo lepší" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k alebo lepší" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maximálna uploadovacia rýchlosť" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Dočasne zastav všetky bežiace torrenty" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Pokračuj v sťahovaní" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pozastavené" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "ziadne torrenty" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Beží normálne" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "za firewallom/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Nová %s verzia dostupná" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Novšia verzia %s je dostupná.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Používate verziu %s a nová verzia je %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Najnovšiu verziu získate vždy od\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Stiahni_neskôr" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Stiahni_teraz" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Pripomeň mi neskôr" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "O %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Verzia %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Nemohol otvorit %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Prispejte" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s log aktivity" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Ulož log do:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "log uložený" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "obsah logu vyčistený" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s nastavenia" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Ukladanie" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Ukladaj nove downloady do:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Zmeniť..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Pýtať sa na miesto ukladania pri každom novom downloade" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Sťahovanie" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Štartovanie ďalších torrentov ručne:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Vždy zastaví _posledný bežiaci torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Vždy naštartuje torrent _paralelne" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Vždy sa spýta " + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Seedujem" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Seedovať dokončené torenty:až kým zdieľací pomer dosiahne [_] percent, alebo " +"po dobu [_] minút, čo nastane skôr." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Seedovať donekonečna" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Seedovať ostatný dokončený torrent: kým zdieľací pomer dosiahne [_] percent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Sieť" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Hľadaj voľný port:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "začínajúc portom:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "trackeru oznámiť túto IP adresu:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Nemá žiadny efekt pokiaľ nie ste na\n" +" tej istej lokálnej sieti ako tracker)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Text progress baru je vždy čierny\n" +"(vyžaduje reštart)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Ostatné" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"UPOZORNENIE: Zmena týchto nastavení môže\n" +" zabrániť %s v správnom fungovaní " + +#: bittorrent.py:986 +msgid "Option" +msgstr "Voľba" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Hodnota" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Rozšírené" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Vyberte primarny prečinok pre ukladanie downloadov" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Súbory v \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Použi" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Alokuj" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nikdy nesťahuj" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Zmenši" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Zväčši" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Súbor" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Dĺžka" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peers pre \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP adresa" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Klient" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Pripojenie" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s down" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s up" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB stiahnutých" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB uploadovaných" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% hotové" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s odhadovaný peer download" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Peer ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Potrebuje" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Priškrtený" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Potrestaný" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistický upload" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "vzdialený" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokálny" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "zlý peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d zle" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "banned" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Info pre \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Meno torrentu:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent bez trackeru)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Url, ktora sa bude ohlasovat:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", v jednom súbore" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", v %d súboroch" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Celková veľkosť:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Kúsky:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Info hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Ulož do:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Meno súboru:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Otvor adresár" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Ukáž zoznam súborov" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "ťahajte pre premiestnenie" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "kliknite pravým tlačidlom pre menu" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent info" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Odstráň torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Ukonči torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", sa bude seedovat %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", sa bude seedovat do nekonecna." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Hotovo, pomer zdieľania: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Hotovo, %s uploadovaných" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Hotovo" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent _info" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Otvor adresár" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Zoznam súborov" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Zoznam _peerov" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Zmeň umiestnenie" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Seedovať donekonečna" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Re_štart" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Hotovo" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Odstráň" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Preruš" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Ste si istý, že chcete odstrániť \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Váš pomer zdieľania pre tento torrent je %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Uploadli ste %s do tohoto torrentu." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Odstrániť tento torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Dokončené" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "ťahajte do listu pre seedovanie" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Zlyhalo" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "ťahajte do listu pre pokračovanie" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Čakám" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Aktívne" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Aktuálna up: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Aktuálna down: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Predchádzajúca up: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Predchádzajúca down: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Pomer zdieľania: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s peers, %s seeds. Celkovo z trackeru: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Distribuovane kópie: %d; Ďalšie: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Kúsky: %d celkovo, %d hotové, %d čiastočne, %d aktívne (%d prázdne)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d zlých kúskov + %s v zahodených požiadavkách" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% hotovo, %s zostáva" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Rýchlosť downloadu" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Rýchlosť uploadu" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "NA" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s naštartovaných" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Otvor torrent súbor" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Otvor torrent _URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Vytvor _nový torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pause/Play" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Koniec" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Ukáž/Skry _hotové torrenty" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Prispôsob okno aby sedelo" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Log" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Nastavenia" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Pomoc" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_O programe" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Prispejte" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Súbor" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Pohľad" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Hladaj torrenty" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(zastavené)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(viaceré)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Inštalátor %s sa už sťahuje" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Nainštalovať nový %s teraz?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Chcete teraz ukončiť %s a nainštalovať novú verziu, %s?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s pomoc je na \n" +"%s\n" +"Chceli by ste tam teraz ísť?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Ísť na web stránku s pomocou?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "V liste sa nachádza jeden dokončený torrent." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Chcete ho odstrániť?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "V zozname sa nachádza %d dokončených torrentov." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Chcete ich odstrániť všetky?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Odstrániť všetky dokončené torrenty?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Žiadne dokončené torrenty" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Nie sú tu žiadne dokončené torrenty na odstránenie." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Otvor torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Zmeň miesto ukladania pre" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Súbor už existuje!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" už existuje. Chcete vybrať iné meno?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Ulož miesto pre" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Zložka už existuje!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" už existuje. Prajete si vytvoriť identický podpriečinok v danom " +"priečinku?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globálna správa) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "Chyba %s" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Vyskytlo sa viacero chýb. Kliknite na OK pre zobrazenie logu." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Zastaviť torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Idete spustiť \"%s\". Chcete taktiež zastaviť posledný aktívny torrent?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Už ste prispeli?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Vitajte v novej verzii %s. Už ste prispeli?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Ďakujem!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Ďakujem za príspevok! Ak chcete prispieť znovu, vyberte \"Príspevok\" z menu " +"\"Pomoc\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "zastaralé, nepoužívajte" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Nepodarilo sa vytvoriť alebo poslať príkaz cez existujúci ovládací socket." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Zatvorenie všetkých okien %s by ten problém mohlo vyriešiť." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s je už aktívne" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Nepodarilo sa poslať príkaz cez existujúci ovládací socket." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Nieje možné spustiť TorrentQueue, skontrolujte možné chyby" + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s tvorca torrent súboru %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Vytvor torrent pre tento súbor/adresár:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Vyber..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Z adresárov budú batch torrenty)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Veľkosť kúsku:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Použi _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Použi _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Uzly (nepovinné):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Komentáre:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Vytvor" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Host" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Vytváraju sa torrenty..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Kontrolujú sa veľkostí súborov..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Začať seedovanie" + +#: maketorrent.py:540 +msgid "building " +msgstr "vytvára sa" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Dokončené." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Dokončené vytváranie torrentov." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Chyba!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Chyba vo vytváraní torrentov" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dní" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 deň %d hodín" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d hodín" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minút" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d sekúnd" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 sekúnd" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s pomoc" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Často kladené otázky:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Choď" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Vyberte si existujúci adresár..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "všetky súbory" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "torrenty" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "vytvor nový adresár" + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "vyber súbor" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "vyber adresár" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Nepodarilo sa načítať uložený stav:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Nepodarilo sa uložiť stav UI:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Chybný obsah stavového súboru" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Chyba pri čítaní súboru" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "nepodarilo sa obnoviť stav úplne" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Chybný stavový súbor (duplicitné záznamy)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Poškodené dáta v" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", nemožno obnoviť torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Chybný stavový súbor (zlý záznam)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Chybný stavový súbor UI" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Chybná verzia stavového súboru UI" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "Nepodporovaná verzia stavového súboru UI (z novšieho klienta?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Nepodarilo sa zmazať cacheovaný %s súbor:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Toto nie je platný torrent súbor. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Tento torrent (alebo torrent s rovnakým obsahom) je už aktívny." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Tento torrent (alebo torrent s rovnakým obsahom) už čaká vo fronte." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent v neznámom stave %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Nepodarilo sa zapísať súbor" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrent nebude reštartovaný korektne pri reštarte klienta" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Nemožno mať aktívnych viac ako %d torrentov naraz. Pre viac informácií si " +"prečítajteFAQ na %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Neštartujem torrent, vo fronte už sú iné torenty a tento už splnil podmienky " +"pre ukončenie seedovania." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Neštartujem torrent, pretože už splnil podmienky pre ukončenie seedovania." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Nepodarilo sa získať najnovšiu verziu z %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Nepodarilo sa prečítať reťazec novej verzie z %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Nepodarilo sa nájsť žiadne vhodné dočasné umiestnenie pre inštalátor %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Pre inštalátor %s %s nie je dostupný žiaden torrent súbor." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "Inštalátor %s %s sa zdá byť chybný alebo chýba." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Inštalátor sa nedá spustiť na tomto operačnom systéme." + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"adresár, v ktorom sú uložené dáta s premennými ako napr. fastresume a GUI. " +"Defaultne je to podadresár 'data' v bittorent config adresári." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"kódovanie znakov v lokálnom súborovom systéme. Pre autodetekciu ponechajte " +"prázdne. Autodetekcia nefunguje so staršou verziou pythonu ako 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "ISO kód jazyku ktorý sa má používať" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ip, ktorá sa bude ohlasovať trackeru (nemá žiadny účinok, pokiaľ nie ste na " +"rovnakej lokálnej sieti ako tracker)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"port viditeľný z internetu, ak sa odlišuje od toho, na ktorom klient počúva " +"lokálne" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "minimálny port na ktorom počúvat, zvyšuje sa ak je nedostupný" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "maximálny port na ktorom počúvať" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "lokálna ip na ktorej počúvať" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekúnd medzi obnovovanim zobrazovaných informácií" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minút čakať medzi vyžiadaním viac peerov" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "minimálny počet peerov, kedy nežiadať o ďalších" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "počet peerov pri ktorom už nežiadať o nové spojenia" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maximálny počet spojení, po dosiahnutí tohoto čísla budú všetky nové " +"prichádzajúce spojenia zatvárané" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "či kontrolovať kontrolné súčty na disku" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maximálna rýchlosť uploadu, 0 - bez limitu" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "počet uploadov pre naplnenie extra optimistickými unchoke-mi" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"maximálny počet súborov otvorených vo viacsúborových torrentoch, 0 - bez " +"limitu. Používa sa k predídeniu nedostatku súborových deskriptorov." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicializuj clienta bez trackerov. Toto musi byt povolene aby ste mohli " +"stahovat torrenty bez trackerov." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "počet sekúnd medzi posielaním keepalive paketov" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "aký počet bajtov načítať počas jednej požiadavky." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"maximálna dĺžka prefixového kódovania, ktorú akceptujete - vyššie hodnoty " +"vyústia do prerušenia spojenia." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "počet sekúnd do zatvorenia socketov z ktorých neprišli žiadne dáta" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"počet sekúnd medzi kontrolami, či niektorým spojeniam nevypršal časový limit" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maximálna dĺžka kúsku, ktorý pošleme peerovi; ukončíme spojenie, ak príde " +"požiadavka na väčší" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"maximálny časový interval, na ktorom odhadujeme rýchlosti uploadu a downloadu" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "maximálny časový interval, na ktorom odhadujeme seedovací pomer" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "maximálny čas čakania medzi skúšaním ohlasovaní ak zlyhávaju" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"sekúnd čakať na dáta, ktoré pridu cez spojenie, pred usúdením, že je semi-" +"permanentne priškrtená" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"počet downloadov pri ktorých zmeniť metódu z \"random\" (náhodný) na " +"\"rarest first\" (najvzácnejší prvý)" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "koľko bajtov zapisovať do sieťových bufferov naraz." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"odmietnuť ďalšie spojenia od adries s pokazenými alebo zámerne " +"nepriateľskými peermi, ktorí posielajú nesprávne dáta" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "nepripájať sa na viac peerov s tou istou IP adresou" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"ak je táto hodnota nenulová, nastaviť TOS pre spojenia s peermi na túto " +"hodnotu" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"povoliť obchádzanie chyby v BSD libc, ktorá veľmi spomaľuje čítanie súborov." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "adresa HTTP proxy servera pre použitie na spojenie s trackerom" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "ukončiť spojenia s RST a zabrániť stavu TCP TIME_WAIT" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Použi združené sieťové knižnice pre sieťové pripojenie. 1 znamená použiť " +"združené knižnice, 0 znamená nepoužiť združené knižnice, -1 znamená " +"autodetekovať, a uprednostniť združené knižnice" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"meno súboru (pre jednosúborové torrenty) alebo adresár (pre skupinu " +"torrentov) do ktorého uložiť torrent ako, prednastavené meno torrentu.Pozri " +"tiež--save_in, ak nie je uvedené ani jedno, spýtať sa používateľa na " +"umiestnenie" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "zobraziť rozhranie pre pokročilých užívateľov" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"najväčší počet minút seedovania dokončeného torrentu pred zastavením " +"seedovania" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"minimálny pomer upload/download, v %, ktorý treba dosiahnuť na zastavenie " +"seedovania. 0 - bez limitu." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"minimálny pomer upload/download, v %, ktorý treba dosiahnuť na zastavenie " +"seedovania posledného torrentu. 0 - bez limitu." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Seedovať každý dokončený torrent nekonečne dlho (až kým ho používateľ " +"nezruší)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Seedovať posledný dokončený torrent nekonečne dlho (až kým ho používateľ " +"nezruší)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "štartovať downloader v pozastavenom stave" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"špecifikuje ako sa ma aplikácia chovať ked sa používateľ snaží spustiť nový " +"torrent: \"nahraď\" znamená vždy nahradiť bežiaci torrent novým, \"pridať\" " +"znamená že sa pridá k už spusteným torrentom pararelne a \"spýtať sa\" " +"znamená že sa program vždy spýta čo má robiť." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"mano súboru (pre jednosúborové torrenty) alebo meno adresára (pre skupinu " +"torrentov) pre uloženie torrentu,pomocou prednastaveného mena torrentu. " +"Pozri taktiež --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"Maximum súčastne bežiacich uploadov. -1 znamená (dúfajme) primeraný počet " +"uploadov založený na --max_upload_rate.Automatické hodnoty sú účinné len " +"vtedy keď máte spustený iba jeden torrent." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"miestny adresár kde bude uložený obsah torrentu. Súbor (jednosúborové " +"torrenty) alebo adresár (skupina torrentov) bude vytvoreny v tomto " +"umiestnení použitím predvoleného mena napísaného v .torrent súbore. Pozri " +"tiež -- save_as" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "pýtať sa alebo nepýtať na umiestnenie stiahnutých súborov " + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"miestny adresár kde budú uložené torrenty, použitím mena zisteného v--" +"saveas_style. Ak je ponechaný volný jednotlivý torrent bude uložený pod " +"adresár príslušného .torrent súboru" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "ako často sa má skenovať priečinok s torrentmi, v sekundách." + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Ako nazvať torrent downloads: 1:použiť meno torrent súboru (minus .torrent);" +"použiť meno zakódované v torrent súbore;3:vytvoriť adresár z mena torrent " +"súboru(minus .torrent)a uložiť ho v tomto adresári použitím mena " +"zakódovaného v torrent súbore;4:ak meno torrent súboru(minus .torrent) a " +"meno zakódované v torrent súbore sú rovnaké, použi toto meno(názvom 1/2)," +"alebo vytvor pomocný adresár podla bodu 3;UPOZORNENIE:možnosti 1 a 2 majú " +"schopnosť prepísať súbory bez varovania a môžu vyvolať bezpečnostné otázky." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "Zobrazovať plnú cestu alebo obsah torrentu pre každý torrent." + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "adresár kde hľadať .torrent súbory (polo-rekruzívne)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "zobrazovať kontrolné informácie do stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "Zakladne meno trackera." + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"ak spadne urobiť stopovací torrent,namiesto predpovedanej URL,použiť " +"spolahlivý uzol v tvare : alebo prázdny reťazec na načítanie uzlov " +"z vašej smerovacej tabulky" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "Stahovanie ukoncene!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "konci za %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "stahovanie sa podarilo" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d doteraz videný" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "CHYBA:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "ukladám:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "veľkosť súboru:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "percentuálne dokončené" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "ostávajúci čas:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "stiahnuť do:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "rýchlosť sťahovania" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "rýchlosť odosielania:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "odhad zdielania:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "stav rýchlosti:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "stav zdielania:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Nemôžete špecifikovať oboje --save_as a --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "vypínam" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "CHYBA pri načítaní konfiguračného súboru:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "CHYBA pri načítaní .torrent súboru:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "musíte určiť .torrent súbor" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Spustenie textového módu GUI zlyhalo, nemožno pokračovať." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Ešte stále možte použit \"bittorrent-panel\" na stiahnutie." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "súbor:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "veľkosť:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "cieľ:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "priebeh:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "stav:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "rýchlosť sťahovania:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "rýchlosť odosielania:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "zdielanie:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "pôvod:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "chyby:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "chyba:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "#IP odoslané stiahnuté dokončené rýchlosť" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "stahujete %d častí,máte %d fragmentov,%d z %d častí dokončených" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Tieto chyby sa vyskytli počas realizácie:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "staré oznámenia pre %s:%s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "žiadne torrenty" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTÉMOVÁ CHYBA - NÁMIETKA VYGENEROVANÁ" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Pozor:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "toto nieje adresár" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"chyba: %s\n" +" spustiť bez argumentov pre parametrické vysvetlenie" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +" VÝNIMKA:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Môžete stále využiť \"btdownloadheadless.py\" pre stiahnutie." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Veľkosť" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Stiahnuť" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Odoslať" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Súhrn:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "chyba" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +" spustiť bez argumentov pre parametrické vyjadrenie" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "voliteľná možnosť vložiť čitateľnú poznámku v .torrent súbore" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "voliteľný cieľový súbor pre torrent" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - dekódovať %s metainfo súbory" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "využívanie: %s [TORRENTFILE[TORRENTFILE ... ]]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "metainfo súbor: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "meno súboru: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "veľkosť súboru:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "súbory:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "meno adresára: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "veľkosť archívu:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "komentár:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Nepodarilo sa citat %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Nepodarilo sa stiahnut/otvorit\n" +"%s\n" +"Skuste pouzit web browser na stiahnutie torrent suboru." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Toto sa zdá byť stará verzia Python ktorá nepodporuje detekciu zakódovaného " +"súboru.Predpokladanie ´ascii´" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python zlyhal pri autodetekcii zakódovaného súboru.Namiesto použitia ´ascii´" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Kódovanie súboru ´%s´ nieje podporované.Namiesto použitia ´ascii´" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Zlá ceta k súborovej zložke:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Tento .torrent súbor bol vytvorený poškodeným nástrojom a nesprávne " +"zakódoval mená súborov.Časť alebo všetky mená súborov sa možu líšiť od " +"pôvodných názvov ktoré im dal tvorca .torrent súboru. " + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "" diff --git a/locale/sl/LC_MESSAGES/bittorrent.mo b/locale/sl/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..74a28492b82c76dde60f4d7233744f94a242c680 GIT binary patch literal 48562 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 z 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, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-14 06:00-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: Slovenian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Namestite Python 2.3 ali novejši" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Potreben je PyGTK 2,4 ali novejši" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Vnesite povezavo do torrent datoteke" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Vnesite URL povezavo do torrent datoteke za odpiranje:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "klicni dostop" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "Kabel/DSL 128k gor" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "Kabel/DSL 256k gor" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k gor" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Največja hitrost pošiljanja:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Začasno ustavi vse delujoče torrente" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Nadaljuj prenašanje" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Ustavljeno" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Brez torrentov" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Normalno delovanje" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Za požarnim zidom/NAT" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Na voljo je nova različica %s" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Na voljo je novejša različica %s.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Uporabljate različico %s, na voljo je različica %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Najnovejšo različico lahko vedno dobite na\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Prenesi _pozneje" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Prenesi _zdaj" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Opomni me pozneje" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "O %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Različica %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "%s ni bilo mogoče odpreti" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Vaš prispevek" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Dnevnik dejavnosti za %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Shrani dnevnik v:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "dnevnik shranjen" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "dnevnik izpraznjen" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Nastavitve za %s" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Shranjevanje" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Shrani prenesene datoteke v:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Spremeni..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Vprašaj, kam naj se shrani vsak nov prenos" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Prenašanje" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Ročno zaganjanje dodatnih torrentov:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Vedno zaustavi _nazadnje zagnan torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Vedno zažene torrent v_zporedno" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "Vsakokrat _vpraša" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Sejanje" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Sej zaključene torrente: dokler razmerje izmenjave ne doseže [_] odstotkov " +"ali vsaj [_] minut – kar koli se zgodi prej." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Sej za nedoločen čas" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Sej nazadnje zaključen torrent: dokler razmerje izmenjave ne doseže [_] " +"odstotkov." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Omrežje" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Najdi razpoložljiva vrata:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "začni z vrati: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "Sledilniku sporoči ta IP:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Učinkuje samo, če ste v istem krajevnem\n" +" omrežju kot sledilnik)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Besedilo o prikazu napredka je vedno črno\n" +" (potreben ponovni zagon)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Razno" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"OPOZORILO: Spreminjanje teh nastavitev lahko\n" +"povzroči nepravilno delovanje programa %s." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Možnost" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Vrednost" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Napredno" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Izbor privzete mape za prenose" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Datoteke v »%s«" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Uveljavi" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Dodeli" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Nikoli ne prenesi" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Zmanjšaj" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Povečaj" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Ime datoteke" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Velikost" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Vrstniki za »%s«" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP naslov" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Odjemalec" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Povezava" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s dol" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s gor" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB dol" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB gor" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% dokončano" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "Približen vrstnikov sprejem (KB/s)" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID vrstnika" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Zanimanje" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Zamašeno" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Zavrnjeno" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistično pošiljanje" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "oddaljeno" + +#: bittorrent.py:1358 +msgid "local" +msgstr "krajevno" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "slab vrstnik" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d v redu" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d slabo" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "izobčen" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "v redu" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Podatki za »%s«" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Ime torrenta:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(torrent brez sledilnika)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "URL objave:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", v eni datoteki" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", v %d datotekah" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Skupna velikost:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Delcev:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Izvleček:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Shrani v:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Ime datoteke:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Odpri mapo" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Prikaži seznam datotek" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "povleci za razvrščanje" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "desni klik za meni" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Podatki o torrentu" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Odstrani torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Prekliči torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", sejanje še %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", sejanje za nedoločen čas." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Zaključeno, razmerje izmenjave: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Zaključeno, poslano %s" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Zaključeno" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Podatki o torrentu" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Odpri mapo" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Seznam _datotek" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "Seznam _vrstnikov" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Spremeni mesto" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "Sej za _nedoločen čas" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Ponovni _zagon" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Zaključi" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "Ods_trani" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "P_rekliči" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Ste prepričani, da želite odstraniti »%s«?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Razmerje izmenjave za ta torrent je %d%%. " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Poslali ste %s tega torrenta. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Odstranim ta torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Zaključeno" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "povlecite na seznam za sejanje" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Ni uspelo" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "povlecite na seznam za nadaljevanje" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Čakanje" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Prenašanje" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Trenutno gor: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Trenutno dol: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Prej gor: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Prej dol: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Razmerje izmenjave: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s vrstnikov, %s semen. Skupno: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Porazdeljenih kopij: %d. Naslednje: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Delcev: %d skupno, %d zaključenih, %d delnih, %d dejavnih (%d praznih)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d slabih delcev + %s v zavrženih zahtevkih" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% zaključeno, %s do konca" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Hitrost prenosa" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Hitrost pošiljanja" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "–" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s zagnan" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Odpri torrent datoteko" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Odpri _URL do torrenta" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "_Ustvari nov torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Zaustavi/nadaljuj" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Končaj" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "_Prikaži/skrij zaključene torrente" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Velikost okna prilagodi vsebini" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Dnevnik" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Nastavitve" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Pomoč" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_O" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "P_rispevek" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Datoteka" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "Pogl_ed" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Iskanje torrentov" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(ustavljeno)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(več)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Namestitev za %s se že prenaša" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Naj zdaj namestim novi %s?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Želite zdaj zapreti %s in namestiti novo različico %s?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Pomoč za %s je na spletni strani \n" +"%s\n" +"Jo želite obiskati?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Želite obiskati spletno stran s pomočjo?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Na seznamu je en zaključen torrent. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Ga želite odstraniti?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Na seznamu je %d zaključenih torrentov. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Jih želite odstraniti?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Želite odstraniti vse zaključene torrente?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Ni zaključenih torrentov" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Za odstranitev ni na voljo nobenega zaključenega torrenta." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Odpri torrent" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Spremeni lokacijo za shranjevanje za" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Datoteka obstaja!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "»%s« že obstaja. Želite izbrati drugačno ime datoteke?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Lokacija za " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Mapa obstaja!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"»%s« že obstaja. Ali nameravate v obstoječi mapi ustvariti identično, " +"podvojeno mapo?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globalno sporočilo) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "Napaka %s" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Prišlo je do več napak. Kliknite »V redu« za ogled dnevnika z napakami." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Naj zaustavim torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "Zagnali boste »%s«. Želite zaustaviti nazadnje zagnani torrent?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Ste že prispevali?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Dobrodošli v novi različici programa %s. Ste že prispevali?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Hvala!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Hvala za prispevek! Za ponovno prispevanje v meniju »Pomoč« izberite " +"»Prispevek«." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "neodobreno, ne uporabljajte" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Ni bilo mogoče ustvariti ali poslati ukaza skozi obstoječo nadzorno vtičnico." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "To težavo lahko odpravi zaprtje vseh oken %s." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s se že izvaja" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Ukaza ni bilo mogoče poslati skozi obstoječo nadzorno vtičnico." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "" +"Čakalne vrste za torrent (TorrentQueue) ni mogoče zagnati, zgoraj lahko " +"vidite napake." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s ustvarjalec torrentov %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Ustvari torrent za to datoteko/mapo:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Izberi ..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Mape bodo postale paketni torrenti)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Velikost delca:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Uporabi _sledilnik:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Uporabi D_HT" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Vozlišča (ni obvezno):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Komentar:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Ustvari" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Gostitelj" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Vrata" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Ustvarjanje torrentov..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Preverjanje velikosti datotek ..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Prični sejati" + +#: maketorrent.py:540 +msgid "building " +msgstr "ustvarjanje " + +#: maketorrent.py:560 +msgid "Done." +msgstr "Zaključeno." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Ustvarjanje torrentov je zaključeno." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Napaka!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Napaka pri ustvarjanju torrentov: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dni" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dan %d ur" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d %02d ur" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minut" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d sekund" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 sekund" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "Pomoč za %s" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Pogosta vprašanja:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Pojdi" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Izberi obstoječo mapo..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Vse datoteke" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrenti" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Ustvari novo mapo..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Izberite datoteko" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Izberite mapo" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Shranjenega stanja ni mogoče naložiti:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Stanja uporabniškega vmesnika ni mogoče shraniti:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "vsebina datoteke s stanjem ni veljavna" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Napaka pri branju datoteke " + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "stanja ni mogoče povsem obnoviti" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Neveljavna datoteka s stanjem (podvojen vnos)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Pokvarjeni podatki v " + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr " , ni mogoče obnoviti torrenta (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Neveljavna datoteka s stanjem (napačen vnos)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Napačna datoteka s stanjem uporabniškega vmesnika" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Napačna različica datoteke s stanjem uporabniškega vmesnika" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Nepodprta različica datoteke s stanjem uporabniškega vmesnika (od novejše " +"različice odjemalca?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Datoteke %s, ki je v predpomnilniku, ni mogoče izbrisati:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "To ni veljavna torrent datoteka. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Ta torrent (ali nek drug z enako vsebino) se že prenaša." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Ta torrent (ali nek drug z enako vsebino) že čaka v vrsti." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent v neznanem stanju %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Datoteke ni mogoče zapisati" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "po ponovnem zagonu odjemalca torrent ne bo pravilno zagnan" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Istočasno se ne more izvajati več kot %d torrentov. Več o tem si oglejte na %" +"s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Torrent ne bo zagnan, ker na zagon čakajo drugi torrenti. Ta torrent pa že " +"ustreza nastavitvam za zaustavitev sejanja." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Torrent ne bo zagnan, ker ta torrent že ustreza nastavitvam za zaustavitev " +"sejanja." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Ni mogoče dobiti najnovejše različice od %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Ni mogoče razčleniti niza z novo različico od %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Ni mogoče najti ustreznega začasnega prostora za shranitev namestitve za %s %" +"s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Ni mogoče najti datoteke torrent za namestitev za %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "" +"Videti je, da je namestitev za %s %s poškodovana, ali pa je ni mogoče najti." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "V tem operacijskem sistemu ni moč zagnati namestitve" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"mapa, v kateri so shranjeni spremenljivi podatki, npr. o hitrem nadaljevanju " +"in stanju uporabniškega vmesnika. Privzeto podmapa »data« v mapi z " +"nastavitvami za BitTorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"kodiranje znakov, ki je v uporabi v krajevnem datotečnem sistemu. Če je " +"prazno, je zaznava samodejna (potreben Python 2.3 ali novejši)." + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "ISO koda jezika, ki naj se uporabi" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"IP za prijavo sledilniku (nima učinka, če niste v istem krajevnem omrežju " +"kot sledilnik)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"globalno prikazana številka vrat, če se razlikuje od vrat, s katerimi je " +"odjemalec povezan krajevno" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "najmanjša št. vrat za povezavo, če je nedosegljiva, se poveča" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "največja št. vrat za povezavo" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "IP za lokalno povezavo" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekund med posodobitvijo prikazanih informacij" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minut za čakanje, pred zahtevanjem več vrstnikov" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "najmanjše število vrstnikov, brez ponavljanja zahteve" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "" +"število vrstnikov, pri katerih naj se ustavi vzpostavljanje novih povezav" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"največje število dovoljenih povezav, ostale prihajajoče povezave bodo takoj " +"prekinjene" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "preverjanje izvlečkov (hash) na disku" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "" +"najvišja možna hitrost pošiljanja podatkov (v kB/s), 0 pomeni brez omejitve" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "" +"število poslanih datotek za zapolnitev z zelo optimističnimi odmašenimi " +"datotekami" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"največje število datotek v torrentu z več datotekami, ki naj bodo odprte " +"istočasno, 0 pomeni brez omejitev. S tem lahko preprečite, da zmanjka " +"datotečnih deskriptorjev" + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Inicializiraj odjemalca brez sledilnika. To mora biti omogočeno, če želite " +"prenesti torrente brez sledilnika." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"število sekund za zaustavitev med pošiljanjem datotek, ki jih želite " +"obdržati aktivne" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "za koliko bajtov naj se poizveduje v vsaki zahtevi." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"kodiranje najdaljše dolžine predpone, ki ga boste sprejeli prek povezave - " +"višje vrednosti prekinejo povezavo." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"sekund za čakanje med zapiranjem vtičnic, prek katerih nisem prejel ničesar" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"sekund za čakanje med preverjanjem, če je časovna omejitev katere koli " +"povezave potekla" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"največja velikost kosa za pošiljanje vrstnikom, zapri povezavo, če prejmeš " +"večjo zahtevo" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"najdaljše časovno obdobje, po katerem oceni trenutne hitrosti pošiljanja in " +"prenosa" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "najdaljše časovno obdobje, po katerem oceni trenutno hitrost sejanja" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"najdaljši čas za čakanje med ponovnim poskušanjem objav, če ne uspevajo" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"sekund za čakanje, da podatki pridejo prek povezave, preden velja, da je na " +"pol trajno zamašeno" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"število prenosov, pri katerem preklopi iz naključnega v najprej najmanj " +"pogosti" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "koliko bajtov naj se naenkrat zapiše v omrežni medpomnilnik." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"zavrni nadaljnje povezave z naslovov s prekinjenimi ali namerno škodljivimi " +"vrstniki, ki pošiljajo nepravilne podatke" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "ne povezuj se z več vrstniki, ki imajo isti naslov IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "če ni nič, nastavi možnost TOS za povezave z vrstniki na to vrednost" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"omogoči metodo, ki obide hrošča v knjižnici BSD libc, ki naredi branje " +"datotek zelo počasno." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "naslov HTTP proxyja za povezavo do sledilnika" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "zapri povezave z RST in se izogibaj stanja TCP TIME_WAIT (čakalni_čas)" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Za omrežne povezave uporabi Zavite omrežne knjižnice. 1 pomeni uporabo " +"zavitih, 0 pomeni, naj se ne uporabljajo zavite, -1 pomeni samodejno " +"zaznavanje in dajanje prednosti zavitim" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"ime datoteke (za torrente z eno datoteko) ali ime mape (za paketne " +"torrente), kakor naj se shrani torrent, s čimer se prepiše privzeto ime v " +"torrentu. Oglejte si tudi --save_in (shrani_v), če nič od tega ni " +"določenega, bo uporabnik vprašan za mesto shranjevanja" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "prikaži napredni uporabniški vmesnik" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"največje število minut za sejanje dokončanega torrenta, preden se zaustavi" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"najmanjše razmerje pošiljanja/prenosa v odstotkih, ki naj se doseže, preden " +"se sejanje zaustavi. 0 pomeni brez omejitve." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"najmanjše razmerje pošiljanja/prenosa v odstotkih, ki naj se doseže, preden " +"se sejanje zadnjega torrenta zaustavi. 0 pomeni brez omejitev." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "Sej vsak dokončan torrent za nedoločen čas (do preklica)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Sej zadnji torrent za nedoločen čas (do preklica)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "prenašanje zaženi v zaustavljenem stanju" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"določa, kako naj se aplikacija obnaša, ko uporabnik poskuša ročno zagnati " +"drug torrent: »zamenjaj« pomeni, da se delujoči torrent vedno zamenja z " +"novim, »dodaj« pomeni, da se delujoči torrent vedno doda vzporedno, " +"»vprašaj« pa pomeni, da je treba uporabnika vsakič vprašati" + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"ime datoteke (za torrente z eno datoteko) ali ime mape (za paketne " +"torrente), kakor naj se shrani torrent, s čimer se prepiše privzeto ime v " +"torrentu. Oglejte si tudi --save_in (shrani_v)" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"največje število datotek, ki se lahko pošiljajo hkrati. -1 pomeni " +"(pričakovano) sprejemljivo število, ki temelji na --max_upload_rate " +"(največja_hitrost_pošiljanja). Samodejne vrednosti so občutne samo, ko " +"naenkrat deluje samo en torrent." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"krajevna mapa, kamor bo shranjena vsebina torrenta. V tej mapi bo ustvarjena " +"datoteka (torrenti z eno datoteko) ali mapa (paketni torrenti) s privzetim " +"imenom, ki je določeno v .torrent datoteki. Oglejte si tudi -- save_as " +"(shrani_kot)." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "naj vprašam, kam želite shraniti prenose" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"krajevna mapa, kamor bodo shranjeni torrenti z imenom, ki jih določa --" +"saveas_style (stil_shranjevanja_kot). Če to ostane prazno, bo vsak torrent " +"shranjen v mapo ustrezne .torrent datoteke" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "kako pogosto (v sekundah) naj pregledam torrent mapo" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Kako poimenovati prenose torrentov: 1: uporabi ime torrent datoteke (brez ." +"torrent); 2: uporabi ime, ki je zakodirano v torrent datoteki; 3: ustvari " +"mapo z imenom torrent datoteke (brez .torrent) in v to mapo shrani z imenom, " +"ki je zakodirano v torrent datoteki; 4: če sta ime torrent datoteke (brez ." +"torrent) in ime, ki je zakodirano v torrent datoteki, enaka, uporabi to ime " +"(slog 1/2), drugače pa ustvari vmesno mapo kot v slogu 3; POZOR: možnosti 1 " +"in 2 lahko datoteke prepišeta brez opozorila in predstavljata varnostno " +"tveganje." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "ali naj se prikaže celotna pot ali vsebina torrenta za vsak torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "mapa kjer naj iščem .torrent datoteke (pol-rekurzivno)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "ali naj se prikažejo diagnostični podatki na standardnem izhodu" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "za katero od dveh sil naj nastavim velikost delca" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "privzeto ime sledilnika" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"če je napačno, ustvari torrent brez sledilnika, namesto URL-ja objave pa " +"uporabi zanesljivo vozlišče v obliki : oziroma prazen niz za " +"pridobitev nekaterih vozlišč iz usmerjevalne tabele" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "prenos končan!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "končano bo čez: %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "prenos uspel" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB poslanih / %.1f MB prejetih)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB poslanih / %.1f MB prejetih)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d videnih zdaj" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "NAPAKA:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "shranjujem:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "velikost datoteke:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "odstotkov končano:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "čas do konca:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "shrani v:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "hitrost prenosa:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "hitrost pošiljanja:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "stanje sejanja:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "stanje vrstnikov:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Ne morete istočasno določiti --save_as in --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "ustavljanje" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Napaka pri branju konfiguracijske datoteke:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Napaka pri branju .torrent datoteke:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "predložiti morate .torrent atoteko" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "" + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "datoteka:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "velikost:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "cilj:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "napredek:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "stanje:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "hitrost prenosa:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "hitrost pošiljanja:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "delite:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "sejalnikov:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "vrstnikov:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d videnih, dodatno %d distribuiranih kopij(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "napaka(e):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "napaka:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Pošiljanje Sprejemanje Končano Hitrost" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "prenašam %d delcev, imam %d fragmentov, %d od %d delcev končanih" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Napake ki so se dogodile med izvajanjem:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uporaba: %s URL_SLEDILNIKA [TORRENT [TORRENT ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "stara objava za %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "ni torrentov" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "opozorilo:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "ni mapa" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Še vedno lahko uporabite \"btdownloadheadless.py\" za prenos." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Ocena prihoda v %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Velikost" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Prenos" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Pošlji" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Skupaj:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "napaka:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "vstavi berljiv komentar v .torrent, po izbiri" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - dekodira datoteke z metapodatki za %s" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Uporaba: %s [TORRENT [TORRENT ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "datoteka z metapodatki: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "izvleček: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "ime datoteke: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "velikost datoteke:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "datoteke: " + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "ime mape: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "velikost arhiva:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "URL objave: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "komentar:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Ni bilo mogoče poslati ukaza:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "neveljaven benkodiran niz" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "neveljavna benkodirana vrednost (podatki za veljavnim predlogom)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Poraba: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argumenti so -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(privzeto v" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "neznana tipka" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "preverjanje vnosne vrstice se je ponesrečilo pri" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Nastavitev %s je potrebna" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Preveč argumentov - %d največ." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "napačen format %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Nastavitve ne bodo ostale shranjene:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Objava sledilnika po %d sekundah še vedno ni zaključena" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Težava pri povezovanju s sledilnikom, gethostbyname ni uspel -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Težava pri povezovanju s sledilnikom - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "napačni podatki sledilnika - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "zavrnitev s strani sledilnika - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Preklic torrenta, ker ga je sledilnik zavrnil in ni povezave z nobenim " +"vrstnikom. " + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Sporočilo sledilnika: " + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "opozorilo sledilnika - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Ni mogoče prebrati mapo" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**opozorilo** %s je dvojniški torrent za %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**opozorilo** %s vsebuje napake" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... uspešno" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "odstranjam %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "končano preverjanje" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "strežniška vtičnica izgubljena" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Napaka pri ravnanju s sprejeto povezavo: " + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Zaradi nezanesljivega sklada TCP je potreben izhod. Več o tem na strani %s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Pon" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Tor" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Sre" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Čet" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Pet" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Sob" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Ned" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Maj" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Avg" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Okt" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dec" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Stisnjeno: %i Razširjeno: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Kodiranje datotečnega sistema \"%s\" ni podprto v tej verziji" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "napačni podatki v datoteki z odgovorom - celota premajhna" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "napačni podatki v datoteki z odgovorom - celota prevelika" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "preverjanje obstoječe datoteke" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 0 ali pa se podatki za hitro nadaljevanje ne ujemajo s " +"stanjem datoteke (manjkajoči podatki)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "" +"Napačni podatki za hitro nadaljevanje (datoteke vsebujejo več podatkov)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Napačni podatki za hitro nadaljevanje (napačna vrednost)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "podatki na disku so pokvarjeni - mogoče tečeta dve kopiji?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Ni moč prebrati podatkov za hitro nadaljevanje: " + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"ob zagonu je bila datoteka zaključena, a je preverjanje izvlečka spodletelo" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Datoteka %s pripada drugemu torrentu, ki že teče" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Datoteka %s že obstaja, a ni pravilna datoteka" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Kratko branje - so bile datoteke obrezane?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Nepodprta oblika datoteke za hitro nadaljevanje. Mogoče je iz druge " +"različice odjemalca?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "odvržen \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "dodan \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "prenašam" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Ponovno berem konfiguracijsko datoteko" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Ni moč zapisati datoteke %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Ni mogoče prenesti ali odpreti \n" +"%s\n" +"Poskusite z prenesti torrent z drugim brskalnikom." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Izgleda, da imate staro različico Python-a, ki ne podpira samodejnega " +"zaznavanja kodiranja znakov. Privzemam »ASCII«." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python ni uspel samodejno zaznati kodiranja znakov. Uporabljam »ASCII«." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Kodiranje znakov »%s« ni podprto. Uporabljam »ASCII«." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Napačna pot do datoteke: " + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Ta datoteka .torrent je bila ustvarjena s pokvarjenim programom in ima " +"napačno zakodirana imena datotek. Nekatera ali vsa imena datotek so lahko " +"prikazana drugače, kot si je zamislil ustvarjalec datoteke .torrent." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Ta datoteka .torrent je bila ustvarjena s pokvarjenim programom in vsebuje " +"napačne vrednosti za znake, ki ne ustrezajo nobenemu pravemu znaku. Nekatera " +"ali vsa imena datotek so lahko prikazana drugače, kot si je zamislil " +"ustvarjalec datoteke .torrent." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Ta datoteka .torrent je bila ustvarjena s pokvarjenim programom in ima " +"napačno zakodirana imena datotek. Uporabljena imena so lahko kljub temu " +"pravilna." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Nabor znakov na krajevnem datotečnem sistemu (»%s«) ne more predstaviti vseh " +"znakov, ki so uporabljeni za imena datotek v tem torrent-u. Imena datotek so " +"bila prilagojena." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Ta datoteka .torrent je bila ustvarjena s pokvarjenim programom in vsebuje " +"vsaj eno datoteko z napačnim imenom datoteke ali mape. Ker pa imajo vse take " +"datoteke velikost 0, bodo spregledane." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Potreben je Python 2.2.1 ali novejši" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Ni moč začeti dveh ločenih kopij istega torrent-a" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Ni mogoče odpreti vrat: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Začetni zagon" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "prenos ni uspel:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"IO napaka: Ni več prostora na disku, ali pa ni mogoče ustvariti tako velike " +"datoteke:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "končano zaradi napake IO:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "končano zaradi napake OS:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Dodatna napaka ob zapiranju zaradi napake:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "sejem" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Zapis podatkov za hitro nadaljevanje ni mogoč:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "izklop" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "napačni meta-podatki - ni slovar" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "napačni meta-podatki - napačen ključ za delce" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "napačni meta-podatki - neveljavna velikost delca" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "napačni meta-podatki - napačno ime" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "ime %s ni dovoljeno iz varnostnih razlogov" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "mešanica enojne/večih datotek" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "napačni meta-podatki - napačna velikost" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "napačni meta-podatki - »files« ne vsebuje seznama datotek" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "napačni meta-podatki - napačna vrednost za datoteko" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "napačni meta-podatki - napačna pot" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "napačni meta-podatki - napačna pot za mapo" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "pot %s ni dovoljena iz varnostnih razlogov" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "napačni meta-podatki - podvojena pot" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "napačni meta-podatki - enako ime za datoteko in podmapo" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "napačni meta-podatki - napačna vrsta objekta" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "napačni meta-podatki - ni niza s povezavo za objavo" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "ne-besedilni razlog za neuspeh" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "ne-besedilno opozorilo" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "napačen vnos vrstnikov spisek1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "napačen vnos vrstnikov spisek2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "napačen vnos vrstnikov spisek3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "napačen vnos vrstnikov spisek4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "napačen spisek vrstnikov" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "napačen interval najavljanja" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "najmanjši interval najavljanja napačen" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "napačen id sledilnika" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "napačno število vrstnikov" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "napačno število sejalnikov" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"zadnji\" vnos napačen" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Vhod za povezave." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "URL za preusmeritev info strani" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "prikaz imen iz dovoljenega imenika" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"vaša datoteka morebiti obstaja kje drugje v univerzi,\n" +" toda žal, ne tukaj\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Zapisnik zagnan:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Zapisnik ponovno odprt:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Ustavljam:" diff --git a/locale/sv/LC_MESSAGES/bittorrent.mo b/locale/sv/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..579698397f20415d4890f39364b40c28af122b80 GIT binary patch literal 59760 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 PUB^>tq(07hSMq-V`&)68 literal 0 HcmV?d00001 diff --git a/locale/sv/LC_MESSAGES/bittorrent.po b/locale/sv/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..4c903c4 --- /dev/null +++ b/locale/sv/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2863 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-11 10:42-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Country: SWEDEN\n" +"X-Poedit-Language: Swedish\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Installera Python 2.3 eller senare" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 eller senare krävs" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Skriv in torrentens URL" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Skriv in URL till torrentfil för att öppna denna:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "uppringd" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cable 128k upp" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cable 256k upp" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k upp" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maximal upladdningshastighet" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Stoppa alla torrenter tillfälligt" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Fortsätt nerladdning" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Pausad" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Inga torrenter" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Körs normalt" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Brandväggad" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Ny %s version tillgänglig" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "En nyare version av %s är tillgänglig.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Du använder %s, och den nya versionen är %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Du kan alltid hitta den senaste versionen från \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Ladda ner _senare" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Ladda ner _nu" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Påminn mig senare" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Om %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Version %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Kunde inte öppna %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Donera" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Aktivitetslogg" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Spara logg i:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "logg sparad" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "logg rensad" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Inställningar" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Sparar" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Spara nya nerladdningar i:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Ändra..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Fråga var man skall spara varje ny nerladdning" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Laddar ner" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Startar återstående torrents manuellt:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Stannar alltid den _senast körda torrenten" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Startar alltid torrenten i_parallell" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Frågar varje gång" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Seedar" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Seeda kompletta torrenter: tills utdelningskvoten når [_] procent, eller " +"under [_] minuter, vilket som än kommer först." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Seeda i oändlighet" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Seeda sista kompletta torrenten: tills utdelningskvoten når [_] procent." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Nätverk" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Leta efter tillgänglig port:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "starta vid port:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "IP att rapportera till trackern:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Har ingen effekt om du inte är på\n" +"samma lokala nätverk som trackern)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Progress bar text är alltid svart\n" +"(kräver omstart)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Diverse" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"VARNING: Ändring av dessa inställningar kan\n" +"förhindra %s från att fungera korrekt." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Alternativ" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Värde" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Avancerat" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Välj standard nedladdningskatalog" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Filer i \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Verkställ" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Tilldela" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Ladda aldrig ner" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Minska" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Öka" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Filnamn" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Längd" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Peers för \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP adress" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Klient" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Uppkoppling" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s ner" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s upp" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB nerladdat" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB uppladdat" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% färdig" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s upskattad peer nedladdning" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Peer ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Intresserad" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Strypt" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Avfärdad" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Optimistisk uppladdning" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "fjärr" + +#: bittorrent.py:1358 +msgid "local" +msgstr "lokal" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "dålig peer" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d ok" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d dålig" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "bannlyst" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "ok" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Info för \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrent namn:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(trackerlös torrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Meddela url:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", i en fil" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", i %d filer" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Total storlek:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Delar:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Info hash:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Spara i:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Filnamn:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Öppna katalog" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Visa fil-lista" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "dra för att sortera om" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "höger-klicka för meny" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent info" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Ta bort torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Avbryt torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", kommer att seeda i %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", kommer att seeda på obestämd tid." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Klar, utdelningskvot: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Klar, %s uppladdat" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Klar" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent _info" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Öppna katalog" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Fil lista" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Peer lista" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Byt plats" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Seeda i oändlighet" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Om_start" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Avsluta" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Ta bort" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Avbryt" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Är du säker på att du vill ta bort \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Din utdelningskvot för denna torrent är %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Du har laddat upp %s till den här torrenten." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Ta bort den här torrenten?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Färdigt" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "dra till lista för att seeda" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Misslyckad" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "dra till lista för att fortsätta" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Väntar" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Körs" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Aktuell upp: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Aktuell ner: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Föregående upp: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Föregående ner: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Utdelningskvot: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s peers, %s seeds. Totalt från tracker: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Fördelade kopior: %d; Nästa: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Bitar: %d total, %d klara, %d ofullständiga, %d aktiva (%d tomma)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d ogiltiga bitar + %s i bort kastade " + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% klar, %s återstår" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Nerladdningshastighet" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Uppladdningshastighet" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Okänd" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s startad" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Öppna torrentfil" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Öppna torrent _URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Skapa _ny torrent" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Pausa/Starta" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Avsluta" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Visa/Göm _färdiga torrenter" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Ändra storlek på fönstret för att passa" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Logg" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Inställningar" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Hjälp" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Om" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Donera" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Fil" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Vy" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Sök efter torrenter" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(stoppad)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(flera)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Laddar redan ner %s intalleringen" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Installera nya %s nu?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "Önskar du avsluta %s och installera den nya versionen, %s, nu?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s hjälp finns på \n" +"%s\n" +"Vill du gå dit nu?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Besök hjälp websida?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Det finns en färdig torrent i listan." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Vill du ta bort den?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Det finns %d färdiga torrenter i listan." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Vill du ta bort alla dessa?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Ta bort alla färdiga torrenter?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Inga färdiga torrenter" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Det finns inga färdiga torrenter att ta bort." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Öppen torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Ändra spar plats för" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Filen existerar!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" existerar redan. Vill du ändra till ett annat fil namn?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Spara plats för" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Katalog finns!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" finns redan. Vill du skapa en identisk kopia av katalogen i den " +"befintliga katalogen?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(globalt meddelande) : %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Fel" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Flera fel har förekommit. Klicka OK för att kolla på fel loggen." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Sluta köra torrent?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"Du ska just starta \"%s\". Vill du stoppa den senast körda torrenten också?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Har du donerat?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Välkommen till den nya verisionen av %s. Har du donerat?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Tackar!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Tack för att du donerar! För att donera igen, välj \"Donera\" från \"Hjälp\" " +"menyn." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "nedvärderad, använd inte" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Misslyckades med att skapa eller att skicka ett kommando genom existerande " +"kontroll socket." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Stängning av alla %s fönster kanske löser problemet." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s körs redan" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "" +"Misslyckades med att skicka kommando genom existerande kontroll socket." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Kunde inte starta Torrentkön, se ovan för fel." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrent filskapare %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Skapa torrentfil för denna fil/katalog." + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Välj..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Kataloger kommer att bli batch torrenter)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Bit storlek:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Använd _tracker:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Använd _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Noder (valfri):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Kommentarer:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Skapa" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Värd" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Port" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Bygger torrenter..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Kontrollerar filstorlekar..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Börjar seeda" + +#: maketorrent.py:540 +msgid "building " +msgstr "bygger" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Klar." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Klar med att bygga torrenter." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Fel!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Fel med att bygga torrenter:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d dagar" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 dag %d timmar" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d timmar" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d minuter" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d sekunder" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 sekunder" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Hjälp" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Återkommande frågor:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Gå" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Välj en existerande mapp..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Alla filer" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrenter" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Skapa en ny mapp" + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Välj en fil" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Välj en mapp" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Kunde inte ladda sparat skick:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Kunde inte spara UI skick:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Ogiltigt skick av filens innhåll" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Fel vid läsning av fil" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "kan inte återställa skicket fullständigt" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Ogiltigt fil skick (dubbel inmatning)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Korumperad data i" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", kan inte återställa torrent (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Ogiltigt fil skick (dålig inmatning)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Dåligt UI fil skick" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Dålig UI fil skick version" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "UI tillstånds fil version stödjs inte (från nyare klient version?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Kunde inte ta bort cached %s fil:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Detta är ingen giltig torrent fil. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Denna torrent (eller en med samma innehåll) körs redan." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Denna torrent (eller en med samma innehåll) väntar redan på att köras." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent i okänt skick %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Kunde inte skriva fil" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "torrenten kommer inte att startas om korrekt vid klientens omstart" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Kan inte köra mer än %d torrenter samtidigt. För mer info läs FAQ på %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Startar inte torrenten då det finns andra torrenter som väntar på att köras " +"och denna möter redan de krav som ställts för att sluta seeda." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Startar inte torrent då denna redan möter de krav som satts för när den " +"senast färdiga torrenten skall sluta seedas." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Kunde inte motta den senaste versionen från %s" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Kunde inte tolka den nya version-strängen från %s" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Kunde inte finna en lämplig tillfällig lagringsplats för %s %s " +"installationen." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Ingen torrentfil tillgänglig för %s %s installationen." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s installationen verkar vara korrupt eller saknas." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Kan ej starta installationen under detta OS" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"katalog där variabeldata som snabbåternedhämtnings data och " +"användarinterface-inställningar är sparade. Standardkatalogen är " +"underkatalogen 'data' i programmet bittorrents config katalog." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"tangentbordsuppsättning som används på det lokala filsystemet. " +"Autokonfigurerad om lämnad tom. Autokonfiguration fungerar ej under " +"pythonversioner äldre än 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "ISO Språkkod som skall användas" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"ipnummer som rapporteras till trackern (detta har bara effekt om du sitter i " +"samma lokala nätverk som trackern)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"publikt portnummer om det är annat än det nummer klienten lyssnar på lokalt" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"lägsta port att lyssna på, räknar uppåt om den lägre porten ej är tillgänglig" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "högsta porten att lyssna på" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "ip nummer att binda till lokalt" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "sekunder mellan updatering av visad information" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "minuter programmet skall vänta innan den söker efter fler peers" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "minimalt antal peers för att inte återfråga efter fler peers" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "antal peers där programmet skall stoppa söka nya anslutningar" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"maximalt antal anslutningar, över detta antal kommer nya inkommande " +"anslutningar att kopplas ned direkt" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "huruvida programmet ska kontrollera hashar på disk" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "maximalt antal kB/s att ladda upp i, 0 betyder obegränsad hastighet" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "antalet uppladdningar att fylla i med extra optimistiska ostrypningar" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"det maximala antalet filer i en multifil torrent att hålla öppna på samma " +"gång, 0 betyder obegränsat. Används för att undvika få slut på filpekare." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Initiera en trackerlös klient. Detta måste vara aktiverat för att kunna " +"ladda ner trackerlösa torrents" + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "antalet sekunder att pausa mellan sändning av kvarhållande (torrenter)" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "hur många bytes att fråga om per förfrågan." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"maximal längd prefix kodning du accepterar över linan - större värden får " +"anslutningen att gå ned." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"sekunder att vänta mellan stängning av sockets som ingenting has blivit " +"mottaget på" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"sekunder att vänta emellan kontroll om några anslutningar har time:at ut." + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"maximal längd skiva att sända till peers, stäng anslutning om en större " +"begäran är mottagen" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"maximala tidsintervallet över vilket den aktuella upp- och " +"nerladdningshastigheten ska uppskattas" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "" +"maximala tidsintervallet över vilket den aktuella utdelningskvoten ska " +"uppsakttas" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"maximal tid att vänta emellan att försöka meddela igen om de fortsätter att " +"misslyckas" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"sekunder att vänta för data att komma in över en anslutning före antagan att " +"det är semi-permanent tilltäppning" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"antal nedladdningar till vilken att byta från slumpmässig till mest sällsynt " +"först" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "hur många bytes att skriva till nätverks buffrar på en gång." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"vägra ytterligare anslutningar från adresser med söndrig eller avsiktligt " +"fientliga peers som sänder felaktig data" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "anslut inte till flera peers som har samma ip-address" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"om icke noll, sätt TOS alternativet för peer anslutningar till detta värde" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"aktivera fix för en bug i BSD libc som gör filläsningar väldigt långsamma." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "HTTP proxy adress att använda för tracker anslutningar" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "stäng anslutningar med RST och undvik TCP TIME_WAIT tillståndet" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Använd Tvinnade nätverk-bibliotek för nätverksanslutningar. 1 betyder använd " +"tvinnade, 0 betyder använd inte tvinnade, -1 betyder upptäck automatiskt, " +"och föredra tvinnade" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"filnamn (för singelfiltorrents) eller katalognamn (för ett set torrents) att " +"spara torrenten som, överskridandes standardnamnet i torrenten. Se även --" +"save_in, om ingendera är specificerad kommer användaren bli frågad om plats " +"att spara" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "visa avancerat användarläge" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"maximalt antal minuter att seeda en färdig torrent innan stopp av seedning" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"maximal uppladdnings-/nedladdningskvot, i procent, att uppnå innan stopp av " +"seedning. 0 betyder ingen gräns." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"maximal uppladdnings-/nedladdningskvot, i procent, att uppnå innan stopp av " +"seedning av den sista torrenten. 0 betyder ingen gräns." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Seeda varje komplett torrent i oändlighet (tills dess att användaren " +"avbryter den)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Seeda den sista torrenten i oändlighet (tills dess att användaren avbryter " +"den)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "starta nedladdaren i pausat läge" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"specificerar hur applikationen ska bete sig när användaren manuellt försöker " +"att starta en annan torrent: \"ersätta\" betyder att alltid ersätta den " +"körande torrenten med en ny, \"lägga till\" betyder att alltid lägga till " +"den körande torrenten parallellt, och \"fråga\" betyder fråga användaren " +"varje gång." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"filnamn (för singelfiltorrents) eller katalognamn (för torrents i omgångar) " +"att spara torrenten som, överskrider standardnamnet i torrenten. See även --" +"save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"maximala antalet tillåtna uppladdningar samtidigt. -1 betyder " +"(förhoppningsvis) ett vettigt antal baserat på --max_upload_rate. Det " +"automatiska värdet är endast klokt att använda om man kör en torrent åt " +"gången." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"lokal katalog där torrents innehållet kommer sparas. Filen (single-fil " +"torrents) eller katalogen (torrents i omgångar) kommer att bli skapade under " +"denna katalogen med standard namnet specificerat i .torrent filen. Se även --" +"save_as." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "" +"huruvida programmet ska fråga eller inte efter en plats att spara " +"ledladdade filer i" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"lokal katalog där torrenterna kommer att sparas, med ett standard namn " +"fastställd av --saveas_style. Om denna lämnas tom kommer varje torrent att " +"sparas under den motsvarande .torrentfilens katalog" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "hur ofta torrent katalogen ska sökas av, i sekunder" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Hur man ska namnge torrent nedladdningar: 1: använda namn AV torrent fil " +"(minus .torrent); 2: använd namn kodat I torrent fil; 3: skapa en katalog " +"med namn AV torrent fil (minus .torrent) och spara i den katalogen med namn " +"kodat I torrent fil; 4: om namn AV torrent fil (minus .torrent) och namn " +"kodat I torrent fil är identiska, använd det namnet (stil 1/2), skapa " +"annarsen mellanliggande katalog som i stil 3; VARNING: alternativ 1 och 2 " +"kan skriva över filer utan att varna och kan medföra säkerhetsrisker." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"huruvida att visa den fulla sökvägen eller torrentens innehåll for varje " +"torrent" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "katalog att söka .torrent filer i (semi-rekursivt)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "huruvida att visa diagnostik info till stdout" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "vilken faktor av två att sätta bit storleken till" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "förvalt trackernamn" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"om falskt så skapa en trackerlös torrent, istället för att meddela URL, " +"använd pålitlig nod i form av : eller en tom sträng för att dra " +"några noder från din rotningstabell" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "nerladdning färdig!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "klar om %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "nerladdningen lyckades" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB upp / %.1f MB ned)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB upp / %.1f MB ner)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d sedd nu, plus %d distruberade kopior (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d distribuerade kopior (nästa: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d sedd nu" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "FEL:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "sparar:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "filstorlek:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "procent klart:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "tid kvar:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "ladda ner till:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "nerladdningshastighet:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "uppladdningshastighet:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "utdelningskvot:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "seed status:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "peer status:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Du kan inte specifiera både --spara_som och --spara_i" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "stänger av" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Fel vid läsning av konfiguration:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Fel vid läsning av .torrent fil:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "du måste specifiera en .torrent fil" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Textläges-GUI initialisering misslyckades, kan inte fortsätta." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Detta nerladdningsgränssnitt kräver standard Python modul \"curses\", som " +"olyckligtvis inte är tillgänglig för den tillhörande porten till Python. Den " +"är däremot tillgänglig för Cygwin porten till Python, som körs i alla Win32 " +"system (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Du kan fortfarande använda \"bittorrent-konsolen\" för nerladdning." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "fil:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "storlek:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "dest:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "progress:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "status:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "dl hastighet:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "ul hastighet:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "utdelar:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "seeds:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "peers:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d sedd nu, plus %d distribuerade kopior(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "fel:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "fel:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "" +" # IP Uppladdning Nerladdning Färdigt " +"Hastighet" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "laddar ner %d bitar, har %d fragment, %d av %d bitar klara" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Dessa fel förekom under utförandet:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Användning: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "gammalt meddelande för %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "inga torrenter" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SYSTEM FEL - UNDANTAG ERHÅLLET" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Varning:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " är inte en katalog" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"fel: %s\n" +"kör utan argument för parameter förklaringar" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"UNDANTAG:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" +"Du kan fortfarande använda \"btdownloadheadless.py\" för att ladda ner." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "ansluter till peers" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "ETA i %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Storlek" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Nerladdning" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Uppladdning" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Totalt:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s Peers %s Seeds %s Dist kopior - %s ner %s upp" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "fel:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"kör utan argument för parameter förklaringar" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "valfri mänskligt läsbar kommentar att sätta i .torrent" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "valfri målfil för torrenten" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - dechiffrera %s metainfo filer" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Användning: %s [TORRENTFILE [TORRENTFILE ... ]]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "metainfo fil: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "info hash: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "filnamn: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "filstorlek:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "filer:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "katalognamn: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "arkivstorlek:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "meddelande url för tracker: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "trackerlösa noder:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "kommentera:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Kunde inte skapa kontroll socket:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Kunde inte skicka kommando:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Kunde inte skapa kontroll socket: används redan" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Kunde inte ta bort gamla kontroll socket filnamn:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Global mutex redan skapad." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Kunde inte finna en öppen port!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Kunde inte skapa applikations informations-katalog" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "Kunde inte få globalt mutex-lås för kontroll-socket fil!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "En tidigare installation av BT var inte rensad. Fortsätter." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "inte en giltig bkodad sträng" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "ogiltig bkodat värde (data efter giltigt prefix)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Användning: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[OPTIONS] [TORRENTKATALOG]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Om ett icke-alternativ argument är gällande är det taget som värdet\n" +" av torrent_dir alternativet.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[OPTIONS] [TORRENTFILER]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[OPTIONS] [TORRENTFIL]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[OPTION] TRACKER_URL FIL [FIL]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argument är -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(standard till" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "okänd nyckel" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "parameter skickad in i slutet med inget värde" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "kommando rad analysering misslyckad vid" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Alternativ %s är obligatorisk." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Måste ge minst %d argument." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "För många argument - %d maximala antalet." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "felaktigt format av %s - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Kunde inte spara alternativ permanent:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "Tracker meddelar fortfarande inte klart %d sekunder efter start" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "Problem vid anslutning till tracker,gethostbyname misslyckades -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Problem med uppkopplingen till trackern -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "dålig data från trackern -" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "nekad av trackern - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Avbryter torrenten som om den var nekad av trackern medans den inte är " +"ansluten till några peers." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Meddelande från trackern:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "varning från trackern - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Kunde inte läsa katalog" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Kunde inte starta" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "tar bort %s (kommer att läggas till igen)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**varning** %s är en dublett torrent utav %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**varning** %s innehåller fel" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... lyckades" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "tar bort %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "kontrollering färdig" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "förlorade server-socket" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Fel vid hantering av accepterad anslutning:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Tvingas att avsluta på grund av TCP stack flacking out. Vänligen se FAQ vid %" +"s" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "För sent att byta RawServer backends, %s har redan använts." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Mån" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Tis" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Ons" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Tors" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Fre" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Lör" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Sön" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Jan" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Feb" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Apr" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Maj" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Jun" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Jul" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Aug" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Sep" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Okt" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Nov" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Dec" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Komprimerad: %i Okomprimerad: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Du kan inte specificera namnet på .torrent-filen när du genererar multipla " +"torrenter samtidigt" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Filsystemskodning \"%s\" stöds inte i den här versionen" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Kunde inte konvertera fil- / katalognamn \"%s\" till utf-8 (%s). Antingen är " +"den förutsatta filsystemskodningen \"%s\" fel eller så innehåller filnamnet " +"felaktiga bytes." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Fil- / katalognamnet \"%s\" innehåller reserverade unicodevärden som inte " +"motsvarar tecken." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "skadad data i svarsfil - total för liten" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "skadad data i svarsfil - total för stor" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "kontrollerar existerande fil" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashed 0 eller så matchar snabbåterupptagningsinfo inte " +"filtillståndet (saknad data)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Skadad snabbåterupptagningsinfo (filer innehåller mer data)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Skadad snabbåterupptagningsinfo (felaktigt värde)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "data på disk korrupt - du kanske har två kopior körandes?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Kunde inte läsa snabbåterupptagningsdata:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "sagda fil färdig vid uppstard men en bit misslyckades vid hash-kollen" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Filen %s tillhör en annan torrent som körs." + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Filen %s existerar redan, men är inte en vanlig fil" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Kort läsning - något trunkterade filerna?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"fastresume-filformatet stöds inte det kanske är från en annan klientversion?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Ett annat program verkar ha flyttat, bytt namn, eller tagit bort filen." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Ett annat program verkar ha modifierat filen." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Ett annat program verkar har ändrat filens storlek." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Kunde inte sätta signal hanterare:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "släppte \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "la till \"%s" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "väntar på hashkontroll" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "laddar ner" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "läser in konfigurationsfilen på nytt" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Kunde inte läsa katalog %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Kunde inte ladda ner eller öppna \n" +"%s\n" +"Prova använda en webbläsare för att ladda ner torrent filen." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Detta verkar vara en gammal verision av Python som inte stöjder upptäckning " +"av filsystemets kodning. Förmodar 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python misslyckades med att automatiskt upptäcka filsystemets kodning. " +"Använder 'ascii' istället." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "Filsystemets kodning '%s' stöds inte. Använder 'ascii' istället." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Felaktig filsökvägskomponent:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Denna .torrentfil har skapats med ett felaktigt verktyg och innehåller " +"felaktigt kodade filnamn. Några eller alla filnamn kan vara annorlunda från " +"hur skaparen av .torrentfilen tänkt sig att de skulle vara." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Denna .torrentfil har skapats med ett felaktigt verktyg och innhåller " +"felaktiga teckenvärden som inte kan matchas till något riktigt tecken. Några " +"eller alla filnamn kan vara annorlunda från hur skaparen av .torrentfilen " +"tänkt sig att de skulle vara." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Denna .torrentfil har skapats med ett felaktigt verktyg och har felaktigt " +"kodade filnamn. Namnen som används kan fortfarande vara korrekta." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Teckentabellen som används på de lokala filsystemet (\"%s\") kan inte " +"representera alla tecken som används i filnamnen / filnamnet för denna " +"torrent. Filnamnen har ändrats från orginalet." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows filsystem kan inte hantera några av de tecken som används i " +"filnamnet till den här torrenten. Filnamnet har blivit ändrat från orginalet." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Denna .torrentfil har skapats med ett felaktigt verktyg och har minst en fil " +"med en ogiltligt fil- eller katalognamn. Dessa filer är dock storlek 0 och " +"har ignorerats." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Python 2.2.1 eller nyare krävs" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Kan inte starta två separata exempel av samma torrent" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport understiger minport - saknar portar att kontrollera" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Kunde inte öppna en lyssningsport: %s." + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Kunde inte öppna en lyssningsport: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Kontrollera dina port-inställningar" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Initialstart" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Kan inte ladda snabbåterladdningsdata: %s." + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Kommer genomföra total hashkontroll." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "del %d misslyckade hashkontroll, åternerladdar den" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Försöker att ladda ner en trackerlös torrent med trackerlös klient avstängd." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "nerladdning misslyckad:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"IO Fel: Ingen plats kvar på disken, eller kan inte skapa en fil så stor:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "dödad av IO fel:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "dödad av OS fel:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "dödad av internt undantag:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Ytterligare fel vid stängning på grund av fel:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Kunde inte ta bort snabbåterupptagningsfil efter fel:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "seedar" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Kunde inte skriva snabbåterupptagnings data:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "stäng av" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "ogiltigt metainfo - inte en katalog" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "ogiltigt metainfo - tangent för ogiltiga bitar" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "ogiltig metainfo - otillåten del längd" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "ogiltig metainfo - ogiltigt namn" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "namn %s är otillåtet av säkerhetsskäl" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "ensam-/flerfil mix" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "ogiltig metainfo - ogiltig längd" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "ogiltig metainfo - \"filer\" är inte en lista över filer" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "ogiltig metainfo - ogiltigt filvärde" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "ogiltig metainfo - ogiltig filadress" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "ogiltig metainfo - ogiltig mappadress" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "filadress %s är ej tillåten på grund av säkerhetsskäl" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "ogiltig metainfo - dubblerad filadress" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "ogiltig metainfo - namn används till både fil och underkatalogs namn" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "ogiltig metainfo - felaktig objekttyp" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "ogiltig metainfo - ingen meddelande URL sträng" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "icke-text misslyckande anledning" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "icke-text varningsmeddelande" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "ogiltigt inträde i peer list1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "ogiltigt inträde i peer list2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "ogiltigt inträde i peer list3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "ogiltigt intärde i peer list4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "ogiltig peer lista" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "ogiltigt meddelande intervall" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "ogiltigt min meddelande intervall" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "ogiltig tracker id" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "ogiltig peer räkning" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "ogiltig seed räkning" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "ogiltig \"last\" inmatning" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Port att lyssna på." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "fil att spara ny nerladdningsinfo i" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "timeout för stängning av anslutningar" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "sekunder mellan sparande av dfil" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "sekunder mellan utgående nerladdare" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "sekunder som nerladdare ska vänta mellan återtillkänargivanden" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"standard antal peers att skicka ett info meddelande till om klienten inte " +"specifierar ett antal" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "tid att vänta mellan kontroller om någon anslutning har fått timed out" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "hur många gånger att kolla om nerladdaren är bakom en NAT (0=ej kolla)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" +"huruvida programmet ska lägga till en notering till loggen om nat-" +"kontrollens resultat " + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "minimala tiden mellan den senaste rensningen och den innan det" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"kortaste tiden i sekunder innan en cache betraktas som gammal och raderas" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"tillåt endast nerladdningar för .torrents i denna katalog (och rekursivt i " +"underkataloger till kataloger som inte själva har några .torrent-filer). Om " +"inställt, visas torrents i denna katalog på infopage/scrape vare sig de har " +"peers eller inte" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"tillåt speciella keys i torrenter i tillåten_dir att påverka tracker tillgång" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "om man ska öppna logg filen när HUP signal mottas" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "om man ska visa en info sida när trackerns root dir är laddad" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "en URL att omdirgera info sidan till" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "om man ska visa namn från tillåten dir" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"fil innehåller x-icon data att återvända när browsern efterfrågar favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"ignorera ip GET parametern från maskiner som inte befinner sig på lokala " +"nätverkets IPs (0 = aldrig, 1 = alltid, 2 = ignorera om NAT kontroll inte är " +"aktiverad). HTTP proxy headerar som ger adress från orginal klient är " +"behandlad samma som --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "fil att skriva trackerns loggar i, använd - för stdout (standard)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"använd med allowed_dir; lägger till en /fil?hash={hash} url som tillåter " +"användare att ladda ner torrent filen" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"behåll döda torrenter efter att dem har gått ut (så att de fortfarande visas " +"på din /scrape och websida). Gäller endast of tillåten_dir inte är inställd" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "skrape tillträde tillåten (kan vara inget, specifikt eller fullt)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "maximalt antal peers att ge med vilken som helst förfrågan" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"din fil kanske existerar någon annanstans i detta universum\n" +"men tyvärr, inte här\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**varning** specifierad favicon fil -- %s -- existerar inte." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**varning** tillståndsfil %s korumperad; nollställer" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Logg Startad:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**varning** kunde inte omdirigera stdout till loggfil:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Logg omöppnad:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**varning** kunde inte öppna loggfil igen" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "specifik skrap funktion är inte tillgänglig med denna tracker." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "full skrape funktion är inte tillgänglig med denna tracker." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "erhåll funktion är inte tillgänglig med denna tracker." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "Begärd nerladdning är inte aktoriserad att användas med denna tracker." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "kör utan argument för parameter förklaringar" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Stänger av:" diff --git a/locale/tr/LC_MESSAGES/bittorrent.mo b/locale/tr/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..cbbe48bb62048abbe923417c0a69e015bfa123ed GIT binary patch literal 55137 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 literal 0 HcmV?d00001 diff --git a/locale/tr/LC_MESSAGES/bittorrent.po b/locale/tr/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..b735c6d --- /dev/null +++ b/locale/tr/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2862 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-11 15:10-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Python 2.3 ya da daha üst sürümü yükleyin" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "PyGTK 2.4 veya yenisi gerekiyor" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Torrent URL adresini girin" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Açılacak torrent dosyasının URL adresini girin:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "çevirmeli" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/kablo 128k ve üstü" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/kablo 256k ve üstü" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL/kablo 768k ve üstü" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Maksimum gönderme hızı:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Çalışan tüm torrentleri geçici olarak durdur" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "İndirmeye devam et" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Duraklatıldı" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Torrent yok" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Normal çalışıyor" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Güvenlik Duvarı/NAT var" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Yeni %s sürümü mevcut" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "%s sürümünden daha yeni bir sürüm sunuldu.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "%s kullanıyorsunuz; en son sürüm ise %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"En son sürümü buradan temin edebilirsiniz \n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "_Daha sonra indir " + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Şimdi indir" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "Daha sonra hatırlat" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "%s hakkında" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Beta" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "%s sürümü" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "%s açılamıyor" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Bağış yap" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s Etkinlik Günlüğü" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Günlüğü kaydet:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "Günlük kaydedildi" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "Günlük temizlendi" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s Ayarları" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Kaydediyor" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Yeni indirilenleri buraya kaydet:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Değiştir..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Her yeni yükleme için kayıt yerini sor" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "İndiriliyor" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Ek torrent'ler başlatılıyor:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Her zaman son yürütülen torrent'i durdurur" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Torrent'i her zaman paralel olarak başlatır" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "Her seferinde sorar" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Kaynak durumunda" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Tamamlanan torrent'ler için kaynak ol: paylaşım oranı %[_] oluncaya kadar " +"veya [_] dakika boyunca, hangisi önce gerçekleşirse." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Süresiz olarak kaynak ol" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "" +"Son tamamlanan torrent için kaynak ol: paylaşım oranı %[_] oluncaya kadar." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Ağ" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Uygun bağlantı noktası ara:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "başlangıç bağlantı noktası:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "İzleyiciye rapor edilecek IP:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(İzleyici ile aynı yerel ağ içerisinde\n" +" olmadığınız sürece bir etkisi yok)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"İlerleme çubuğu metni her zaman siyah\n" +"(yeniden başlatma gerekir)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Çeşitli" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"UYARI: Bu ayarların değiştirilmesi\n" +"%s'in düzgün çalışmamasına neden olabilir." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Seçenek" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Değer" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Gelişmiş" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Varsayılan indirme dizinini seç" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "\"%s\"'de bulunan dosyalar" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Uygula" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Ayır" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Asla indirme" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Azalt" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Arttır" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Dosya adı" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Uzunluk" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "\"%s\" için eşler" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP adresi" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "İstemci" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Bağlantı" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s aşağı" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s yukarı" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB indirildi" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB gönderildi" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% tamamlandı" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s tahmini eş indirme" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "Eş ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "İlgili" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Boğuldu" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Reddedildi" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "İyimser yükleme" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "uzak" + +#: bittorrent.py:1358 +msgid "local" +msgstr "yerel" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "kötü eş" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d tamam" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d kötü" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "yasaklı" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "tamam" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "\"%s\" için bilgi" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrent adı:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(izleyicisiz torrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Url duyur:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", bir dosyada" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", %d dosyada" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Toplam boyut:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Parçalar:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Hesaba dayalı adres bilgisi:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Kaydet:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Dosya adı:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Dizin aç" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Dosya listesini göster" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "yeniden sıralamak için sürükle" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "Menü için sağ tıklayın" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent bilgisi" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Torrent'i kaldır" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Torrent'i iptal et" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", %s için kaynak olacak" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", süresiz olarak kaynak olacak." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Bitti, paylaşım oranı: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Bitti, %s yüklendi" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Bitti" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Torrent _bilgisi" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "Dizini _aç" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "Dosya _listesi" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Eş listesi" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Konumu değiştir" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Sürekli kaynak bul" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "_Yeniden başlat" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Bitir" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Kaldır" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "Bitir_meden durdur" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "\"%s\": Kaldırmak istediğinize emin misiniz?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Bu torrent için paylaşım oranınız %d%%." + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Bu torrent için %s yükleme yaptınız." + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Bu torrent'i kaldır?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Bitti" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "kaynak olmak için listeye sürükleyin" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Başarısız" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "kabul etmek için listeye sürükleyin" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Bekliyor" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Çalışıyor" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Şu anki yükleme: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Şu anki indirme: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Önceki yükleme: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Önceki indirme: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Paylaşım oranı: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s eş, %s kaynak. İzleyicideki toplam: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Dağıtık kopyalar: %d; Sonraki: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "Parçalar: %d toplam, %d tamamlanan, %d parçalı, %d aktif (%d boş)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d hatalı parça + atılan talepler içinde %s" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "%.1f%% tamamlandı, kalan %s" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "İndirme hızı" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Yükleme hızı" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "Geçerli Değil" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s başladı" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "Torrent dosyası aç" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Torrent _URL aç" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Yeni torrent yap" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "Duraklat/Oynat" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "Çık" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Bitmiş torrentleri Göster/Gizle" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "Pencereyi sığacak biçimde yeniden boyutlandır" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "Günlük" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "Ayarlar" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "Yardım" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "Hakkında" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "Bağış yap" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "Dosya" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "Görünüm" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Torrent ara" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(durduruldu)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(çoklu)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Halen %s yükleyicisini indiriyor" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Yeni %s şimdi kurulsun mu?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "" +"%s uygulamasından çıkmak ve yeni sürüm olan %s uygulamasını kurmak istiyor " +"musunuz?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s yardımı \n" +"%s adresinde\n" +"Şimdi oraya gitmek ister misiniz?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Yardım web sayfasını ziyaret etmek istiyor musunuz?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Listede bir tane tamamlanmış torrent var." + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Onu kaldırmak istiyor musunuz?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Listede %d adet tamamlanmış torrent var." + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Hepsini kaldırmak istiyor musunuz?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Tamamlanmış bütün torrentler kaldırılsın mı?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Tamamlanmış torrent yok" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Kaldırılacak tamamlanmış torrent yok." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Torrent aç:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Kayıt yerini değiştir" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Dosya var!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "\"%s\" zaten var. Farklı bir dosya adı seçmek istiyor musunuz?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Kaydetme yeri" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Dizin var!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"\"%s\" zaten var. Varolan dizin içerisinde özdeş ikinci bir dizin oluşturmak " +"ister misiniz?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(global mesaj): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s Hata" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "" +"Birden fazla hata oluştu. Hata günlüğünü görmek için Tamam düğmesine " +"tıklayın." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Çalışan torrent durdurulsun mu?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "" +"\"%s\" işini başlatmak üzeresiniz. Çalışan son torrenti de durdurmak istiyor " +"musunuz?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Bağış yaptınız mı?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "\"%s\" uygulamasının yeni sürümüne hoş geldiniz. Bağış yaptınız mı?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Teşekkürler!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Bağış için teşekkürler! Yeniden bağış yapmak için \"Yardım\" menüsünden " +"\"Bağış Yap\" başlığını seçin." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "iptal edildi, kullanmayın" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "" +"Varolan kontrol yuvasından komut oluşturma veya gönderme başarısız oldu." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Tüm %s pencerelerini kapatmak problemi çözebilir." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s halen çalışıyor" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Varolan kontrol yuvasından komut gönderme başarısız oldu." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "TorrentQueue başlatılamadı, hatalar için yukarıya bakın." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrent dosya oluşturucusu %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Bu dosya/dizin için torrent dosyası oluştur:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Seç..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Dizinler toplu iş torrentlerine dönüşecek)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Parça boyutu:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "İzleyici kullan:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "_DHT kullan:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Düğümler (opsiyonel):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Yorumlar:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Yap" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "Ana Bilgisayar" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "Bağlantı Noktası" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Torrentler oluşturuluyor..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Dosya boyutları kontrol ediliyor..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Kaynak bulmaya başla" + +#: maketorrent.py:540 +msgid "building " +msgstr "oluşturuluyor" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Tamamlandı." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Torrentlerin oluşturulması tamamlandı." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Hata!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Torrentlerin oluşturulmasında hata:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d gün" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 gün %d saat" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d saat" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d dakika" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d saniye" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 saniye" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s Yardım" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Sıkça Sorulan Sorular:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Git" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Varolan bir klasör seç..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Tüm Dosyalar" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrentler" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Yeni bir klasör oluştur..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Bir dosya seç" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Bir klasör seç" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Kaydedilmiş durum yüklenemedi:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "UI durumu kaydedilemedi:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Geçersiz durum dosyası içerikleri" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Dosya okuma hatası" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "durum tamamen geri yükelenemiyor" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Geçersiz durum dosyası (birden fazla giriş)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Bozuk veri" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", torrent geri yükelenemiyor (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Geçersiz durum dosyası (hatalı giriş)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Hatalı UI durum dosyası" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Hatalı UI durum dosyası sürümü" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Desteklenmeyen UI durum dosyası sürümü (daha yeni bir istemci sürümünden mi?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Önbelleğe alınmış %s dosyası silinemiyor:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Bu geçerli bir torrent dosyası değil. (%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "" +"Bu torrent (ya da aynı içeriğe sahip başka bir tanesi) halen çalışıyor." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "" +"Bu torrent (ya da aynı içeriğe sahip başka bir tanesi) halen çalışmak için " +"bekliyor." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent %d bilinmeyen durumunda" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Dosyaya yazamıyor" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"istemci yeniden başlatıldığında, torrent doğru bir şekilde yeniden " +"başlatılmayacak" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Aynı anda %d torrentden daha fazlası çalışamaz. Daha fazla bilgi için %s " +"adresindeki SSS'a bakın." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Torrent başlatılmıyor zira çalışmayı bekleyen başka torrentler de var ve bu " +"torrent, kaynak bulmanın ne zaman durdurulacağına ilişkin ayarları zaten " +"karşılıyor." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Torrent başlatılmıyor zira en son tamamlanan torrent için kaynak bulmanın ne " +"zaman durdurulacağına ilişkin ayarları zaten karşılıyor." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "%s adresinden son sürüm alınamıyor" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Yeni sürüm karakter dizgesi \"%s\" bilgisinden ayrıştırılamıyor" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "%s %s yükleyicisini kaydetmek için uygun bir geçici dizin bulunamadı." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "%s %s yükleyicisi için kullanılabilir bir torrent dosyası yok." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s yükleyicisi bozuk ya da yok." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Bu işletim sistemi üzerinde yükleyici çalıştırılamıyor" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"hızlı devam etme bilgisi ve GUI durumu gibi değişken verilerin kaydedildiği " +"dizin. Bittorrent yapılandırma dizininin alt dizini olan 'data' dizini " +"varsayılan dizindir." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"yerel dosya sisteminde kullanılacak karakter kodlaması. Boş bırakıldığında, " +"otomatik olarak bulunacaktır. Otomatik bulma işlemi, 2.3'ten küçük python " +"sürümleri altında çalışmaz." + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Kullanılacak ISO Dil kodu" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"izleyiciye rapor edilecek ip (izleyici olarak aynı yerel ağda olmadığınız " +"sürece hiçbir etkisi yoktur)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"istemcinin yerel olarak dinlediğinden farklı ise herkese görünen bağlantı " +"noktası numarası" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "" +"dinlenilecek en düşük bağlantı noktası numarası, eğer kullanılamaz ise " +"yukarı doğru artar" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "dinlenilecek en yüksek bağlantı noktası" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "yerel olarak bağlanacak ip" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "gösterilen bilgilerin güncelleştirmeleri arasındaki saniye" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "daha fazla eş talepleri arasında beklenilecek dakika" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "yeniden talep yapılmayacak minimum eş sayısı" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "yeni bağlantıların başlatılmasının durdurulacağı eş sayısı" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"izin verilecek en fazla bağlantı sayısı, bundan sonra yeni gelen bağlantılar " +"derhal kapatılacaktır" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "diskteki adreslerin kontrol edilip edilmeyeceği" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "Yükleme için maksimum kB/s, 0 sınırsız anlamına gelir" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "ekstra iyimser boğulmamalarla, doldurulacak yükleme sayısı " + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"çok dosyalı torrentde bir anda açık tutulabilecek maksimum dosya sayısı, 0 " +"sınırsız anlamına gelir. Dosya tanımlayıcısı kalmaması problemini engellemek " +"için kullanılır." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"İzleyicisiz bir istemci başlat. İzleyicisiz torrentleri indirebilmek için bu " +"etkinleştirilmeli." + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "" +"keepalive (canlı tut) mesajı göndermeleri arasında beklenilecek saniye sayısı" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "istek başına kaç byte sorgulanmalı." + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"hat üzerinden kabul edeceğiniz maksimum ön ek kodlaması uzunluğu - büyük " +"değerler bağlatının kopmasına neden olur." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"hiçbir şeyin alınmadığı yuvaların kapatılması arasında beklenilecek saniye" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "" +"herhangi bir bağlantının zaman aşımına uğrayıp uğramadığının kontrolü " +"arasında beklenilecek saniye" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"eşlere gönderilecek maksimum dilim uzunluğu, daha büyük bir talep alınırsa " +"bağlantıyı kapat" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "" +"güncel yükleme ve indirme hızlarının tahmin edileceği maksimum zaman aralığı" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "yürürlükteki kaynak oranının tahmin edileceği maksimum zaman aralığı" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"eğer başarısız olurlarsa duyuruları yeniden deneme arasında beklenecek " +"maksimum süre" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"yarı kalıcı olarak boğulmuş olduğu varsayılmadan önce, bir bağlantıdan veri " +"gelmesinin bekleneceği saniye" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "rastgeleden en seyrek olan ilke geçilecek indirme sayısı" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "bir defada ağ ara belleklerine kaç byte yazılmalı" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"yanlış veri gönderen, hata sonucu ya da kasten saldırgan eşlerin " +"adreslerinden artık bağlantıları reddet" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "aynı IP adresine sahip birden fazla eşe bağlanma" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"eğer sıfırdan farklı ise, eş bağlantıları için TOS seçeneğini bu değere " +"ayarla" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"dosya okumalarını oldukça yavaşlatan, BSD libc içindeki bir hatayı atlamayı " +"etkinleştir." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "izleyici bağlantılarında kullanılmak üzere HTTP vekil sunucu adresi" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "RST ile bağlantıları kapat ve TCP TIME_WAIT durumundan sakın" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Ağ bağlantıları için Twisted ağ kütüphanelerini kullan. 1 twisted kullan, 0 " +"twisted kullanma, -1 otomatik algıla ve twisted tercih et anlamına gelir." + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"torrentdeki varsayılan adı ezerek, onu farklı kaydetmek için kullanılacak " +"dosya adı (tek dosyalı torrentler için) veya dizin adı (toplu iş torrentleri " +"için). Aynı zamanda --save_in başlığına bakın, eğer hiçbiri belirtilmemişse, " +"kullanıcıya kayıt yeri sorulacaktır" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "gelişmiş kullanıcı arabirimini göster" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"kaynak işlemi durdurulmadan önce, tamamlanmış bir torrentin kaynak edileceği " +"maksimum dakika sayısı" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"kaynak işlemi durdurulmadan önce elde edilmesi gereken yüzde cinsinden " +"minimum gönderme/indirme oranı. 0, sınırsız anlamına gelir." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"son torrentin kaynak işlemi durdurulmadan önce elde edilmesi gereken yüzde " +"cinsinden minimum gönderme/indirme oranı. 0, sınırsız anlamına gelir." + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Tamamlanan her torrenti süresiz olarak kaynakla (kullanıcı iptal edene kadar)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "Son torrenti süresiz olarak kaynakla (kullanıcı iptal edene kadar)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "indiriciyi duraklama durumunda başlat" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"kullanıcı başka bir torrenti elle başlatmaya çalıştığı zaman uygulamanın " +"nasıl davranacağını belirler: değiştir\", çalışan torrenti her zaman " +"yenisiyle değiştir, \"ekle\", çalışan torrenti her zaman paralel olarak ekle " +"ve \"sor\" ise her seferinde kullanıcıya sor anlamına gelir." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"torrentin içindeki varsayılan adı hükümsüz sayarak, torrenti farklı " +"kaydetmek için dosya adı (tek dosyalı torrentler için) veya dizin adı (toplu " +"torrentler için). Aynı zamanda --save_in'e bakın" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"Bir defada izin verilen maksimum yükleme sayısı. -1, --max_upload_rate " +"değerine dayanan makul (umulan budur) bir rakam anlamına gelir. Otomatik " +"değerler yalnızca aynı anda tek bir torrent çalışırken anlamlıdır." + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"torrent içeriklerinin kaydedileceği yerel dizin. Dosya (tek dosyalı " +"torrentler) veya dizin (çok dosyalı torrentler) torrent dosyasında " +"belirtilen varsayılan isim kullanılarak bu dizin altında oluşturulacaktır. " +"Aynı zamanda --save_as'e bakın." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "indirilen dosyaların kaydedileceği yerin sorulup sorulmayacağı" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"torrentlerin, --saveas_style tarafından belirlenmiş bir ad ile kaydedileceği " +"yerel dizin. Eğer bu boş bırakılırsa her bir torrent, ilişkin .torrent " +"dosyasının dizini altına kaydedilir." + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "torrent dizinini yeniden tarama sıklığı, saniye olarak" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Torrent indirmeleri nasıl adlandırılmalı: 1: torrent dosyasının adını kullan " +"(eksi .torrent); 2: torrent dosyası içinde kodlanmış adı kullan; 3: torrent " +"dosyasının adına (eksi .torrent) sahip bir dizin oluştur ve o dizin " +"içerisine torrent dosyası içinde kodlanmış ad ile kaydet; 4: eğer torrent " +"dosyasının adı (eksi .torrent) ve torrent dosyasının içinde kodlanmış ad " +"özdeş ise o adı kullan (stil 1/2), değilse stil 3'teki gibi ara bir dizin " +"oluştur; DİKKAT: seçenek 1 ve 2 uyarı vermeden dosyaların üzerine yazma " +"kabiliyetine sahip olup, güvenlik problemleri oluşturabilirler." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "" +"her bir torrent için torrent içeriklerinin veya tam yolun gösterilip " +"gösterilmeyeceği" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr ".torrent dosyalarının aranacağı dizin (yarı-özyineli)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "diagnostik bilgisinin stdout'a gösterilip gösterilmeyeceği" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "parça boyutunun ayarlanacağı ikinin üssü" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "varsayılan izleyici adı" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"eğer yanlışsa, izleycisiz bir torrent oluştur, URL duyurmak yerine :" +" formunda güvenilir bir düğüm veya yönlendirme tablonuzdan " +"bazı düğümleri çekmek için boş bir karakter dizgesi kullan" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "indirme tamamlandı!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "%d:%02d:%02d içinde tamamlanıyor" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "indirme başarıyla tamamlandı" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB yükleme / %.1f MB indirme)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB yükleme / %.1f MB indirme)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d şimdi görüldü, ek olarak %d dağıtılmış kopya (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d dağıtılmış kopya (sonraki: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d şimdi görüldü" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "HATA:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "kaydediyor:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "dosya boyutu:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "tamamlanan yüzde:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "kalan süre:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "şuraya indir:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "indirme hızı:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "yükleme hızı:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "paylaşım derecesi:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "kaynak durumu:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "eş durumu:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "" +"--save_as ve --save_in anahtarlarının her ikisini birden belirtemezsiniz" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "kapatılıyor" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Yapılandırmanın okunmasında hata:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr ".torrent dosyasının okunmasında hata:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "bir .torrent dosyası belirtmelisiniz" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "Metin modu GUI başlatması başarısız oldu, devam edemiyor." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Bu indirme arabirimi, Python'un doğal Windows portunda maalesef yer almayan, " +"standart Python modülü olan \"curses\" modülünü gerektirir. Bununla birlikte " +"Python'un tüm Win32 sistemlerinde çalışan Cygwin portu için mevcuttur (www." +"cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "İndirme işlemi için hala \"bittorrent-cosole\"u kullanabilirsiniz." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "dosya:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "boyut:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "hedef:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "ilerleme:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "durum:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "dl hızı:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "ul hızı:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "paylaşım:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "kaynaklar:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "eşler:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d şimdi görüldü, ek olarak %d dağıtılmış kopya(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "hata(lar):" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "hata:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP Yükleme İndirme Tamamlandı Hız" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "%d parça indiriliyor, %d parça kalan, %d parçanın %d tanesi tamamlandı" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Çalışma esnasında bu hatalar oluştu:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Kullanım: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "%s için eski duyuru: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "torrent yok" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "SİSTEM HATASI - İSTİSNA ÜRETİLDİ" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Uyarı:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "dizin değil" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"hata: %s\n" +"run with no args for parameter explanations" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"İSTİSNA:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "" +"İndirme işlemi için hala \"btdownloadheadless.py\"yi kullanabilirsiniz." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "eşlere bağlanıyor" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "%d:%02d:%02d içinde ETA" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Boyut" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "İndirme" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Yükleme" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Toplamlar:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "hata:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"parametre açıklamaları için argümansız çalıştır" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "" +".torrent dosyasına konulmak üzere, kişiler tarafından okunabilen opsiyonel " +"yorum" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "torrent için opsiyonel hedef dosyası" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Kullanım: %s [TORRENT DOSYASI [TORRENT DOSYASI ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "dosya adı: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "dosya boyutu:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "dosyalar:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "dizin adı: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "arşiv boyutu:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "izleyici duyuru url'si: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "izleyicisiz düğümler:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "yorum:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Kontrol yuvası oluşturulamadı:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Komut gönderilemedi:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Kontrol yuvası oluşturulamadı: halen kullanımda" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Eski kontrol yuvasının dosya adı kaldırılamadı:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Açık bir bağlantı noktası bulunamadı!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Uygulama veri dizini oluşturulamadı!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "BT'nin önceki kopyası düzgün olarak temizlenmedi. Devam ediliyor." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Kullanım: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[SEÇENEKLER] [TORRENTDİZİNİ]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Seçenek olmayan bir argüman var ise bu argüman,\n" +"torrent_dir seçeneğinin değeri olarak ele alınır.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[SEÇENEKLER] [TORRENTDOSYLARI]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "SEÇENEKLER] [TORRENTDOSYASI]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "argümanlar -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "bilinmeyen anahtar" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "komut satırı ayrıştırması başarısız oldu" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "%s seçeneği gerekli." + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "En azından %d argümanı sağlamalı." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Çok fazla argüman - %d maksimum." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Seçenekler kalıcı olarak kaydedilemedi:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "İzleyici anonsu, başlatılmasından %d saniye sonra hala tamamlanamadı" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "İzleyiciye bağlanırken hata, gethostbyname başarısız oldu -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "İzleyiciye bağlanırken hata -" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "izleyiciden hatalı veri -" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "izleyici tarafından reddedildi -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Torrent durduruluyor, zira hiçbir eşe bağlanılmadığından ötürü izleyici " +"tarafından reddedildi." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "İzleyiciden mesaj:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "izleyiciden uyarı -" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Dizini okuyamıyor" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "%s kalıdırılıyor (yeniden eklenecek)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**uyarı** %s hatalar içeriyor" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... başarılı" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "%s kaldırılıyor" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "kontrol tamamlandı" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "sunucu yuvası kaybedildi" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Pzt" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Sal" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Çar" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Per" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Cum" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Cmt" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Paz" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Oca" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Şub" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Mar" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Nis" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "May" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Haz" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Tem" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Ağu" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Eyl" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Eki" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Kas" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Ara" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Sıkıştırıldı: %i Açıldı: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Bir defada birden fazla torrent üretirken .torrent dosyasının adını " +"belirleyemezsiniz " + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "\"%s\" dosya sistemi kodlaması bu sürümde desteklenmiyor" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Dosya/dizin adı \"%s\", utf-8 (%s) kodlamasına dönüştürülemedi. Ya " +"varsayılan dosya sistemi kodlaması \"%s\" hatalı ya da dosya adı geçersiz " +"byte bilgileri içeriyor." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "Cevap dosyasında hatalı veri - toplam çok küçük" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "Cevap dosyasında hatalı veri - toplam çok büyük" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "varolan dosya kontrol ediliyor" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Hatalı hızlı sürdürme bilgisi (dosyalar daha fazla veri içeriyor)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Hatalı hızlı sürdürme bilgisi (geçersiz değer)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "veri disk üzerinde bozuldu - belki çalışan iki kopyaya sahipsinizdir?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Hızlı sürdürme verisini okuyamadı:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "%s dosyası çalışan diğer bir torrente ait" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "%s dosyası var, ancak geçerli bir dosya değil" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Desteklenmeyen hızlı sürdürme dosya formatı, diğer bir istemci sürümünden " +"olabilir mi?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Başka bir program dosyayı taşımış, yeniden adlandırmış veya silmiş görünüyor." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Başka bir program dosyayı değiştirmiş görünüyor." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Başka bir program dosya boyutunu değiştirmiş görünüyor." + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "eklendi \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "indiriyor" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Yapılandırma dosyasını yeniden okuyor" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "%s okunamıyor" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"%s\n" +"indirilemiyor ya da açılamıyor\n" +"Torrent dosyasını indirmek için bir internet göz atıcısı kullanmayı deneyin." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Bu, dosya sistemi kodlamasını bulmayı desteklemeyen eski bir Python sürümü " +"gibi görünüyor. 'ascii' olduğu varsayıldı." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python, dosya sistemi kodlamasını otomatik olarak bulamadı. Yerine 'ascii' " +"kullanılacak." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Dosya sistemi kodlaması '%s' desteklenmiyor. Yerine 'ascii' kullanılacak." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Hatalı dosya yolu bileşeni:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Bu .torrent dosyası hatalı bir araçla oluşturulmuş ve yanlış kodlanmış dosya " +"adlarına sahip. Bazı veya bütün dosya adları, .torrent dosyasını oluşturanın " +"planladığından daha farklı görünebilir." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Bu .torrent dosyası hatalı bir araçla oluşturulmuş ve herhangi bir gerçek " +"karaktere karşılık gelmeyen yanlış karakter değerlerine sahip. Bazı veya " +"bütün dosya adları, .torrent dosyasını oluşturanın planladığından daha " +"farklı görünebilir." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Bu .torrent dosyası hatalı bir araçla oluşturulmuş ve yanlış olarak " +"kodlanmış dosya adlarına sahip. Kullanılan adlar hala doğru olabilir." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Yerel dosya sisteminde (\"%s\") kullanılan karakter seti bu torrentin dosya " +"adındaki/adlarındaki karakterlerin tamamını temsil edemez. Dosya adları " +"orijinalden değiştirildi." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows dosya sistemi, bu torrentin dosya adında/adlarında kullanılan bazı " +"karakterleri işleyemez. Dosya adları orijinalden değiştirildi." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Bu .torrent dosyası hatalı bir araçla oluşturulmuş ve en az 1 adet geçersiz " +"dosya veya dizin adı içeriyor. Bununla birlikte bu tür bütün dosyalar 0 " +"uzunluğuna sahip olarak işaretlenmekte ve dolayısıyla ihmal edilmektedir." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Python 2.2.1 veya daha yenisi gerekli" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Aynı torrentin iki ayrı örneği başlatılamaz" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "maxport, minport'dan daha az - kontrol edilecek bağlantı noktası yok" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Dinlenecek bağlantı noktası açılamadı: %s" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Dinlenecek bağlantı noktası açılamadı: %s" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Bağlantı noktası aralıklarınızı kontrol edin." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "İlk açılış" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Hızlı sürdürme veriis yüklenemedi: %s" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"İzleyicisiz istemci ile izleyicisiz torrent indirme girişimi kapatıldı." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "indirme başarısız oldu:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"IO Hatası: Diskte yer kalmadı, veya o büyüklükte bir dosya oluşturulamıyor:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "IO hatası sonucu kapatıldı:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "OS hatası sonucu kapatıldı:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "Dahili istisna sonucu kapatıldı:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Hata sonucu kapatılırken ek hata:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Hatadan sonra hızlı sürdürme dosyası kaldırılamadı:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Hızlı sürdürme verisi yazılamadı:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "kapat" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "%s adına güvenlik sebebiyle izin verilmedi" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "tekli/çoklu dosya karışımı" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "%s yoluna güvenlik sebebiyle izin verilmedi" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "eş listesi1 içine geçersiz giriş" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "eş listesi2 içine geçersiz giriş" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "eş listesi3 içine geçersiz giriş" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "eş listesi4 içine geçersiz giriş" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "geçersiz eş listesi" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "geçersiz duyuru aralığı" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "geçersiz min duyuru aralığı" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "geçersiz izleyici id'si" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "geçersiz eş sayısı" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "geçersiz \"son\" giriş" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Dinlenecek bağlantı noktası." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "en son idirici bilgisinin içerisinde tutulacağı dosya" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "bağlantıların kapatılacağı zaman aşımı" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "indiricilerin, yeniden duyurular arasında bekleyeceği saniye" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"eğer istemci bir rakam belirtmemişse, bilgi mesajı gönderilecek varsayılan " +"eş sayısı" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "" +"herhangi bir bağlantının zaman aşımına uğrayıp uğramadığının kontrol " +"edilmesi arasında beklenilecek zaman" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"bir indiricinin bir NAT'ın arkasında olup olmadığı kaç kere kontrol edilmeli " +"(0 = kontrol etme)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "nat-kontrol sonuçlarının günlüğe kaydedilip kaydedilmeyeceği" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"bir önbelleğin bozuk olarak varsayılmasından ve boşaltılmasından önce " +"beklenilecek saniye cinsinden minimum zaman" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"allowed_dir içindeki torrentlerin içinde bulunan özel anahtarların izleyici " +"erişimini etkilemesine izin ver" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "HUP sinyalinin alınmasıyla günlüğün yeniden açılıp açılmayacağı" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"izleyicinin kök dizini yüklendiğinde bir bilgi sayfasının gösterilip " +"gösterilmeyeceği" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "bilgi sayfasının yönlendirileceği bir URL" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "izin verilen dizinden isimlerin gösterilip gösterilmeyeceği" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"gözatıcı favicon.ico talep ettiğinde, geri döndürülecek x-icon verisini " +"içeren dosya" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"ölü torrentleri zaman aşımına uğradıktan sonra sakla (dolayısıyla /scrape ve " +"web sayfanızda görünmeye devam edecekler). Yalnızca allowed_dir " +"etkinleştirilmediği zaman geçerlidir." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"dosyanız kainatta başka bir yerde var olabilir\n" +"fakat ne yazık ki burada değil\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**uyarı** belirtilen favicon dosyası -- %s -- mevcut değil." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**uyarı** durum dosyası %s bozuk; yeniden başlatılıyor" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Günlük Tutma Başlatıldı:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**uyarı** stdout'u günlük dosyasına yönlendiremiyor:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Günlük yeniden açıldı" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**uyarı** günlük dosyasını yeniden açamıyor" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"İstenen indirme, bu izleyici ile birlike kullanılmak için yetkilendirilmemiş." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "parametre açıklamaları için argümansız çalıştır" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Kapatılıyor:" diff --git a/locale/vi/LC_MESSAGES/bittorrent.mo b/locale/vi/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..58e711eecdf5ec8660650a149269c9985cac963b GIT binary patch literal 69081 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 WAnH_*mQ)MUITOYYo&NdtmFX|vDVJ~n literal 0 HcmV?d00001 diff --git a/locale/vi/LC_MESSAGES/bittorrent.po b/locale/vi/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..658d3ca --- /dev/null +++ b/locale/vi/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2881 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-14 02:02-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: Vietnamese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "Cài đặt Python 2.3 hay cao hơn." + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "Cần PyGTK phiên bản 2.4 hay phiên bản mới hơn" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "Nhập địa chỉ Mạng " + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "Nhập địa chỉ Mạng của một tập tin dòng cần mở:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "quay số" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "DSL/cáp 128k trở lên" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "DSL/cáp 256k trở lên" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "DSL 768k trở lên" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "Tốc độ tải lên tối đa:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "Ngừng tạm thời các dòng đang chạy" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "Tiếp tục tải về" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "Đã tạm dừng" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "Không có dòng." + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "Đang chạy bình thường" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "Được bảo vệ bởi bức tường lửa/mạng NATE" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "Có sẵn phiên bản %s mới" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "Có sẵn một phiên bản %s mới hơn.\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "Bạn đang sử dụng phiên bản %s và phiên bản mới là %s.\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"Bạn luôn có thể lấy phiên bản mới nhất từ\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "Tải về _sau " + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "Tải về_ngay bây giờ" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "_Nhắc nhở tôi sau" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "Giới thiệu về %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "Phiên bản sơ bộ dùng để chạy thử nghiệm" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "Phiên bản %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "Không thể mở %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "Tặng" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "Bản lưu Hoạt động %s" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "Lưu Bản lưu vào:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "đã lưu bản lưu " + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "đã xóa nội dung bản lưu" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "Các cài đặt %s " + +#: bittorrent.py:756 +msgid "Saving" +msgstr "Đang lưu" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "Lưu các tập tin mới tải về vào:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "Thay đổi..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "Hỏi vị trí lưu mỗi tập tin mới tải về " + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "Đang tải về" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "Khởi động các dòng thêm bằng tay:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "Luôn ngừng_dòng chạy cuối cùng" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "Luôn luôn khởi động dòng một cách _song song" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "_Hỏi mỗi lần" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "Đang khởi tạo" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"Khởi tạo các dòng hoàn tất: đến khi tỷ lệ lên tới [_] phần trăm, hoặc trong " +"vòng [_] phút, bất kỳ điều kiện nào đến trước." + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "Khởi tạo không xác định" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "Khởi tạo hoàn tất dòng cuối cùng: đến khi tỷ lệ lên tới [_] phần trăm." + +#: bittorrent.py:925 +msgid "Network" +msgstr "Mạng" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "Tìm kiếm cổng có sẵn:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "bắt đầu từ cổng: " + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "Địa chỉ IP cần thông báo cho công cụ theo dõi:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(Không có tác dụng nếu bạn không có trên\n" +"cùng một mạng cục bộ với công cụ theo dõi)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"Văn bản trên thanh tiến trình luôn có màu đen\n" +"(yêu cầu khởi động lại)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "Lặt vặt" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"CẢNH BÁO: Thay đổi cài đặt này\n" +"có thể ngăn cản không cho %s thực hiện chức năng một cách chính xác." + +#: bittorrent.py:986 +msgid "Option" +msgstr "Tùy chọn" + +#: bittorrent.py:991 +msgid "Value" +msgstr "Giá trị" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "Cao cấp" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "Chọn danh mục tải về mặc định" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "Các tập tin trong \"%s\"" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "Áp dụng" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "Phân bổ" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "Không bao giờ tải về" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "Giảm" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "Tăng" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "Tên tập tin" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "Độ dài" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "Đồng đẳng cho \"%s\"" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "Địa chỉ IP" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "Máy khách" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "Sự kết nối" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/giây tải xuống" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/giây tải lên" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "MB đã tải về" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "MB đã tải lên" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "% hoàn tất" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "Tốc độ ước lượng KB/giây tải xuống đồng đẳng" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "ID đồng đẳng" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "Quan tâm" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "Bị nghẽn" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "Bị ngắt" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "Tải lên thuận lợi" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "từ xa" + +#: bittorrent.py:1358 +msgid "local" +msgstr "cục bộ" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "Đồng đẳng bị lỗi" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d được" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d lỗi" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "bị cấm" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "được" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "Thông tin cho \"%s\"" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Tên dòng:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(dòng không có công cụ theo dõi)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "Thông báo địa chỉ mạng:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ", trong một tập tin" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ", trong %d tập tin" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "Kích thước toàn bộ:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "Các phần:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "Thông tin Băm:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "Lưu vào:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "Tên tập tin:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "Mở thư mục" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "Hiển thị danh sách tập tin" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "kéo để xếp lại thứ tự" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "nhấp chuột phải để hiển thị trình đơn" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Thông tin dòng" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "Gỡ bỏ dòng" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "Bỏ dòng" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ", sẽ khởi tạo trong vòng %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ", sẽ khởi tạo một cách không xác định." + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "Xong, tỷ lệ chia sẻ: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "Xong, %s đã tải lên" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "Xong" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "Thông tin_dòng" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "_Mở thư mục" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "_Danh sách tập tin" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "_Danh sách đồng đẳng" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "_Thay đổi vị trí" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "_Khởi tạo không xác định" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "Khởi động_lại" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "_Kết thúc" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "_Gỡ bỏ" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "_Bỏ" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "Bạn có chắc là muốn gỡ bỏ \"%s\"?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "Tỷ lệ chia sẻ của bạn cho dòng này là %d%%. " + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "Bạn đã tải %s lên dòng này. " + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "Gỡ bỏ dòng này?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "Đã kết thúc" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "kéo vào danh sách để khởi tạo" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "Thất bại" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "kéo vào danh sách để tiếp tục lại" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "Đang chờ" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "Đang chạy" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "Phần tải lên hiện tại: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "Phần tải xuống hiện tại: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "Phần tải lên trước: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "Phần tải xuống trước: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "Tỷ lệ chia sẻ: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "" +"%s đồng đẳng, %s khởi tạo.\n" +"Tổng số từ công cụ theo dõi: %s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "Các bản sao đã phân phối: %d; Kế tiếp: %s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "" +"Các phần: tổng %d, hoàn thành %d, hoàn thành một phần %d, hoạt động %d " +"(trống %d)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "các phần sai %d + các phần yêu cầu bị hủy %s" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "Xong %.1f%%, còn lại %s" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "Tốc độ tải về" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "Tốc độ tải lên" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "NA" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "Đã bắt đầu %s" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "_Mở tập tin dòng" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "Mở dòng_địa chỉ mạng" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "Tạo_dòng mới" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "_Tạm dừng/Phát" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "_Thoát" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "Hiện/Ẩn_các dòng đã kết thúc" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "_Định cỡ lại cửa sổ cho phù hợp" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "_Bản lưu" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "_Các cài đặt" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "_Trợ giúp" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "_Giới thiệu" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "_Tặng" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "_Tập tin" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "_Xem" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "Tìm kiếm các dòng" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(bị dừng)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(nhiều)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "Đã tải về %s trình cài đặt " + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "Cài đặt %s mới ngay bây giờ?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "" +"Bạn có muốn thoát khỏi %s và cài đặt phiên bản mới %s ngay bây giờ không?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"Có trợ giúp %s tại\n" +"%s\n" +"Bạn có muốn đến đó ngay bây giờ?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "Xem trang web trợ giúp?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "Có một dòng đã kết thúc trong danh sách. " + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "Bạn có muốn gỡ bỏ nó không?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "Có %d dòng đã kết thúc trong danh sách. " + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "Bạn có muốn gỡ bỏ tất cả?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "Gỡ bỏ tất cả các dòng đã kết thúc?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "Không có dòng đã kết thúc nào. " + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "Không có dòng đã kết thúc nào để gỡ bỏ." + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "Mở dòng:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "Thay đổi vị trí lưu cho " + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "Tập tin đã có!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "Đã có tập tin \"%s\". Bạn có muốn chọn một tên tập tin khác không?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "Lưu vị trí cho " + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "Thư mục đã có!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "" +"Đã có \"%s\". Bạn có muốn tạo một thư mục tương tự và nằm trong thư mục hiện " +"hành?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(thông điệp toàn cầu): %s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "Lỗi %s" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "Gặp nhiều lỗi. Hãy nhấp vào nút \"OK\" để xem bản lưu lỗi." + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "Ngừng dòng đang chạy?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "Bạn sắp khởi động \"%s\". Bạn có muốn ngừng dòng đang chạy cuối cùng?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "Bạn đã tặng chưa?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "Chúc mừng bạn dùng phiên bản mới %s. Bạn đã tặng chưa?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "Cám ơn!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "" +"Cám ơn bạn đã tặng. Để tặng lại, vui lòng chọn \"Donate\" trong trình đơn " +"\"Help\"." + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "bị phản đối, không nên sử dụng" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "Không thể tạo hay gởi lệnh qua cơ chế truyền thông điều khiển hiện có." + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "Đóng tất cả %s cửa sổ có thể sửa lỗi." + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s đang chạy" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "Không gởi được lệnh qua cơ chế truyền thông điều khiển hiện có." + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "Không khởi động được Chuỗi Dòng, quan sát phía trên để biết lỗi." + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s trình tạo tập tin dòng %s " + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "Tạo tập tin dòng cho tập tin/thư mục này:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "Chọn..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(Thư mục sẽ trở thành các dòng bó)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "Cỡ phần:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "Dùng_công cụ theo dõi:" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "Dùng _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "Các nút(tùy chọn):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "Chú thích:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "Tạo" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "_Máy chủ" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "_Cổng" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "Đang xây dựng các dòng..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "Đang kiểm tra các kích thước tập tin..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "Bắt đầu khởi tạo" + +#: maketorrent.py:540 +msgid "building " +msgstr "đang xây dựng" + +#: maketorrent.py:560 +msgid "Done." +msgstr "Đã xong." + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "Đã xây dựng xong các dòng." + +#: maketorrent.py:569 +msgid "Error!" +msgstr "Lỗi!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "Lỗi trong khi xây dựng các dòng: " + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d ngày" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 ngày %d giờ" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d giờ" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d phút" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d giây" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 giây" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "Trợ giúp %s" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "Các câu hỏi thường gặp:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "Đến" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "Hãy chọn một danh mục hiện có..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "Tất cả các tập tin" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Các dòng" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "Tạo một thư mục mới..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "Chọn một tập tin" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "Chọn một thư mục" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "Không tải được tình trạng đã lưu: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "Không lưu được tình trạng giao diện người dùng: " + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "Nội dung của tập tin tình trạng không hợp lệ" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "Lỗi trong khi đọc tập tin" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "không thể phục hồi hoàn toàn tình trạng" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "Tập tin tình trạng không hợp lệ (trùng mục nhập)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "Có dữ liệu bị hỏng trong" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ", không thể phục hồi dòng (" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "Tập tin tình trạng không hợp lệ (sai mục nhập)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "Tập tin tình trạng giao diện người dùng sai" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "Phiên bản tập tin tình trạng giao diện người dùng sai" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "" +"Phiên bản tập tin tình trạng giao diện người dùng không được hỗ trợ (từ " +"phiên bản khách mới hơn?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "Không thể xóa bỏ tập tin đã lưu tạm %s:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "Đây không phải là một tập tin dòng hợp lệ.(%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "Dòng này (hoặc một dòng khác có cùng nội dung)đã chạy." + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "Dòng này (hoặc một dòng khác có cùng nội dung)đang chờ chạy." + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Dòng có tình trạng không xác định %d." + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "Không ghi được tập tin" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "" +"dòng sẽ không được khởi động lại đúng khi được khởi động lại bằng máy khách" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"Không chạy được hơn %d dòng trong cùng một lúc. Để có thêm thông tin, hãy " +"xem mục các câu hỏi thường gặp tại %s." + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"Không khởi động được dòng vì có các dòng khác đang chờ chạy và dòng này đã " +"thỏa mãn các cài đặt cho thời điểm ngừng khởi tạo." + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "" +"Không khởi động được dòng vì dòng này đã thỏa mãn các cài đặt cho thời điểm " +"ngừng khởi tạo dòng hoàn thành cuối cùng." + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "Không lấy được phiên bản mới nhất từ %s." + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "Không thể phân tách chuỗi phiên bản mới từ %s." + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "" +"Không thể tìm được một vị trí tạm thời thích hợp để lưu trình cài đặt %s %s." + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "Không có sẵn tập tin dòng cho trình cài đặt %s %s." + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "Trình cài đặt %s %s có thể bị hỏng hay lỗi." + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "Không thể khởi chạy trình cài đặt trên hệ điều hành này." + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"đã lưu thư mục có dữ liệu có thể thay đổi, như thông tin fastresume và tình " +"trạng giao diện người dùng đồ họa (GUI. Mặc định là thư mục con 'dữ liệu' " +"của thư mục cấu hình bittorrent." + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"bộ mã hóa ký tự được dùng trong hệ thống tập tin cục bộ. Nếu bị bỏ trống thì " +"nó sẽ tự động dò tìm. Tuy nhiên, việc tự động dò tìm không hoạt động với các " +"phiên bản python cũ hơn 2.3" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "Mã ngôn ngữ ISO để sử dụng" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "" +"địa chỉ IP sẽ được thông báo cho công cụ theo dõi (không có tác dụng trừ khi " +"bạn trên cùng mạng cục bộ với công cụ theo dõi)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "" +"số hiệu cổng cho phép mọi người thấy nếu nó khác với cổng mà máy kháchtuân " +"theo một cách cục bộ" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "cổng tối thiểu cần tuân theo, hãy đếm nếu không có sẵn" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "cổng tối đa cần tuân theo" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "địa chỉ IP để kết nối cục bộ" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "số giây giữa các lần cập nhật thông tin đã hiển thị" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "số phút cần chờ giữa các lần yêu cầu thêm các đồng đẳng" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "số đồng đẳng tối thiểu để ngừng yêu cầu lại" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "số đồng đẳng mà ở đó ngừng việc khởi tạo các kết nối mới" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "" +"số kết nối tối đa cần cho phép, sau số này mọi kết nối đến mới sẽ bị đóng " +"ngay lập tức" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "có nên kiểm tra các Băm trên đĩa hay không" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "tốc độ tải lên tối đa kB/giây, 0 là không có giới hạn" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "số lần tải lên để điền đầy cùng với số lần mở thông thêm không có lỗi" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"số tập tin tối đa trong một dòng đa tập tin để mở cùng lúc, 0 là không có " +"giới hạn. Sử dụng số này để tránh bị hết công cụ mô tả tập tin." + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "" +"Khởi tạo một máy khách không có công cụ theo dõi. Việc này phải được tiến " +"hành để tải về các dòng không có công cụ theo dõi. " + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "số giây tạm dừng giữa các lần gửi chờ" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "bao nhiêu byte cần truy vấn trong mỗi lần yêu cầu" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "" +"độ dài tối đa của mã hóa tiền tố mà bạn chấp nhận qua đường dẫn - các giá " +"trị lớn hơn sẽ làm rớt kết nối." + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "" +"số giây cần chờ giữa các lần đóng các cơ chế truyền thông mà qua các cơ chế " +"này không nhận được thông tin." + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "số giây chờ giữa các lần kiểm tra nếu có các kết nối quá thời hạn" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"độ dài tối đa phần gửi cho các đồng đẳng, đóng kết nối nếu nhận được một yêu " +"cầu lớn hơn" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "thời gian ngưng tối đa để ước lượng tốc độ tải về/tải xuống hiện hành" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "thời gian ngưng tối đa để ước lượng tốc độ khởi tạo hiện hành" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "" +"thời gian tối đa chờ giữa các lần thử lại thông báo nếu chúng tiếp tục thất " +"bại" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"số giây chờ dữ liệu đến qua một kết nối trước khi cho rằng nó bị nghẽn bán " +"thường xuyên. " + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "" +"số lần tải về mà căn cứ vào đó để chuyển đổi từ ngẫu nhiên đến hiếm nhất đầu " +"tiên" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "bao nhiêu byte cần ghi vào bộ đệm mạng cùng một lúc." + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"từ chối kết nối thêm từ các địa chỉ của các đồng đẳng bị hỏng hoặc các đồng " +"đẳng đối nghịch có chủ định gởi dữ liệu lỗi " + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "không kết nối đến nhiều đồng đẳng có cùng một địa chỉ IP" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "" +"nếu khác không thì cài đặt tùy chọn Điều Kiện Dịch Vụ (TOS) cho kết nối đồng " +"đẳng theo giá trị này" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "kích hoạt việc gỡ rối trong libc BSD làm chậm lại việc đọc tập tin." + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "" +"địa chỉ của proxy giao thức truyền siêu văn bản dùng để kết nối với công cụ " +"theo dõi" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "đóng kết nối với RST và tránh tình trạng TCP TIME_WAIT " + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"Sử dụng các thư viện trên mạng xoắn cho các kết nối mạng. 1 có nghĩa là sử " +"dụng xoắn, 0 có nghĩa là không sử dụng xoắn, -1 có nghĩa là tự động dò tìm " +"và ưu tiên xoắn" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"tên tập tin (cho các dòng tập tin đơn) hay tên thư mục (cho các dòng bó) để " +"lưu dòng, ghi đè lên tên mặc định trong dòng. Xem thêm --lưu_vào, nếu chưa " +"chỉ rõ một trong hai lựa chọn thì người dùng sẽ được hỏi về vị trí lưu" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "hiển thị giao diện người dùng cao cấp" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "" +"số phút tối đa để khởi tạo một dòng hoàn thành trước khi ngừng khởi tạo" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"tỷ lệ tải lên/tải về tối thiểu, theo phần trăm, cần đạt được trước khi " +"ngừng. 0 có nghĩa là không có giới hạn." + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"tỷ lệ tải lên/tải về tối thiểu, theo phần trăm, cần đạt được trước khi ngừng " +"khởi tạo dòng cuối cùng. 0 có nghĩa là không có giới hạn. " + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "" +"Khởi tạo mỗi dòng hoàn tất một cách không xác định (đến khi người dùng hủy " +"nó)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "" +"Khởi tạo dòng cuối cùng một cách không xác định (đến khi người dùng hủy nó)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "khởi động Phần Mềm Tải Về trong tình trạng tạm ngưng" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"chỉ rõ ứng xử của ứng dụng khi người sử dụng khởi động bằng tay một dòng " +"nữa: \"thay thế\" có nghĩa là luôn thay thế dòng đang chạy bằng một dòng mới," +"\"thêm\" có nghĩa là luôn thêm dòng đang chạy song song và \"hỏi\" có nghĩa " +"là hỏi người dùng mỗi lần." + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"tên tập tin (cho các dòng tập tin đơn) hoặc tên thư mục (cho các dòng bó) để " +"lưu dòng, ghi đè lên tên mặc định trong dòng. Xem thêm --lưu_vào" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"số tải lên tối đa cho phép trong một lần. -1 có nghĩa là (mong muốn) một con " +"số hợp lý dựa trên --tốc độ_tải lên_tối đa. Giá trị tự động chỉ có nghĩa khi " +"chỉ chạy một dòng tại một thời điểm. " + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"thư mục cục bộ sẽ lưu nội dung dòng. Tập tin (các dòng tập tin đơn) hoặc thư " +"mục (các dòng bó) sẽ được tạo dưới thư mục này, dùng tên mặc định được chỉ " +"rõ trong tập tin .dòng. Xem thêm --lưu_như." + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "có nên hỏi về vị trí để lưu các tập tin đã tải về hay không" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"thư mục cục bộ nơi các dòng sẽ được lưu, dùng một tên được xác định bởi --" +"lưu như_kiểu. Nếu nó được bỏ trống thì từng dòng sẽ được lưu dưới thư mục " +"của tập tin .dòng tương ứng" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "mức độ thường xuyên quét lại thư mục dòng, tính theo giây" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"Cách đặt tên của dòng tải về:1: sử dụng tên CỦA tập tin dòng (trừ .dòng);2: " +"sử dụng tên đã được mã hóa TRONG tập tin dòng;3: tạo thư mục có tên CỦA tập " +"tin dòng (trừ .dòng) và lưu vào thư mục này sử dụng tên đã được mã hóa TRONG " +"tập tin dòng;4: nếu tên CỦA tập tin dòng (trừ .dòng) và tên được mã hóa " +"TRONG tập tin dòng giống nhau, hãy sử dụng tên này (kiểu 1/2), nếu không hãy " +"tạo một thư mục trung gian như trong kiểu 3; KHUYẾN CÁO: chọn lựa 1 và 2 có " +"khả năng ghi đè lên tập tin mà không có cảnh báo và có thể xảy ra vấn đề về " +"bảo mật." + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "có nên hiển thị đường dẫn đầy đủ hay nội dung dòng cho từng dòng" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "thư mục nơi cần tìm tập tin .dòng (bán đệ qui)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "có nên hiển thị thông tin chẩn đoán vào thiết bị xuất chuẩn hay không" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "hai lũy thừa mấy để đặt cho cỡ phần" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "tên công cụ theo dõi mặc định" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"nếu sai thì tạo một dòng không có công cụ theo dõi, thay vì thông báo địa " +"chỉ mạng, sử dụng nút tin cậy có dạng<địa chỉ IP>: hoặc một chuỗi " +"trống để gói mấy nút từ bảng định tuyến của bạn" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "hoàn thành tải về!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "kết thúc trong %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "tải về thành công" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (%.1f MB lên / %.1f MB xuống)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB lên / %.1f MB xuống)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d được xem hiện tại, cộng %d bản sao đã phân phối (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d bản sao đã phân phối (kế tiếp: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "%d được xem hiện tại" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "LỖI:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "đang lưu:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "cỡ tập tin:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "phần trăm đã xong:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "thời gian còn lại:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "tải về vào:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "tốc độ tải về:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "tốc độ tải lên:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "tỷ lệ chia sẻ:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "trạng thái khởi tạo:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "trạng thái đồng đẳng:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "Bạn không thể chỉ định cả hai --lưu_như và --lưu_vào." + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "đang tắt máy" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "Lỗi trong khi đọc cấu hình:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "Lỗi trong khi đọc tập tin .dòng:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "bạn phải chỉ rõ một tập tin .dòng" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "" +"Thất bại khi khởi tạo Giao Diện Người Dùng Đồ Hoạ chế độ văn bản, không thể " +"tiếp tục." + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"Giao diện tải về này cần mô-đun Python chuẩn \"curses\", Và giao diện này " +"không có sẵn cho cổng Windows riêng của Python. Tuy nhiên, nó có sẵn cho " +"cổng Cygwin của Python, chạy trên tất cả các hệ thống Win32 (www.cygwin.com)." + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "Bạn có thể vẫn dùng \"bittorrent-console\" để tải về." + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "tập tin:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "kích cỡ:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "đích:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "tiến trình:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "trạng thái:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "tốc độ tải về:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "tốc độ tải lên:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "chia sẻ:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "các khởi tạo:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "các đồng đẳng:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d được xem hiện tại, cộng %d bản sao đã phân phối (%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "lỗi:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "lỗi:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# Địa chỉ IP Tải lên Tải xuống Tốc độ hoàn thành" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "đang tải về %d phần, có %d đoạn, %d trên %d các phần đã hoàn thành" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "Những lỗi này xảy ra trong khi thực hiện:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "" +"Cách sử dụng: %s ĐỊA CHỈ MẠNG_CỦA CÔNG CỤ THEO DÕI [TẬPTINDÒNG " +"[TẬPTINDÒNG ...]]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "thông báo cũ cho %s: %s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "không có dòng" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "LỖI HỆ THỐNG-GẶP NGOẠI LỆ" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "Cảnh báo:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "không phải là một thư mục" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"lỗi: %s\n" +"chạy không có đối số để giải thích tham số" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"NGOẠI LỆ:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "Bạn vẫn còn có thể sử dụng \"btdownloadheadless.py\" để tải về." + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "đang kết nối đến các đồng đẳng" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "Thời gian dự kiến trong %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "Kích cỡ" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "Tải về" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "Tải lên" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "Tổng số:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" +"(%s) %s - %s các đồng đẳng %s các khởi tạo %s các bản sao đã phân phối - %s " +"dn %s lên" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "lỗi: " + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"chạy không có đối số để giải thích tham số" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "chú thích có tùy chọn có thể đọc được để cho vào tập tin .dòng" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "tập tin đích tùy chọn cho dòng" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s — giải mã %s các tập tin thông tin về biến đổi" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "Cách sử dụng: %s [TẬPTINDÒNG [TẬPTINDÒNG...]]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "tập tin thông tin về biến đổi: %s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "thông tin Băm: %s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "tên tập tin: %s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "kích cỡ tập tin:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "các tập tin:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "tên thư mục: %s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "kích cỡ lưu trữ:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "địa chỉ mạng thông báo của công cụ theo dõi: %s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "các nút không có công cụ theo dõi:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "chú thích:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "Không thể tạo cơ chế truyền thông điều khiển:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "Không gửi được lệnh:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "Không thể tạo cơ chế truyền thông điều khiển: đang được sử dụng" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "Không thể gỡ bỏ tên tập tin cơ chế truyền thông điều khiển cũ:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "Mutex toàn cầu đã được tạo." + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "Không thể tìm được một cổng mở!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "Không thể tạo được thư mục dữ liệu ứng dụng!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" +"Không thể yêu cầu khóa mutex toàn cầu cho tập tin của cơ chế truyền thông " +"điều khiển!" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "Một ví dụ trước của BT đã không được làm sạch đúng. Đang tiếp tục." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "không phải là một chuỗi mã hóa b hợp lệ" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "giá trị mã hóa b không hợp lệ (dữ liệu sau tiền tố hợp lệ)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "Cách sử dụng: %s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[CÁCTÙYCHỌN][THƯMỤCDÒNG]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"Nếu có một đối số không phải là tùy chọn thì coi nó là giá trị \n" +"của các tùy chọn của thư mục_dòng.\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[CÁCTÙYCHỌN][CÁCTẬPTINDÒNG]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[CÁCTÙYCHỌN] [TẬPTINDÒNG]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[TÙYCHỌN] ĐỊA_CHỈ_MẠNG_CỦA_TẬP_TIN_THEO_DÕI [TẬPTIN]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "các đối số là-\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(mặc định cho " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "khóa không xác định" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "tham số được gởi qua tại điểm đầu không có giá trị" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "không phân tách dòng lệnh được tại" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "Tùy chọn %s được yêu cầu" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "Cần phải cung cấp ít nhất %d đối số." + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "Quá nhiều đối số — %d là tối đa." + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "định dạng của %s không đúng-%s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "Không thể lưu vĩnh viễn các tùy chọn:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" +"Thông báo công cụ theo dõi chưa hoàn thành trong %d giây sau khi khởi động nó" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "" +"Lỗi trong khi kết nối đến công cụ theo dõi, gethostbyname (gọi máy chủ theo " +"tên)đã thất bại-" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "Lỗi trong khi kết nối đến công cụ theo dõi - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "dữ liệu sai từ công cụ theo dõi-" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "công cụ theo dõi đã từ chối-" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "" +"Đang bỏ dở dòng vì bị công cụ theo dõi từ chối trong khi không kết nối đến " +"bất kỳ đồng đẳng nào." + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "Thông điệp từ công cụ theo dõi:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "cảnh báo từ công cụ theo dõi-" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "Không đọc được thư mục" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "Không thể tìm các thông tin về tình trạng tập tin" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "đang gỡ bỏ %s (sẽ thêm lại)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**cảnh báo** %s là dòng trùng với %s" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**cảnh báo** %s có lỗi" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... thành công" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "đang gỡ bỏ %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "kiểm tra xong" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "mất cơ chế truyền thông của máy chủ" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "Công cụ quản lý lỗi đã chấp nhận kết nối:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "" +"Phải thoát vì ngăn nhớ TCP bị hỏng. Hãy xem Các Câu Hỏi Thường Gặp tại %s." + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "Quá muộn để bật đầu cuối của RAWSERVER, %s đã được sử dụng." + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "Thứ hai" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "Thứ ba" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "Thứ tư" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "Thứ năm" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "Thứ sáu" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "Thứ bảy" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "Chủ nhật" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "Tháng 1" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "Tháng 2" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "Tháng 3" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "Tháng 4" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "Tháng 5" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "Tháng 6" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "Tháng 7" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "Tháng 8" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "Tháng 9" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "Tháng 10" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "Tháng 11" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "Tháng 12" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "Đã nén: %i Đã giải nén: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "" +"Bạn không thể chỉ rõ tên của tập tin .dòng khi tạo ra nhiều dòng cùng lúc." + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "Phiên bản này không hỗ trợ việc mã hóa hệ thống tập tin %s." + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"Không thể chuyển đổi tên tập tin/thư mục \"%s\" sang UTF-8 (%s). Hoặc việc " +"mã hóa hệ thống tập tin được giả sử là \"%s\" là sai hoặc tên tập tin chứa " +"các byte không hợp lệ." + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"Tên tập tin/thư mục \"%s\" chứa các giá trị Unicode được dành riêng không " +"tương ứng với các ký tự." + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "dữ liệu sai trong tập tin trả lời-tổng số quá nhỏ" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "dữ liệu sai trong tập tin trả lời-tổng số quá lớn" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "đang kiểm tra tập tin hiện hữu" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--kiểm tra_Băm 0 hoặc thông tin fastresume không khớp với tình trạng tập tin " +"(mất dữ liệu)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "Thông tin fastresume sai (tập tin chứa nhiều dữ liệu hơn)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "Thông tin fastresume sai (giá trị không hợp lệ)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "dữ liệu bị hỏng trên đĩa-có thể bạn đã chạy hai bản sao?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "Không đọc được dữ liệu có định dạng fastresume:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "" +"đã chỉ định tập tin hoàn thành khi khởi động, nhưng một phần đã thất bại khi " +"kiểm tra Băm" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "Tập tin %s thuộc về một dòng đang chạy khác" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "Tập tin %s đã tồn tại, nhưng không phải là một tập tin bình thường." + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "Đọc nhanh-tập tin đã bị cắt ngắn?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "" +"Định dạng tập tin fastresume không được hỗ trợ, có thể từ một phiên bản máy " +"khách khác?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "" +"Một chương trình khác có thể đã di chuyển, đặt lại tên, hay đã xóa tập tin." + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "Một chương trình khác có thể đã chỉnh sửa tập tin." + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "Một chương trình khác có thể đã thay đổi kích cỡ tập tin. " + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "Không đặt được công cụ quản lý tín hiệu:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "đã rớt \"%s\"" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "đã thêm \"%s\"" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "đang chờ kiểm tra Băm" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "đang tải về" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "Đang đọc lại tập tin cấu hình" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "Không đọc được %s." + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"Không thể tải về hay mở\n" +"%s\n" +"Hãy thử sử dụng trình duyệt Web để tải về tập tin dòng." + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"Có thể đây là phần mềm Python phiên bản cũ và nó không hỗ trợ dò tìm bộ mã " +"hóa hệ thống tập tin. Giả sử 'ascii'." + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "" +"Python thất bại khi tự động dò tìm bộ mã hóa hệ thống tập tin. Hãy sử dụng " +"'ascii' thay thế." + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "" +"Không hỗ trợ bộ mã hóa hệ thống tập tin '%s'. Hãy sử dụng 'ascii' thay thế." + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "Thành phần đường dẫn tập tin sai:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"Tập tin .dòng này đã được tạo bởi một công cụ bị hỏng và có tên tập tin được " +"mã hóa không đúng. Một số hay tất cả các tên tập tin này có thể sẽ hiển thị " +"khác so với công cụ tạo tập tin của tập tin .dòng chỉ định." + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"Tập tin .dòng này đã được tạo bởi một công cụ bị hỏng và có giá trị ký tự " +"sai không tương ứng với ký tự thật nào. Một số hay tất cả tên tập tin này có " +"thể sẽ hiển thị khác so với công cụ tạo tập tin của tập tin .dòng chỉ định." + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"Tập tin .dòng này đã được tạo bởi một công cụ bị hỏng và có tên tập tin được " +"mã hóa cho đúng. Tên được sử dụng có thể vẫn đúng." + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"Bộ ký tự được dùng trong hệ thống tập tin cục bộ (\"%s\") không thể thể hiện " +"tất cả mọi ký tự được sử dụng trong tên tập tin của dòng này. Tên tập tin đã " +"được thay đổi từ tên đầu tiên." + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Hệ thống tập tin Windows không thể xử lý một số ký tự được dùng trong tên " +"tập tin của dòng này. Tên tập tin đã được thay đổi từ tên đầu tiên." + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"Tập tin .dòng này đã được tạo bởi một công cụ bị hỏng và có ít nhất một tập " +"tin có tên tập tin hay tên thư mục không hợp lệ. Tuy nhiên, vì mọi tập tin " +"như vậy đã được đánh dấu có độ dài là 0 và các tập tin này được bỏ qua." + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "Python phiên bản 2.2.1 hay các phiên bản mới hơn được yêu cầu" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "Không thể khởi động hai trường hợp riêng của cùng một dòng" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "" +"số hiệu cổng tối đa nhỏ hơn số hiệu cổng tối thiểu: không có cổng nào để " +"kiểm tra" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "Không mở được một cổng tuân theo: %s" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "Không mở được một cổng tuân theo: %s." + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "Kiểm tra cài đặt phạm vi cổng." + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "Khởi động lần đầu" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "Không tải được dữ liệu định dạng fastresume: %s" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "Sẽ thực hiện việc kiểm tra Băm đầy đủ." + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "phần %d đã thất bại việc kiểm tra Băm, đang tải về nó lần nữa" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "" +"Cố gắng tải về một dòng không có công cụ theo dõi với máy khách không có " +"công cụ theo dõi được tắt." + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "tải về thất bại:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "" +"Lỗi xuất/nhập: không còn chỗ chứa trên đĩa hoặc không tạo được một tập tin " +"lớn như thế:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "đã kết thúc bởi lỗi xuất/nhập:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "đã kết thúc bởi lỗi hệ điều hành:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "đã kết thúc bởi lỗi ngoại lệ bên trong:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "Có thêm lỗi khi đang đóng vì có sẵn lỗi:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "Không thể gỡ bỏ tập tin fastresume sau khi thất bại:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "đang khởi tạo" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "Không ghi được dữ liệu fastresume:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "tắt máy" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "thông tin về biến đổi sai-không phải là một từ điển" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "thông tin về biến đổi sai-khóa các phần sai" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "thông tin về biến đổi sai-độ dài phần không hợp lệ" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "thông tin về biến đổi sai: tên sai" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "không cho phép tên %s vì lý do bảo mật" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "trộn tập tin đơn/đa với nhau" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "thông tin về biến đổi sai-độ dài sai" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "" +"thông tin về biến đổi sai-\"files\" không phải là một danh sách các tập tin" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "thông tin về biến đổi sai-giá trị tập tin sai" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "thông tin về biến đổi sai-đường dẫn sai" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "thông tin về biến đổi sai-thư mục đường dẫn sai" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "không cho phép đường dẫn %s vì lý do bảo mật" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "thông tin về biến đổi sai-đường dẫn trùng" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "" +"thông tin về biến đổi sai-tên được sử dụng làm cả tên tập tin và tên thư mục " +"con" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "thông tin về biến đổi sai-kiểu đối tượng không đúng" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "thông tin về biến đổi sai-không có thông báo chuỗi địa chỉ Mạng " + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "lý do thất bại không hiển thị bằng chữ" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "thông điệp cảnh báo không hiển thị bằng chữ" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "mục nhập không hợp lệ trong danh sách đồng đẳng 1" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "mục nhập không hợp lệ trong danh sách đồng đẳng 2" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "mục nhập không hợp lệ trong danh sách đồng đẳng 3" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "mục nhập không hợp lệ trong danh sách đồng đẳng 4" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "danh sách đồng đẳng không hợp lệ" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "khoảng nghỉ giữa hai lần thông báo không hợp lệ" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "khoảng nghỉ tối thiểu giữa hai lần thông báo không hợp lệ" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "địa chỉ id công cụ theo dõi không hợp lệ" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "số đếm đồng đẳng không hợp lệ" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "số đếm khởi tạo không hợp lệ" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "mục nhập \"cuối cùng\" không hợp lệ" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "Cổng để tuân theo." + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "tập tin để chứa thông tin về các phần mềm được dùng để tải về gần đây" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "hết thời gian đóng các kết nối" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "số giây giữa các lần lưu tập tin tải về" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "số giây giữa các lần phần mềm dùng để tải về hết hạn" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "số giây phần mềm dùng để tải về chờ giữa các lần thông báo lại" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" +"số đồng đẳng mặc định để gửi một thông điệp thông tin đến nếu máy khách " +"không chỉ rõ một số nào." + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "thời gian cần chờ giữa các lần kiểm tra nếu hết thời gian kết nối" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "" +"số lần cần kiểm tra nếu phần mềm dùng để tải về nằm sau một NAT(0 có nghĩa " +"là Đừng kiểm tra)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "có nên thêm mục nhập vào bản lưu để có kết quả kiểm tra NAT hay không" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" +"thời gian tối thiểu tính từ khi xóa sạch lần cuối để có thể thực hiện việc " +"này thêm một lần nữa" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"thời gian tối thiểu tính bằng giây trước khi bộ nhớ đệm được coi là cũ và " +"được xóa sạch" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"chỉ cho phép việc tải về cho tập tin .dòng trong thư mục này (cũng đệ qui " +"trong thư mục con của các thư mục không có tập tin .dòng). Nếu chọn tính " +"năng này, các dòng trong thư mục này xuất hiện trong trang thông tin và " +"chúng có thể có hay không có các đồng đẳng" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" +"cho phép các khóa đặc biệt trong các dòng trong thư mục cho phép có tác động " +"đến việc truy cập công cụ theo dõi" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "có nên mở lại tập tin bản lưu khi nhận được tín hiệu HUP hay không" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" +"có nên hiển thị trang thông tin khi tải thư mục gốc của công cụ theo dõi hay " +"không" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "địa chỉ Mạng nơi cần chuyển hướng trang thông tin đến" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "có nên hiển thị tên từ thư mục cho phép hay không" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" +"tập tin chứa dữ liệu x-icon sẽ trở về khi trình duyệt yêu cầu favicon.ico" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"bỏ qua tham số GET ip từ các máy không có địa chỉ IP của mạng cục bộ " +"(0=không bao giờ,1=luôn luôn,2= bỏ qua nếu tính năng kiểm tra NAT bị tắt)Các " +"dòng đầu của proxy truyền dẫn siêu văn bản cung cấp địa chỉ của máy khách " +"gốc được coi như các --ip." + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "" +"tập tin để ghi các bản lưu của công cụ theo dõi, dùng-cho thiết bị xuất " +"chuẩn (mặc định)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"dùng với thư mục cho phép; thêm một địa chỉ Mạng \"a/file?hash={hash}\" cho " +"phép người dùng tải xuống tập tin dòng " + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"giữ các dòng chết sau khi chúng hết hạn (nên chúng vẫn xuất hiện trong trang " +"scrape và trang web của bạn). Chỉ xảy ra vấn đề nếu chưa đặt allowed_dir " +"(thư mục cho phép)." + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" +"cho phép truy cập scrape (giá trị có thể là không có, cụ thể hay đầy đủ)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "số đồng đẳng tối đa để đáp ứng bất kỳ yêu cầu nào" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"có lẽ tập tin của bạn tồn tại một nơi nào khác\n" +"nhưng mà tiếc là nó không phải tại đây\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**cảnh báo** tập tin favicon chỉ định --%s--không tồn tại." + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**cảnh báo** tập tin tình trạng %s bị hỏng; đang đặt lại" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# Bản lưu bắt đầu:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "" +"**cảnh báo** không thể chuyển hướng thiết bị xuất chuẩn vào tập tin bản lưu:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# Mở lại bản lưu:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**cảnh báo** không thể mở lại tập tin bản lưu" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "công cụ theo dõi này không có chức năng scrape đó." + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "công cụ theo dõi này không có chức năng scrape đầy đủ." + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "công cụ theo dõi này không có chức năng lấy." + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" +"Việc tải về theo yêu cầu không được quyền sử dụng với công cụ theo dõi này." + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "chạy không có đối số nào để giải thích các tham số" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# Đang tắt máy:" diff --git a/locale/zh_CN/LC_MESSAGES/bittorrent.mo b/locale/zh_CN/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..db3efca1c72c4d792e38c5b8ad18067392981654 GIT binary patch literal 59669 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ǘXUudKu3RE5^5 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 F(;uEF#!dhL literal 0 HcmV?d00001 diff --git a/locale/zh_CN/LC_MESSAGES/bittorrent.po b/locale/zh_CN/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..e3e7bf6 --- /dev/null +++ b/locale/zh_CN/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2770 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-11 05:42-0800\n" +"Last-Translator: translate4me \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "安装 Python 2.3 或更新版本" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "需要 PyGTK 2.4 或更新版本" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "输入种子地址" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "输入要打开的种子文件地址:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "拨号" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "数字用户线路(DSL)/电缆 128k 以上" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "数字用户线路(DSL)/电缆 256k 以上" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "数字用户线路(DSL) 768k 以上" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "最大上传速率:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "暂时停止全部运行中的种子" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "继续下载" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "暂停的" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "没有种子" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "正常运行中" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "处于防火墙/NAT之后" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "新版本 %s 可用" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "已有更新的版本 %s 可用。\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "您正在使用的版本为 %s,新版本为 %s。\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"您可以由以下位置下载最新版本︰\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "稍后下载(_l)" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "开始下载(_n)" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "稍后再提醒我(_R)" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "关于 %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "测试版" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "版本 %s" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "不能打开 %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "捐款" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s 历史日志" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "保存日志于:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "日志已保存" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "日志已清除" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s 设置" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "保存" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "保存下载位置:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "更改..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "每次新下载都询问保存位置" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "正在下载" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "手动开始其他torrent文件下载:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "总是停止最近正在运行的下载(_l)" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "总是以并行开始下载(_p)" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "每次都询问(_A)" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "做种状态中" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"完成后继续做种:直到共享比率达到百分之[_],或者持续[_]分钟,优先选择的选项有" +"效。" + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "无限期做种" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "为刚完成的下载做种:直到共享比率达到百分之[_]" + +#: bittorrent.py:925 +msgid "Network" +msgstr "网络" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "查找可用端口:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "起始端口:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "报告给跟踪服务器的 IP 地址:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(除非与跟踪服务器处于\n" +"同一局域网,否则无效)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"进度条文字总为黑色\n" +"(需要重启程序)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "杂项" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"警告:改变这些设置可能\n" +"导致 %s 的功能异常。" + +#: bittorrent.py:986 +msgid "Option" +msgstr "选项" + +#: bittorrent.py:991 +msgid "Value" +msgstr "值" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "高级" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "选择默认下载目录:" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "“%s”中的文件" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "应用" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "分配" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "从不下载" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "减少" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "增加" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "文件名" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "长度" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "“%s”的对等客户" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP 地址" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "客户端" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "连接" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s 下载" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s 上传" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "已下载 MB" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "已上传 MB" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "完成 %" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "估计对方下载速度 KB/s" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "对等客户 ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "感兴趣" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "堵塞" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "缓冲" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "乐观上传" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "远程" + +#: bittorrent.py:1358 +msgid "local" +msgstr "本地" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "有问题的对等客户" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr "%d 完成" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "%d 错误" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "禁止的" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "完好" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "“%s”的相关信息" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "种子文件名称:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(无跟踪服务器种子)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "发布 url:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ",包含了一个文件" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ",包含了 %d 个文件" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "总大小:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "分块数目:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "信息摘要值:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "保存于:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "文件名:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "打开目录" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "显示文件列表" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "按住鼠标左键拖放选项以重新排列" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "单击右键打开菜单" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "种子信息" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "删除种子" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "终止种子" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ",将继续做种 %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ",将无限期做种。" + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "已完成,共享比率为:%d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "已完成,%s 已上传" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "完成" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "种子信息(_i)" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "打开目录(_O)" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "文件列表(_F)" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "对等客户列表(_P)" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "改变位置(_C)" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "无限期做种(_S)" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "重新开始(_s)" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "完成(_F)" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "移除(_R)" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "放弃(_A)" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "您是否确定要删除“%s”?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "您对该种子的共享率是 %d%%。" + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "您给该种子上传了 %s。" + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "是否要删除该种子?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "已完成" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "请拖放到清单中以作种" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "失败" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "请拖放到清单中以继续" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "等待中" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "运行中" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "当前上传:%s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "当前下载:%s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "之前上传:%s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "之前下载:%s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "共享比率:%0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s 个对等客户,%s 个种子。跟踪服务器共传回 %s 个对等客户" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "分散的拷贝 %d 个;下一个为:%s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "" +"文件片段:总计 %d,%d 片完整,%d 片部分完成,%d 片正下载中(%d 片是空片)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d 错误文件块 + 丢弃请求中 %s 字节" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "完成 %.1f%%,还剩 %s" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "下载速度" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "上传速度" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "未知" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s 已经开始" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "打开种子文件(_O)" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "打开种子 _URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "制作新种子(_N)" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "暂停/继续(_P)" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "退出(_Q)" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "显示/隐藏已完成的种子(_F)" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "重置为适中大小的窗口(_R)" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "日志(_L)" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "设置(_S)" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "帮助(_H)" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "关于(_A)" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "捐赠(_D)" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "文件(_F)" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "查看(_V)" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "搜索种子" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(停止的)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(多个)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "已经开始下载 %s 安装包" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "现在要安装新的 %s 吗?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "是否要现在退出 %s 并安装新版本 %s 吗?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s 的帮助信息在\n" +"%s\n" +"您是否想去看看?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "是否访问帮助页面?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "在清单中有一个已经完成的种子。" + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "您确定要删除吗?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "在清单中共有 %d 个已经完成的种子。" + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "您确定要全部删除吗?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "确定要删除所有已经完成的种子吗?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "不存在已经完成的种子" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "没有已经完成的种子可删除。" + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "打开种子:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "改变保存位置" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "文件已存在!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "“%s”已经存在。您是否要选择一个不同的文件名?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "保存位置:" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "目录已存在!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "“%s”已存在。你是否要在此目录中创建一个同样的副本?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(全局消息):%s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s 出错" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "有多个错误发生。请点击“确定”查看错误日志。" + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "停止正在运行的种子吗?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "您将要开始运行“%s”。您是否打算此时停止最后正在运行中的种子?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "您已捐赠过了吗?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "欢迎使用 %s 的新版本。您是否已捐赠过?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "谢谢!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "谢谢您的捐赠!若您还想捐赠,请选择“帮助”菜单中的“捐赠”选项。" + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "已过期,请勿使用" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "无法通过已存在的控制接口创建或者发送命令。" + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "关闭所有的 %s 窗口也许可以解决这个问题。" + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s 已经在运行" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "无法通过已存在的控制接口发送命令。" + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "无法启动种子队列,错误详情请看上方。" + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s 种子文件制作者 %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "为此文件/目录制作种子:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "选取..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(目录将被制作为批处理种子)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "分块大小:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "使用跟踪服务器(_T):" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "使用分布式哈希表(_DHT):" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "节点(可选):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "备注:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "制作" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "主机(_H)" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "端口(_P)" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "制作种子..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "检查文件大小..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "开始做种" + +#: maketorrent.py:540 +msgid "building " +msgstr "正在制作" + +#: maketorrent.py:560 +msgid "Done." +msgstr "完成。" + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "完成制作 torrent 文件。" + +#: maketorrent.py:569 +msgid "Error!" +msgstr "错误!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "种子制作出现错误:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d 天" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 天 %d 小时" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d 小时" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d 分钟" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d 秒" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 秒" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s 帮助" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "常见问题:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "跳转" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "选择一个现有文件夹..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "所有文件" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "种子文件" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "建立一个新文件夹..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "选择一个文件" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "选择一个文件夹" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "不能载入保存的状态:" + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "不能保存用户界面状态:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "无效状态文件内容" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "读取文件错误" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "不能完全恢复状态" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "无效状态记录文件(重复的条目)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "损坏数据发现于" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ",不能恢复种子文件(" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "无效状态记录文件(损坏的条目)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "损坏的用户界面状态记录文件" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "损坏的用户界面状态记录文件版本" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "不支持的用户界面状态记录文件版本 (来自更新的客户端版本?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "无法删除缓存中的 %s 文件:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "这不是一个有效的种子文件。(%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "这个种子文件(或者一个有着相同内容的文件)已经开始在下载了。" + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "这个种子文件(或者一个有着相同内容的文件)已经在等待运行。" + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "种子处于未知状态 %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "不能写入文件" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "这将导致种子在程序重启后不能正确启动" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "不能同时运行多于 %d 个种子。欲知更多信息,请从 %s 查看常见问题解答。" + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "停止做种,因为有其它种子在等待运行,并且已经满足停止做种的条件。" + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "停止做种,因为它已经满足停止做种的条件。" + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "无法从 %s 获得最新版本" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "无法从 %s 解析新的版本字符串" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "无法找到一个合适的临时地点来保存 %s %s 的安装程序。" + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "没有提供 %s %s 安装程序的种子文件。" + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s 安装程序似乎已经损坏或丢失。" + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "无法在此操作系统上启动安装程序" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"保存快速恢复信息、图形用户界面状态数据等变量的目录。默认设为 bittorrent 配置" +"目录的“data”子目录。" + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"本地文件系统所用的字符编码。如果不指定,系统将自动检测。低于 2.3 的 python 版" +"本自动检测不能实现。" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "使用的 ISO 语言编码" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "报告给跟踪服务器的 ip 地址(除非与跟踪服务器在同一本地网,否则无效)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "公网可见的端口(当与客户端本地监听的端口不同时)" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "监听的最小端口,不可使用时递增" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "监听的最大端口" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "本地绑定的 ip 地址" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "显示信息刷新的间隔(秒)" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "向服务器请求更多对等客户信息的时间间隔(分钟)" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "停止重新请求所需要的最少的对等客户的数目" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "停止发起新连接所需要的对等客户的数目" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "允许的最大连接数目,超过这个数目后新的连接将被立即关闭" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "是否检查磁盘上的消息摘要值" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "以 kB/s 表示的最大上传速率,0 表示没有限制" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "填满多余的乐观阻塞情况所需要的上传的数目" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"在处理一个包含多个文件的种子的时候,最多允许同时打开的文件数目,0 表示没有限" +"制。使用这项参数以避免文件描述符耗尽。" + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "初始化无跟踪服务的客户端。如果下载无跟踪服务的种子必须启用该功能。" + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "发送心跳信号的时间间隔(秒)" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "每个请求要求多少个字节。" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "您的线路能接收的最长的前缀编码-此值过高容易导致连接中断。" + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "没有新数据待接收的网络端口的关闭等待时间(秒)" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "两次检查连接超时的行为之间的时间间隔(秒)" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "" +"发送到对等客户的最长的数据片,如果请求发送的长度大于这个数目,将关闭其连接" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "进行当前上传和下载的速率的两次估算的最大间隔时间" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "进行当前种子比率的两次估算的最大时间间隔" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "当发布持续失败时的最大重试间隔时间" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "" +"在确认某个连接已经发生半永久性阻塞之前等待它上面的数据到达的时间间隔(秒)" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "从随机更换到最稀有者优先所需要的下载数目" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "一次往网络缓冲区写入的字节数。" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "" +"拒绝从发送不正确的数据,因而可能是已破坏的或者有潜在敌意的对等客户的地址处接" +"收进一步的连接" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "不要连接到拥有同一个 ip 地址的几个对等客户" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "如果非零,则将对等客户的连接的 TOS 选项设置为这个值" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "" +"允许一个替代解决方案,以消除 BSD 的 libc 中的一个问题,该问题会导致文件读取速" +"度很慢。" + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "连接到跟踪器所需要的 HTTP 代理服务器的地址" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "使用 RST 来关闭连接,避免 TCP TIME_WAIT 状态" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"使用 Twisted 网络库来连接网络。1 使用 Twisted,0 不使用 Twisted,-1 自动检" +"测,如果有则使用 Twisted。" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"文件名(单文件种子)或者目录名(批处理种子)要把种子另存为其它文件,应替换掉" +"种子的默认名称。请参阅--save_in,如果这两个参数都没有被指定,则用户将会被询问" +"保存地点。" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "显示高级用户界面" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "为已完成的种子文件继续做种的最长时间(分钟)" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "" +"在停止做种前所要达到的最小的上传/下载率,用百分数表示。0 表示没有限制。" + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"在为上一个完成的种子文件停止做种前所要达到的最小的上传/下载率,用百分数表示。" +"0 表示没有限制。 " + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "为每个已完成的种子文件无限期做种(除非用户手动取消它)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "为上一个完成的种子文件无限期做种(除非用户手动取消它)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "以暂停的状态启动下载客户端" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"决定当用户手动开始另外一个种子文件时程序的行为:“替换”意味着总是将正在运行的" +"种子文件替换成新的种子文件,“添加”意味着总是并行地增加运行中的种子文件,“询" +"问”意味着每次都向用户询问。" + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"文件名(单文件种子)或者目录名(批处理种),要将种子文件另存为其它文件,应替" +"换掉种子文件的默认名称。请参阅 --save_in" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"同一时刻允许的最大的上传数目。-1 意味着一个基于--max_upload_rate 的合理的(希" +"望是如此)数目。自动确定的值只有当同一时刻只有一个种子文件在下载时是有意义" +"的。" + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"种子文件所代表的内容将被保存到的本地路径。文件(单文件种子)或者目录(批处理" +"种子)将在这个目录下被创建,名字则是.torrent 文件中指定的默认名称。请参阅 --" +"save_as" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "是否询问将下载文件保存到哪里" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"保存种子内容的本地目录,使用由--saveas_style 参数决定的名称。如果此项为空则每" +"个种子内容会被保存到和对应的 .torrent 文件相同的目录中。" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "重新扫描种子目录的时间间隔,用秒表示" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"如何命名种子的下载内容:1:直接使用种子文件的名称(去除掉 .torrent 后缀);" +"2:使用编码到种子文件内部的名称;3:创建一个以种子文件的名称(去除掉 ." +"torrent 后缀)命名的目录,并且把下载内容保存到这个目录下,且使用编码到种子文" +"件内部的名称来命名它;4:如果种子文件的名称(去除掉 .torrent 后缀)和编码到种" +"子文件内部的名称一致,则使用这个名称(方案 1 或者 2),否则按照方案 3 创建一" +"个新的目录来进行保存;注意:方案 1 和方案 2 有可能在不发出警告的情况下覆盖文" +"件,因此可能会存在一定的安全问题。" + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "是否显示每个种子的完整路径或者种子的内容" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "寻找 .torrent 文件的目录(半递归)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "是否显示诊断信息到标准输出" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "设置文件分块大小为 2 的多少次幂" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "默认跟踪服务器名称" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"如果为假则创建一个无跟踪器的种子,而不使用发布 URL,使用形如 : 表示" +"可靠节点,或者使用空字符串以便从您的路由表中选取一些节点" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "下载完成!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "<未知>" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "完成于:%d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "下载成功" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr " oo (%.1f MB 上传 / %.1f MB 下载)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (%.1f MB 上传 / %.1f MB 下载)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "%d 个种子,加上 %d 个分散的拷贝(%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "%d 个分散的拷贝(下一个:%s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "现在有 %d 个种子" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "出错:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "保存:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "文件大小:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "完成百分比:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "剩余时间:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "下载到:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "下载速度:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "上传速度:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "共享率:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "种子状态:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "对等客户状态:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "您不能同时指定 --save_as 和 --save_in" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "关闭" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "读取配置出错:" + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "读取 .torrent 文件出错:" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "您必须指定一个 .torrent 文件" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "文本模式图形用户界面初始化失败,无法继续。" + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"这个下载界面需要 Python 的标准模“curses”,然而在 Windows 的 Python 本地移植中" +"不支持它。但是在 Python 的 Cygwin 移植中提供支持,Cygwin 可以在所有的 win32 " +"系统上运行 (www.cygwin.com)。" + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "你仍然可以通过“bittorrent-控制台”来下载。" + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "文件:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "大小:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "目标:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "进度:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "状态:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "下载速度:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "上传速度:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "共享:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "种子:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "对等客户:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "%d 个种子,加上 %d 个分散的拷贝(%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "错误:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "错误:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP 上传 下载 完成 速度" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "正在下载 %d 块,有 %d 碎片,%d 块已经完成,总共有 %d 块" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "执行时发生下列错误:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "使用方法:%s 跟踪服务器地址 [种子文件 [种子文件 ...]]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "关于 %s 的旧通告:%s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "无种" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "系统错误 - 产生意外" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "警告:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr "不是一个目录" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"错误:%s\n" +"不带任何参数运行显示参数说明" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"异常:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "您仍然可以使用“btdownloadheadless.py”来下载。" + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "正在连接到对等客户" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "预计完成时间 %d:%02d:%02d" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "大小" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "下载" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "上传" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "合计:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "(%s) %s - %s 个同伴 %s 个种子 %s 个发布拷贝 - 已下载 %s 已上传 %s" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "错误:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"不带任何参数运行将显示参数说明" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "可选的附加到 .torrent 文件中的可阅读的评论" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "可选的保存种子文件的目标文件" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "%s %s - 解码 %s 元信息文件" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "用法:%s [种子文件 [种子文件 ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "元信息文件:%s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "信息摘要:%s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "文件名:%s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "文件大小:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "文件:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "文件夹名:%s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "文档大小:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "跟踪服务器发布url:%s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "分布式节点:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "评论:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "不能创建控制套接字:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "无法发送命令:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "不能创建控制套接字:已经在使用" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "无法删除旧控制套接字的文件名:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "全局互斥信号已经建立" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "无法找到一个开放的端口" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "无法创建程序数据目录" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "无法获取控制套接字文件的全局互斥锁" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "上一个BT程序没有正常推出,请继续." + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "不是有效的bencode编码字符串" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "无效的bencode编码值(有效前辍后紧跟数据)" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "用法:%s" + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[选项] [种子目录]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" +"如果有参数不是作为选项出现,它将\n" +"被看成是torrent_dir选项的值。\n" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[选项] [种子文件]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[选项] [种子文件]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[选项] 跟踪服务器 _URL 文件 [文件]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "参数为 -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr "(默认为" + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "未知关键字" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "在结尾处传入了参数却没有同时传入它的值" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "命令行解析失败于" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "选项%s是必须的。" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "至少要提供%d个参数。" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "参数太多了 - 最多只能%d个。" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "%s的格式错误-%s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "不能永久保存选项设置" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "在启动%d秒之后跟踪服务器仍然没有完成发布" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "连接到跟踪服务器有问题,gethostbyname(域名查找)失败 -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "连接到跟踪服务器有问题-" + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "跟踪服务器返回的数据有错误 -" + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "被跟踪服务器拒绝 -" + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "由于还没能连接到任何对等客户就被跟踪服务器拒绝,文件下载被中止。" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "来自跟踪服务器的信息:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "来自跟踪服务器的警告 -" + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "无法读取目录" + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "无法统计文件信息" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "正在移除%s(会重新添加)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**警告**%s与%s完全相同" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**警告** %s有错误" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "...成功" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "删除%s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "完成检验" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "服务器套接字中断" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "接收网络连接时出错:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "由于TCP堆栈疲劳必须退出。请参考 %s 中的常见问题解答" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "更换 RawServer 后端太晚,%s 已经被选用。" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "星期一" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "星期二" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "星期三" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "星期四" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "星期五" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "星期六" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "星期天" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "一月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "二月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "三月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "四月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "五月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "六月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "七月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "八月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "九月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "十月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "十一月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "十二月" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "压缩:%i 未压缩:%i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "当同时制作多个种子时您不能指定.torrent文件名" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "此版本不支持文件系统编码“%s”" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"无法将文件/目录名“%s”转化成utf-8格式编码(%s)。可能是指定的文件系统编码“%s”有" +"错误或者文件名包含非法字节。" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "文件/目录名“%s”包含unicode保留值,无法对应到某个字符。" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "回应文件数据有误-总量过小" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "回应文件数据有误-总量过大" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "检查现有文件" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" +"--check_hashes 设置为 0 或者“快速恢复”文件与文件实际状态不符(数据缺失)" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "“快速恢复”信息有误(实际文件包含更多的数据)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "“快速恢复”信息有误(非法的值)" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "磁盘数据损坏-也许您两次运行同一程序?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "不能读取“快速恢复”数据:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "被告知文件在起始时已经完成,但是有数据块未能成功通过消息摘要检查" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "文件%s属于另一个运行中的种子" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "文件%s已经存在,但不是一个普通文件" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "读取量过短-有些文件被截断了?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "不支持的“快速恢复”文件格式,可能来自另一个客户端版本?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "另一个程序似乎已经移动、改名,或删除了那个文件" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "另一个程序似乎已经修改了那个文件" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "有其他程序似乎已经改变了那个文件的大小" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "不能设置信号处理程序:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "丢弃“%s”" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "增加“%s”" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "等待摘要值校验" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "正在下载" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "重新读取配置文件" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "不能读取%s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"不能下载或打开\n" +"%s\n" +"请尝试用浏览器下载种子文件。" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"可能正使用一个旧版本的 Python,不支持检测文件系统编码,使用“ascii”编码。" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "Python 自动检测文件系统编码失败。使用“ascii”编码。" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "不支持文件系统编码“%s”。使用“ascii”编码。" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "非法文件路径成分:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"这个.torrent文件是由一个损坏的工具创建的,它包含了没有正确编码的文件名。可能" +"存在部分或者全部的文件名和.torrent文件的创建者的意图不符。" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"这个.torrent文件是由一个损坏的工具创建的,它包含了已损坏的字符值,这些值无法" +"映射到任何真实字符。可能存在部分或者全部的文件名和.torrent文件的创建者的意图" +"不符。" + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"这个.torrent文件是由一个损坏的工具创建的,它包含了没有正确编码的文件名。但是" +"使用的名称可能仍然正确。" + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"本地文件系统上所使用的字符集(“%s”)无法表达这个种子文件中所包含的文件名中的所" +"有字符。文件名和原始的相比已经有所改变。" + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows文件系统无法处理这个种子文件中所包含的文件名中的一些字符。文件名和原始" +"的相比已经有所改变。" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"这个 .torrent 文件是由一个损坏的工具创建的,至少有一个文件有非法的文件或目录" +"名。然而由于所有的这些文件被标记为长度为 0,因此这些文件只是被简单得忽略。" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "必需Python2.2.1或更高版本" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "不能为同一个种子文件打开两个不同的实例" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "最大端口号比最小端口号还小 - 没有检查任何端口" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "不能打开监听端口:%s。" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "不能打开监听端口:%s。" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "检查您的端口范围设置。" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "初始启动" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "无法装载快速恢复数据:%s。" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "将进行完全校验。" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "第%d块消息摘要值校验失败,重新下载" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "在关闭无跟踪服务器客户端的情况下试图下载无跟踪服务器种子文件。" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "下载失败:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "输入输出错误:磁盘满,或剩余空间不足以创建此文件:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "由于输入输出错误终止:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "由于操作系统错误终止:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "由于内部异常终止:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "由于错误关闭时产生新的错误:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "失败后无法删除“快速恢复”文件:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "做种" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "不能保存“快速恢复”数据:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "关闭" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "损坏的元信息 - 不是字典类型的数据" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "损坏的元信息 - 信息块的主键错误" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "损坏的元信息 - 信息块的长度非法" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "损坏的元信息 - 错误名称" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "因为安全原因%s不允许作为名字" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "单文件/多文件混合" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "损坏的元信息 - 长度错误" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "损坏的元信息 - 发现\"files\"实际上不是文件列表" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "损坏的元信息 - 文件项信息错误" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "损坏的元信息 - 路径错误" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "损坏的元信息 - 路径目录错误" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "由于安全原因路径%s不允许" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "损坏的元信息 - 路径重复" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "损坏的元信息 - 有名称同时作为文件名和子目录名出现" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "损坏的元信息 - 对象类型有误" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "损坏的元信息 - 没有发布URL的字符串" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "非文字可以描述的失败原因" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "非文字可以描述的警告信息" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "对等客户列表1中有非法项" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "对等客户列表2中有非法项" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "对等客户列表3中有非法项" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "对等客户列表4中有非法项" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "非法对等客户列表" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "发布时间间隔非法" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "最小发布时间间隔非法" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "跟踪服务器id非法" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "对等客户数量非法" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "种子数非法" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "\"last\"项非法" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "监听的端口。" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "保存最近的下载者的信息所用的文件" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "关闭连接所需要的超时时间" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "保存dfile的时间间隔(秒)" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "判断下载者信息过期所需要的时间间隔(秒)" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "下载者在两次重新发布之间所应该等待的时间间隔(秒)" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "如果客户端没有指定一个数目发送回的消息中包含的默认的对等客户信息的数目" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "两次对是否有任何连接发生超时进行检查所需要等待的时间间隔" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "需要检查多少次来确定一个下载者是否处于NAT之后(0表示不检查)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "是否在日志中添加关于NAT检查结果的条目" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "距离上次数据刷新后进行下一次的数据刷新所需要的最短时间间隔" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" +"认为一个缓存中的数据保存太久应该立刻进行数据刷新所需要的最短时间间隔(秒)" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" +"只允许下载这个目录(以及递归地寻找它的子目录如果该目录中本身不包含.torrent文" +"件)中的.torrent文件。如果设置了这项参数,无论它们是否有对等客户在下载,这个" +"目录的所有种子文件的信息都会出现在信息页面/快照页面上" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "允许allowed_dir中的种子文件中的特殊关键字影响跟踪器的访问" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "在收到HUP信号时是否重新打开日志" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "在试图加载跟踪服务器的根目录时是否显示一个信息页面" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "一个URL,用来重定向信息页面" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "是否显示允许的目录中的项目名称" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "当浏览器请求favicon.ico时,返回的包含x-icon图标数据的文件" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" +"如果发现机器不在本地网络IP地址上,是否忽略GET中的ip参数(0表示绝不,1表示绝" +"对,2表示在NAT检查没有激活的情况下忽略)。HTTP代理在头部信息中给出的原始客户" +"端的地址将与--ip参数同等对待。" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "跟踪服务器的日志输出文件,使用 - 表示标准输出(默认)" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" +"和allowded_dir同时使用;允许用户通过在url上增加形如/file?hash={hash}这种类型" +"的字符串来下载一个指定的种子文件" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" +"在种子已经过期后仍然保留它(这样它们仍然会出现在你的快照和信息页面上)。只有" +"当allowed_dir没有被设置时有意义" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "允许快照访问的程度(可以是完全不,特定的部分和完全)" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "给任何请求的回应中包含的对等客户信息数量的最大数目" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "" +"你要的文件可能在宇宙中的其它任何地方,\n" +"但是,它绝对不在这,哇哈哈哈\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**警告** 指定的图标文件 -- %s -- 不存在。" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**警告** 状态文件%s已经损坏;正在重设它" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "#日志开始:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**警告** 无法将标准输出重定向到日志文件:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "#日志重新打开:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**警告** 无法重新打开日志" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "指定的部分的快照功能在本跟踪服务器上不提供。" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "完全快照功能在本跟踪服务器上不提供。" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "get功能在本跟踪服务器上不提供。" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "请求的下载项没有被授权给本跟踪服务器来使用。" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "参数解释所需信息不足" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "#关闭:" diff --git a/locale/zh_TW/LC_MESSAGES/bittorrent.mo b/locale/zh_TW/LC_MESSAGES/bittorrent.mo new file mode 100755 index 0000000000000000000000000000000000000000..e5f5e1e5ca605182e56372f961bdcc48efa961dd GIT binary patch literal 52194 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 literal 0 HcmV?d00001 diff --git a/locale/zh_TW/LC_MESSAGES/bittorrent.po b/locale/zh_TW/LC_MESSAGES/bittorrent.po new file mode 100755 index 0000000..b76e576 --- /dev/null +++ b/locale/zh_TW/LC_MESSAGES/bittorrent.po @@ -0,0 +1,2752 @@ +# BitTorrent +# Copyright (C) 2005, BitTorrent, Inc. +# This file is distributed under the same license as the BitTorrent package. +# Matt Chisholm, matt (dash) translations (at) bittorrent (dot) com, 2005. +# +# traditional Chinese translation of bittorrent. +# Copyright (C) 2005 BitTorrent, Inc. +# This file is distributed under the same license as the bittorrent package. +# Abel Cheung , 2005. +# Tang Kai Yiu , 2005. +msgid "" +msgstr "" +"Project-Id-Version: BitTorrent 4.2\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2005-12-02 14:33-0800\n" +"PO-Revision-Date: 2005-11-15 14:12-0800\n" +"Last-Translator: Matt Chisholm \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Pootle 0.6.3.20050806\n" + +#: bittorrent.py:22 maketorrent.py:23 +msgid "Install Python 2.3 or greater" +msgstr "安裝 Python 2.3 或更新的版本" + +#: bittorrent.py:36 +msgid "PyGTK 2.4 or newer required" +msgstr "需要 PyGTK 2.4 或更新的版本" + +#: bittorrent.py:242 +msgid "Enter torrent URL" +msgstr "輸入 torrent 的 URL 位置" + +#: bittorrent.py:243 +msgid "Enter the URL of a torrent file to open:" +msgstr "輸入準備開啟的 torrent 檔案的 URL:" + +#: bittorrent.py:279 +msgid "dialup" +msgstr "撥接" + +#: bittorrent.py:280 +msgid "DSL/cable 128k up" +msgstr "數位用戶線路(DSL)/纜線 128k 以上" + +#: bittorrent.py:281 +msgid "DSL/cable 256k up" +msgstr "數位用戶線路(DSL)/纜線 256k 以上" + +#: bittorrent.py:282 +msgid "DSL 768k up" +msgstr "數位用戶線路(DSL) 768k 以上" + +#: bittorrent.py:283 +msgid "T1" +msgstr "T1" + +#: bittorrent.py:284 +msgid "T1/E1" +msgstr "T1/E1" + +#: bittorrent.py:285 +msgid "E1" +msgstr "E1" + +#: bittorrent.py:286 +msgid "T3" +msgstr "T3" + +#: bittorrent.py:287 +msgid "OC3" +msgstr "OC3" + +#: bittorrent.py:299 +msgid "Maximum upload rate:" +msgstr "最高上傳速率:" + +#: bittorrent.py:363 +msgid "Temporarily stop all running torrents" +msgstr "暫停所有執行中的 torrent" + +#: bittorrent.py:364 +msgid "Resume downloading" +msgstr "繼續下載" + +#: bittorrent.py:403 bittorrent.py:2003 +msgid "Paused" +msgstr "已暫停" + +#: bittorrent.py:405 +msgid "No torrents" +msgstr "沒有 torrent" + +#: bittorrent.py:407 +msgid "Running normally" +msgstr "正常執行中" + +#: bittorrent.py:409 +msgid "Firewalled/NATted" +msgstr "在防火牆/NAT 背後" + +#: bittorrent.py:445 +#, python-format +msgid "New %s version available" +msgstr "已推出新版本 %s" + +#: bittorrent.py:460 +#, python-format +msgid "A newer version of %s is available.\n" +msgstr "%s 已推出新版本。\n" + +#: bittorrent.py:461 +#, python-format +msgid "You are using %s, and the new version is %s.\n" +msgstr "您正在使用 %s 版本,而新的版本是 %s。\n" + +#: bittorrent.py:462 +#, python-format +msgid "" +"You can always get the latest version from \n" +"%s" +msgstr "" +"請到以下位置下載最新版本︰\n" +"%s" + +#: bittorrent.py:469 bittorrent.py:1800 +msgid "Download _later" +msgstr "稍後下載(_L)" + +#: bittorrent.py:472 bittorrent.py:1788 +msgid "Download _now" +msgstr "立即下載(_N)" + +#: bittorrent.py:478 +msgid "_Remind me later" +msgstr "稍後提醒我(_R)" + +#: bittorrent.py:516 +#, python-format +msgid "About %s" +msgstr "關於 %s" + +#: bittorrent.py:531 +msgid "Beta" +msgstr "測試版本" + +#: bittorrent.py:533 +#, python-format +msgid "Version %s" +msgstr "%s 版本" + +#: bittorrent.py:549 +#, python-format +msgid "Couldn't open %s" +msgstr "無法開啟 %s" + +#: bittorrent.py:568 +msgid "Donate" +msgstr "捐款" + +#: bittorrent.py:588 +#, python-format +msgid "%s Activity Log" +msgstr "%s 使用紀錄" + +#: bittorrent.py:645 +msgid "Save log in:" +msgstr "將紀錄儲存於:" + +#: bittorrent.py:656 +msgid "log saved" +msgstr "已儲存紀錄" + +#: bittorrent.py:715 +msgid "log cleared" +msgstr "已清除紀錄" + +#: bittorrent.py:745 +#, python-format +msgid "%s Settings" +msgstr "%s 設定" + +#: bittorrent.py:756 +msgid "Saving" +msgstr "儲存" + +#: bittorrent.py:758 +msgid "Save new downloads in:" +msgstr "將下載後的檔案儲存於:" + +#: bittorrent.py:771 +msgid "Change..." +msgstr "變更..." + +#: bittorrent.py:777 +msgid "Ask where to save each new download" +msgstr "每次都詢問欲儲存新檔案的位置" + +#: bittorrent.py:786 +msgid "Downloading" +msgstr "下載" + +#: bittorrent.py:788 +msgid "Starting additional torrents manually:" +msgstr "手動啟動額外的 torrent:" + +#: bittorrent.py:797 +msgid "Always stops the _last running torrent" +msgstr "永遠停止最後執行的 _torrent" + +#: bittorrent.py:803 +msgid "Always starts the torrent in _parallel" +msgstr "永遠同時啟動 t_orrent" + +#: bittorrent.py:809 +msgid "_Asks each time" +msgstr "每次都詢問(_A)" + +#: bittorrent.py:826 +msgid "Seeding" +msgstr "作種" + +#: bittorrent.py:835 +msgid "" +"Seed completed torrents: until share ratio reaches [_] percent, or for [_] " +"minutes, whichever comes first." +msgstr "" +"作種完成的 torrents:直到共用率達百分之[_],或持續[_]分鐘,以先達到者為準。" + +#: bittorrent.py:879 bittorrent.py:913 +msgid "Seed indefinitely" +msgstr "種子永遠有效" + +#: bittorrent.py:887 +msgid "Seed last completed torrent: until share ratio reaches [_] percent." +msgstr "將完成的 torrent 作種:直至共享率達到百分之 [_] 。" + +#: bittorrent.py:925 +msgid "Network" +msgstr "網路" + +#: bittorrent.py:927 +msgid "Look for available port:" +msgstr "搜尋可用的通訊埠:" + +#: bittorrent.py:930 +msgid "starting at port: " +msgstr "起始通訊埠:" + +#: bittorrent.py:943 +msgid "IP to report to the tracker:" +msgstr "報告給追蹤程式的 IP 位址:" + +#: bittorrent.py:948 +msgid "" +"(Has no effect unless you are on the\n" +"same local network as the tracker)" +msgstr "" +"(除非您和追蹤程式在 \n" +" 同一本地區域網路上,否則無效)" + +#: bittorrent.py:965 +msgid "" +"Progress bar text is always black\n" +"(requires restart)" +msgstr "" +"進度列文字永遠使用黑色\n" +"(需要重新啟動)" + +#: bittorrent.py:971 +msgid "Misc" +msgstr "雜項" + +#: bittorrent.py:978 +#, python-format +msgid "" +"WARNING: Changing these settings can\n" +"prevent %s from functioning correctly." +msgstr "" +"警告:變更這些設定可能會使\n" +"%s 無法正常運作。" + +#: bittorrent.py:986 +msgid "Option" +msgstr "選項" + +#: bittorrent.py:991 +msgid "Value" +msgstr "值" + +#: bittorrent.py:998 +msgid "Advanced" +msgstr "進階" + +#: bittorrent.py:1007 +msgid "Choose default download directory" +msgstr "選擇預設的下載目錄" + +#: bittorrent.py:1068 +#, python-format +msgid "Files in \"%s\"" +msgstr "在“%s”的檔案" + +#: bittorrent.py:1077 +msgid "Apply" +msgstr "套用" + +#: bittorrent.py:1078 +msgid "Allocate" +msgstr "分配" + +#: bittorrent.py:1079 +msgid "Never download" +msgstr "永不下載" + +#: bittorrent.py:1080 +msgid "Decrease" +msgstr "減少" + +#: bittorrent.py:1081 +msgid "Increase" +msgstr "增加" + +#: bittorrent.py:1091 launchmany-curses.py:146 +msgid "Filename" +msgstr "檔案名稱" + +#: bittorrent.py:1091 +msgid "Length" +msgstr "長度" + +#: bittorrent.py:1091 +msgid "%" +msgstr "%" + +#: bittorrent.py:1255 +#, python-format +msgid "Peers for \"%s\"" +msgstr "“%s” 的對等點" + +#: bittorrent.py:1261 +msgid "IP address" +msgstr "IP 位址" + +#: bittorrent.py:1261 +msgid "Client" +msgstr "用戶端" + +#: bittorrent.py:1261 +msgid "Connection" +msgstr "連線" + +#: bittorrent.py:1261 +msgid "KB/s down" +msgstr "KB/s 下載" + +#: bittorrent.py:1261 +msgid "KB/s up" +msgstr "KB/s 上傳" + +#: bittorrent.py:1261 +msgid "MB downloaded" +msgstr "已下載MB" + +#: bittorrent.py:1261 +msgid "MB uploaded" +msgstr "已上傳MB" + +#: bittorrent.py:1261 +#, python-format +msgid "% complete" +msgstr "完成%" + +#: bittorrent.py:1261 +msgid "KB/s est. peer download" +msgstr "KB/s 預計下載" + +#: bittorrent.py:1267 +msgid "Peer ID" +msgstr "對等點 ID" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Interested" +msgstr "有用" + +#: bittorrent.py:1270 bittorrent.py:1273 +msgid "Choked" +msgstr "堵塞" + +#: bittorrent.py:1270 +msgid "Snubbed" +msgstr "靜止" + +#: bittorrent.py:1273 +msgid "Optimistic upload" +msgstr "" + +#: bittorrent.py:1358 +msgid "remote" +msgstr "遠端" + +#: bittorrent.py:1358 +msgid "local" +msgstr "本地" + +#: bittorrent.py:1394 +msgid "bad peer" +msgstr "壞的對等點" + +#: bittorrent.py:1404 +#, python-format +msgid "%d ok" +msgstr " 完成 %d" + +#: bittorrent.py:1405 +#, python-format +msgid "%d bad" +msgstr "損壞 %d" + +#: bittorrent.py:1407 +msgid "banned" +msgstr "禁止" + +#: bittorrent.py:1409 +msgid "ok" +msgstr "確定" + +#: bittorrent.py:1445 +#, python-format +msgid "Info for \"%s\"" +msgstr "有關“%s”的資訊" + +#: bittorrent.py:1463 +msgid "Torrent name:" +msgstr "Torrent 的名稱:" + +#: bittorrent.py:1468 +msgid "(trackerless torrent)" +msgstr "(沒有追蹤程式的 torrent)" + +#: bittorrent.py:1471 +msgid "Announce url:" +msgstr "發佈的 url:" + +#: bittorrent.py:1475 +msgid ", in one file" +msgstr ",在一個檔案" + +#: bittorrent.py:1477 +#, python-format +msgid ", in %d files" +msgstr ",在 %d 個檔案" + +#: bittorrent.py:1478 +msgid "Total size:" +msgstr "總計大小:" + +#: bittorrent.py:1485 +msgid "Pieces:" +msgstr "片段:" + +#: bittorrent.py:1487 +msgid "Info hash:" +msgstr "資料雜湊值:" + +#: bittorrent.py:1497 +msgid "Save in:" +msgstr "儲存於:" + +#: bittorrent.py:1501 +msgid "File name:" +msgstr "檔案名稱:" + +#: bittorrent.py:1527 +msgid "Open directory" +msgstr "開啟目錄" + +#: bittorrent.py:1532 +msgid "Show file list" +msgstr "顯示檔案清單" + +#: bittorrent.py:1566 +msgid "drag to reorder" +msgstr "拖曳滑鼠以重新排列" + +#: bittorrent.py:1567 +msgid "right-click for menu" +msgstr "按滑鼠右鍵開啟功能表" + +#: bittorrent.py:1632 +msgid "Torrent info" +msgstr "Torrent 資訊" + +#: bittorrent.py:1641 bittorrent.py:2106 +msgid "Remove torrent" +msgstr "移除 torrent" + +#: bittorrent.py:1645 +msgid "Abort torrent" +msgstr "中止 torrent" + +#: bittorrent.py:1712 +#, python-format +msgid ", will seed for %s" +msgstr ",作種時間為 %s" + +#: bittorrent.py:1714 +msgid ", will seed indefinitely." +msgstr ",即將永遠作種。" + +#: bittorrent.py:1717 +#, python-format +msgid "Done, share ratio: %d%%" +msgstr "完成,分享率: %d%%" + +#: bittorrent.py:1720 +#, python-format +msgid "Done, %s uploaded" +msgstr "完成,已上傳 %s" + +#: bittorrent.py:1723 bittorrent.py:2161 +msgid "Done" +msgstr "完成" + +#: bittorrent.py:1742 +msgid "Torrent _info" +msgstr "_Torrent 資訊" + +#: bittorrent.py:1746 +msgid "_Open directory" +msgstr "開啟目錄(_O)" + +#: bittorrent.py:1750 +msgid "_File list" +msgstr "檔案清單(_F)" + +#: bittorrent.py:1752 +msgid "_Peer list" +msgstr "對等點清單(_P)" + +#: bittorrent.py:1762 +msgid "_Change location" +msgstr "變更位置(_C)" + +#: bittorrent.py:1765 +msgid "_Seed indefinitely" +msgstr "無限期作種(_S)" + +#: bittorrent.py:1785 +msgid "Re_start" +msgstr "續傳(_S)" + +#: bittorrent.py:1796 +msgid "_Finish" +msgstr "完成(_F)" + +#: bittorrent.py:1797 +msgid "_Remove" +msgstr "移除(_R)" + +#: bittorrent.py:1804 +msgid "_Abort" +msgstr "中止(_A)" + +#: bittorrent.py:1885 +#, python-format +msgid "Are you sure you want to remove \"%s\"?" +msgstr "確定要移除“%s”?" + +#: bittorrent.py:1888 +#, python-format +msgid "Your share ratio for this torrent is %d%%. " +msgstr "這個 torrent 的分享率是 %d%% 。" + +#: bittorrent.py:1890 +#, python-format +msgid "You have uploaded %s to this torrent. " +msgstr "您已上傳 %s 到這個 torrent 。" + +#: bittorrent.py:1893 +msgid "Remove this torrent?" +msgstr "是否移除這個 torrent?" + +#: bittorrent.py:1915 +msgid "Finished" +msgstr "已完成" + +#: bittorrent.py:1916 +msgid "drag into list to seed" +msgstr "拖曳到作種清單" + +#: bittorrent.py:1919 +msgid "Failed" +msgstr "失敗" + +#: bittorrent.py:1920 +msgid "drag into list to resume" +msgstr "拖曳到繼續清單" + +#: bittorrent.py:1979 +msgid "Waiting" +msgstr "等待中" + +#: bittorrent.py:2033 +msgid "Running" +msgstr "執行中" + +#: bittorrent.py:2058 +#, python-format +msgid "Current up: %s" +msgstr "目前上傳: %s" + +#: bittorrent.py:2059 +#, python-format +msgid "Current down: %s" +msgstr "目前下載: %s" + +#: bittorrent.py:2065 +#, python-format +msgid "Previous up: %s" +msgstr "上次上傳: %s" + +#: bittorrent.py:2066 +#, python-format +msgid "Previous down: %s" +msgstr "上次下載: %s" + +#: bittorrent.py:2072 +#, python-format +msgid "Share ratio: %0.02f%%" +msgstr "分享率: %0.02f%%" + +#: bittorrent.py:2075 +#, python-format +msgid "%s peers, %s seeds. Totals from tracker: %s" +msgstr "%s 個對等點,%s 個種子,總共出自追蹤程式:%s" + +#: bittorrent.py:2079 +#, python-format +msgid "Distributed copies: %d; Next: %s" +msgstr "已流通檔案總數 %d 個;下個:%s" + +#: bittorrent.py:2082 +#, python-format +msgid "Pieces: %d total, %d complete, %d partial, %d active (%d empty)" +msgstr "片段:共 %d 段,完成 %d 段,未完成 %d 段,%d 段操作中 (%d 段空白)" + +#: bittorrent.py:2086 +#, python-format +msgid "%d bad pieces + %s in discarded requests" +msgstr "%d 段壞片段 + %s 屬於丟棄要求" + +#: bittorrent.py:2176 +#, python-format +msgid "%.1f%% done, %s remaining" +msgstr "完成 %.1f%%,剩餘 %s" + +#: bittorrent.py:2184 +msgid "Download rate" +msgstr "下載速率" + +#: bittorrent.py:2186 +msgid "Upload rate" +msgstr "上傳速率" + +#: bittorrent.py:2201 +msgid "NA" +msgstr "不適用" + +#: bittorrent.py:2625 +#, python-format +msgid "%s started" +msgstr "%s 已開始" + +#: bittorrent.py:2638 +msgid "_Open torrent file" +msgstr "開啟 t_orrent 檔案" + +#: bittorrent.py:2639 +msgid "Open torrent _URL" +msgstr "開啟 torrent _URL" + +#: bittorrent.py:2640 +msgid "Make _new torrent" +msgstr "製作新的 torre_nt" + +#: bittorrent.py:2643 +msgid "_Pause/Play" +msgstr "暫停/開始(_P)" + +#: bittorrent.py:2645 +msgid "_Quit" +msgstr "結束(_Q)" + +#: bittorrent.py:2647 +msgid "Show/Hide _finished torrents" +msgstr "顯示或隱藏完成的 _torrent" + +#: bittorrent.py:2649 +msgid "_Resize window to fit" +msgstr "調整視窗尺寸(_R)" + +#: bittorrent.py:2651 +msgid "_Log" +msgstr "紀錄(_L)" + +#: bittorrent.py:2654 +msgid "_Settings" +msgstr "設定(_S)" + +#: bittorrent.py:2657 bittorrent.py:2673 +msgid "_Help" +msgstr "說明(_H)" + +#: bittorrent.py:2659 +msgid "_About" +msgstr "關於(_A)" + +#: bittorrent.py:2660 +msgid "_Donate" +msgstr "捐款(_D)" + +#: bittorrent.py:2664 +msgid "_File" +msgstr "檔案(_F)" + +#: bittorrent.py:2669 +msgid "_View" +msgstr "檢視(_V)" + +#: bittorrent.py:2710 +msgid "Search for torrents" +msgstr "搜尋 torrent" + +#: bittorrent.py:2853 +msgid "(stopped)" +msgstr "(已停止)" + +#: bittorrent.py:2865 +msgid "(multiple)" +msgstr "(多個)" + +#: bittorrent.py:2992 +#, python-format +msgid "Already downloading %s installer" +msgstr "已經在下載 %s 的安裝程式" + +#: bittorrent.py:2996 +#, python-format +msgid "Install new %s now?" +msgstr "現在安裝新的 %s?" + +#: bittorrent.py:2997 +#, python-format +msgid "Do you want to quit %s and install the new version, %s, now?" +msgstr "您想現在結束 %s 及安裝新的版本 (%s) 嗎?" + +#: bittorrent.py:3013 +#, python-format +msgid "" +"%s help is at \n" +"%s\n" +"Would you like to go there now?" +msgstr "" +"%s 的說明是在 %s\n" +"您是否立即瀏覽該處?" + +#: bittorrent.py:3016 +msgid "Visit help web page?" +msgstr "是否瀏覽說明網頁?" + +#: bittorrent.py:3053 +msgid "There is one finished torrent in the list. " +msgstr "清單中有一個完成下載的 torrent。" + +#: bittorrent.py:3054 +msgid "Do you want to remove it?" +msgstr "是否移除它?" + +#: bittorrent.py:3056 +#, python-format +msgid "There are %d finished torrents in the list. " +msgstr "清單中有 %d 個完成下載的 torrent。" + +#: bittorrent.py:3057 +msgid "Do you want to remove all of them?" +msgstr "是否全部移除?" + +#: bittorrent.py:3059 +msgid "Remove all finished torrents?" +msgstr "是否移除所有已經完成的 torrent?" + +#: bittorrent.py:3067 +msgid "No finished torrents" +msgstr "未有任何完成下載的 torrent" + +#: bittorrent.py:3068 +msgid "There are no finished torrents to remove." +msgstr "未有任何完成下載的 torrent 可以移除。" + +#: bittorrent.py:3124 +msgid "Open torrent:" +msgstr "開啟 torrent:" + +#: bittorrent.py:3155 +msgid "Change save location for " +msgstr "變更存檔位置" + +#: bittorrent.py:3182 +msgid "File exists!" +msgstr "檔案已存在!" + +#: bittorrent.py:3183 +#, python-format +msgid "\"%s\" already exists. Do you want to choose a different file name?" +msgstr "“%s” 已經存在。是否選擇另一個檔案名稱?" + +#: bittorrent.py:3202 +msgid "Save location for " +msgstr "存檔位置" + +#: bittorrent.py:3220 +msgid "Directory exists!" +msgstr "目錄已經存在!" + +#: bittorrent.py:3221 +#, python-format +msgid "" +"\"%s\" already exists. Do you intend to create an identical, duplicate " +"directory inside the existing directory?" +msgstr "“%s” 已經存在。您是否要在現有目錄中開啟一個一模一樣的目錄?" + +#: bittorrent.py:3344 +#, python-format +msgid "(global message) : %s" +msgstr "(全域訊息):%s" + +#: bittorrent.py:3351 +#, python-format +msgid "%s Error" +msgstr "%s 錯誤" + +#: bittorrent.py:3357 +msgid "Multiple errors have occurred. Click OK to view the error log." +msgstr "出現了多個錯誤。請按「確定」以檢視錯誤紀錄。" + +#: bittorrent.py:3513 +msgid "Stop running torrent?" +msgstr "是否停止 torrent 的執行?" + +#: bittorrent.py:3514 +#, python-format +msgid "" +"You are about to start \"%s\". Do you want to stop the last running torrent " +"as well?" +msgstr "您即將開始下載“%s”。想停止最後執行的 torrent 嗎?" + +#: bittorrent.py:3525 +msgid "Have you donated?" +msgstr "您已經捐款了嗎?" + +#: bittorrent.py:3526 +#, python-format +msgid "Welcome to the new version of %s. Have you donated?" +msgstr "歡迎使用新版本的 %s。您已經捐款了嗎?" + +#: bittorrent.py:3541 +msgid "Thanks!" +msgstr "謝謝!" + +#: bittorrent.py:3542 +msgid "" +"Thanks for donating! To donate again, select \"Donate\" from the \"Help\" " +"menu." +msgstr "感謝您捐款!如果希望再捐款,可以在「說明」選單上點選「捐款」。" + +#: bittorrent.py:3636 BitTorrent/defaultargs.py:198 +#: BitTorrent/defaultargs.py:200 bittorrent-console.py:295 +#: bittorrent-curses.py:429 +msgid "deprecated, do not use" +msgstr "已過時,請勿使用" + +#: bittorrent.py:3655 +msgid "Failed to create or send command through existing control socket." +msgstr "無法透過現有的控制 socket 建立或傳送指令。" + +#: bittorrent.py:3657 bittorrent.py:3686 +#, python-format +msgid " Closing all %s windows may fix the problem." +msgstr "關閉所有 %s 視窗可能可以解決問題。" + +#: bittorrent.py:3682 +#, python-format +msgid "%s already running" +msgstr "%s 已在執行" + +#: bittorrent.py:3684 +msgid "Failed to send command through existing control socket." +msgstr "無法透過現有的控制 socket 傳送指令。" + +#: bittorrent.py:3708 +msgid "Could not start the TorrentQueue, see above for errors." +msgstr "無法啟動 torrent 序列,請參閱上方的錯誤原因。" + +#: maketorrent.py:60 +#, python-format +msgid "%s torrent file creator %s" +msgstr "%s torrent 檔案製作器 %s" + +#: maketorrent.py:72 +msgid "Make torrent file for this file/directory:" +msgstr "為此檔案/目錄製作 torrent 檔案:" + +#: maketorrent.py:77 +msgid "Choose..." +msgstr "選擇..." + +#: maketorrent.py:87 +msgid "(Directories will become batch torrents)" +msgstr "(目錄會變成批次 torrents)" + +#: maketorrent.py:98 +msgid "Piece size:" +msgstr "片段大小:" + +#: maketorrent.py:130 +msgid "Use _tracker:" +msgstr "使用追蹤程式(_T):" + +#: maketorrent.py:160 +msgid "Use _DHT:" +msgstr "使用 _DHT:" + +#: maketorrent.py:166 +msgid "Nodes (optional):" +msgstr "節點(選擇性項目):" + +#: maketorrent.py:199 +msgid "Comments:" +msgstr "備註:" + +#: maketorrent.py:247 +msgid "Make" +msgstr "製作" + +#: maketorrent.py:394 +msgid "_Host" +msgstr "主機(_H)" + +#: maketorrent.py:401 +msgid "_Port" +msgstr "埠號(_P)" + +#: maketorrent.py:494 +msgid "Building torrents..." +msgstr "正在產生 torrent..." + +#: maketorrent.py:502 +msgid "Checking file sizes..." +msgstr "正在檢查檔案大小..." + +#: maketorrent.py:520 +msgid "Start seeding" +msgstr "開始作種" + +#: maketorrent.py:540 +msgid "building " +msgstr "正在製作" + +#: maketorrent.py:560 +msgid "Done." +msgstr "完成。" + +#: maketorrent.py:561 +msgid "Done building torrents." +msgstr "完成產生 torrent 檔案。" + +#: maketorrent.py:569 +msgid "Error!" +msgstr "錯誤!" + +#: maketorrent.py:570 +msgid "Error building torrents: " +msgstr "產生 torrent 檔時發生錯誤:" + +#: BitTorrent/GUI.py:212 +#, python-format +msgid "%d days" +msgstr "%d 天" + +#: BitTorrent/GUI.py:214 +#, python-format +msgid "1 day %d hours" +msgstr "1 天 %d 小時" + +#: BitTorrent/GUI.py:216 +#, python-format +msgid "%d:%02d hours" +msgstr "%d:%02d 小時" + +#: BitTorrent/GUI.py:218 +#, python-format +msgid "%d:%02d minutes" +msgstr "%d:%02d 分鐘" + +#: BitTorrent/GUI.py:220 +#, python-format +msgid "%d seconds" +msgstr "%d 秒" + +#: BitTorrent/GUI.py:222 +msgid "0 seconds" +msgstr "0 秒" + +#: BitTorrent/GUI.py:307 +#, python-format +msgid "%s Help" +msgstr "%s 說明文件" + +#: BitTorrent/GUI.py:314 +msgid "Frequently Asked Questions:" +msgstr "常見問答集:" + +#: BitTorrent/GUI.py:319 +msgid "Go" +msgstr "前往" + +#: BitTorrent/GUI.py:553 BitTorrent/GUI.py:611 +msgid "Choose an existing folder..." +msgstr "選擇現有的資料夾..." + +#: BitTorrent/GUI.py:563 +msgid "All Files" +msgstr "所有檔案" + +#: BitTorrent/GUI.py:568 +msgid "Torrents" +msgstr "Torrents" + +#: BitTorrent/GUI.py:608 +msgid "Create a new folder..." +msgstr "建立新資料夾..." + +#: BitTorrent/GUI.py:677 +msgid "Select a file" +msgstr "選擇檔案" + +#: BitTorrent/GUI.py:678 +msgid "Select a folder" +msgstr "選擇資料夾" + +#: BitTorrent/TorrentQueue.py:111 +msgid "Could not load saved state: " +msgstr "無法載入已儲存的狀態: " + +#: BitTorrent/TorrentQueue.py:203 +msgid "Could not save UI state: " +msgstr "無法儲存圖形介面狀態:" + +#: BitTorrent/TorrentQueue.py:213 BitTorrent/TorrentQueue.py:215 +#: BitTorrent/TorrentQueue.py:294 BitTorrent/TorrentQueue.py:297 +#: BitTorrent/TorrentQueue.py:307 BitTorrent/TorrentQueue.py:319 +#: BitTorrent/TorrentQueue.py:336 +msgid "Invalid state file contents" +msgstr "狀態檔案內容無效" + +#: BitTorrent/TorrentQueue.py:228 +msgid "Error reading file " +msgstr "讀取檔案時發生錯誤" + +#: BitTorrent/TorrentQueue.py:230 +msgid "cannot restore state completely" +msgstr "無法完全回復狀態" + +#: BitTorrent/TorrentQueue.py:233 +msgid "Invalid state file (duplicate entry)" +msgstr "狀態檔案無效 (出現重複項目)" + +#: BitTorrent/TorrentQueue.py:239 BitTorrent/TorrentQueue.py:244 +msgid "Corrupt data in " +msgstr "損壞的資料在" + +#: BitTorrent/TorrentQueue.py:240 BitTorrent/TorrentQueue.py:245 +msgid " , cannot restore torrent (" +msgstr ",無法回復 torrent(" + +#: BitTorrent/TorrentQueue.py:265 +msgid "Invalid state file (bad entry)" +msgstr "狀態檔案無效 (項目錯誤)" + +#: BitTorrent/TorrentQueue.py:284 +msgid "Bad UI state file" +msgstr "圖形介面狀態檔案損毀" + +#: BitTorrent/TorrentQueue.py:288 +msgid "Bad UI state file version" +msgstr "圖形介面狀態檔案的版本無效" + +#: BitTorrent/TorrentQueue.py:290 +msgid "Unsupported UI state file version (from newer client version?)" +msgstr "不支援此圖形介面狀態檔案的版本(來自新的程式版本?)" + +#: BitTorrent/TorrentQueue.py:477 +#, python-format +msgid "Could not delete cached %s file:" +msgstr "無法刪除快取記憶中的 %s 檔案:" + +#: BitTorrent/TorrentQueue.py:503 +#, python-format +msgid "This is not a valid torrent file. (%s)" +msgstr "這個 torrent 檔案無效。(%s)" + +#: BitTorrent/TorrentQueue.py:511 +msgid "This torrent (or one with the same contents) is already running." +msgstr "這個 (或者另一個同樣內容的) torrent 檔案已經在執行中。" + +#: BitTorrent/TorrentQueue.py:515 +msgid "This torrent (or one with the same contents) is already waiting to run." +msgstr "這個 (或者另一個同樣內容的) torrent 檔已經準備好可供執行。" + +#: BitTorrent/TorrentQueue.py:522 +#, python-format +msgid "Torrent in unknown state %d" +msgstr "Torrent 在未知狀態 %d" + +#: BitTorrent/TorrentQueue.py:539 +msgid "Could not write file " +msgstr "無法寫入檔案" + +#: BitTorrent/TorrentQueue.py:541 +msgid "torrent will not be restarted correctly on client restart" +msgstr "用戶端重新啟動後,torrent 也不會正確地重新啟動" + +#: BitTorrent/TorrentQueue.py:644 +#, python-format +msgid "" +"Can't run more than %d torrents simultaneously. For more info see the FAQ at " +"%s." +msgstr "" +"不可以同時執行多於 %d 個 torrent。如果需要額外資訊,請閱讀 %s 的常見問答集。" + +#: BitTorrent/TorrentQueue.py:765 +msgid "" +"Not starting torrent as there are other torrents waiting to run, and this " +"one already meets the settings for when to stop seeding." +msgstr "" +"沒有開始 torrent,因為另外的 torrent 正在等待執行,及這個 torrent 已經符合停" +"止作種的條件。" + +#: BitTorrent/TorrentQueue.py:772 +msgid "" +"Not starting torrent as it already meets the settings for when to stop " +"seeding the last completed torrent." +msgstr "沒有開始 torrent,因為它符合了停止將最後完成的 torrent 作種的規定。" + +#: BitTorrent/NewVersion.py:92 +#, python-format +msgid "Could not get latest version from %s" +msgstr "不能由 %s 取得最新版本" + +#: BitTorrent/NewVersion.py:97 +#, python-format +msgid "Could not parse new version string from %s" +msgstr "未能從 %s 分析最新版本字串" + +#: BitTorrent/NewVersion.py:213 +#, python-format +msgid "" +"Could not find a suitable temporary location to save the %s %s installer." +msgstr "未能找到一個適合的臨時位置來儲存 %s %s 安裝程式" + +#: BitTorrent/NewVersion.py:232 +#, python-format +msgid "No torrent file available for %s %s installer." +msgstr "沒有 torrent 檔案可用於 %s %s 安裝程式。" + +#: BitTorrent/NewVersion.py:242 +#, python-format +msgid "%s %s installer appears to be corrupt or missing." +msgstr "%s %s 安裝程式似乎損壞或不存在" + +#: BitTorrent/NewVersion.py:249 +msgid "Cannot launch installer on this OS" +msgstr "不能在這作業系統下啟動安裝程式" + +#: BitTorrent/defaultargs.py:34 +msgid "" +"directory under which variable data such as fastresume information and GUI " +"state is saved. Defaults to subdirectory 'data' of the bittorrent config " +"directory." +msgstr "" +"用來儲存可變資料 (例如快速續傳資料或介面狀態) 的目錄。預設為 bittorrent 設定" +"檔目錄下的‘data’子目錄。" + +#: BitTorrent/defaultargs.py:38 +msgid "" +"character encoding used on the local filesystem. If left empty, " +"autodetected. Autodetection doesn't work under python versions older than 2.3" +msgstr "" +"這裡指定本地檔案系統所用的文字編碼,如果不填則會自動偵測。但 python 2.3 之前" +"的版本不能使用自動偵測功能。" + +#: BitTorrent/defaultargs.py:42 +msgid "ISO Language code to use" +msgstr "要使用的 ISO 語言代碼" + +#: BitTorrent/defaultargs.py:47 +msgid "" +"ip to report to the tracker (has no effect unless you are on the same local " +"network as the tracker)" +msgstr "報告給追蹤程式的 IP 地址 (除非與追蹤程式在同一本地網路,否則無效)" + +#: BitTorrent/defaultargs.py:50 +msgid "" +"world-visible port number if it's different from the one the client listens " +"on locally" +msgstr "別人所見的埠號 (如果這個埠號和程式實際上所開啟的不同)" + +#: BitTorrent/defaultargs.py:53 +msgid "minimum port to listen on, counts up if unavailable" +msgstr "要開啟的埠號數值下限,當不可使用時會遞增" + +#: BitTorrent/defaultargs.py:55 +msgid "maximum port to listen on" +msgstr "會開啟的埠號數值上限" + +#: BitTorrent/defaultargs.py:57 BitTorrent/track.py:44 +msgid "ip to bind to locally" +msgstr "與本地端連結的 IP" + +#: BitTorrent/defaultargs.py:59 +msgid "seconds between updates of displayed information" +msgstr "顯示更新資訊的間隔秒數" + +#: BitTorrent/defaultargs.py:61 +msgid "minutes to wait between requesting more peers" +msgstr "等待請求更多對等點的分鐘數" + +#: BitTorrent/defaultargs.py:63 +msgid "minimum number of peers to not do rerequesting" +msgstr "對等點的最少數目,低於此數值的話不會重新請求對等點" + +#: BitTorrent/defaultargs.py:65 +msgid "number of peers at which to stop initiating new connections" +msgstr "對等點數目上限,高於此數值則不建立新連線" + +#: BitTorrent/defaultargs.py:67 +msgid "" +"maximum number of connections to allow, after this new incoming connections " +"will be immediately closed" +msgstr "允許連線的數目上限,超過此限制會立即關閉所有新連線" + +#: BitTorrent/defaultargs.py:70 +msgid "whether to check hashes on disk" +msgstr "是否檢查磁碟上的雜湊值" + +#: BitTorrent/defaultargs.py:72 +msgid "maximum kB/s to upload at, 0 means no limit" +msgstr "上傳速度上限 (kB/s 為單位, 0 表示不設限)" + +#: BitTorrent/defaultargs.py:74 +msgid "the number of uploads to fill out to with extra optimistic unchokes" +msgstr "使用額外最佳壅塞填滿上傳的數目" + +#: BitTorrent/defaultargs.py:76 +msgid "" +"the maximum number of files in a multifile torrent to keep open at a time, 0 " +"means no limit. Used to avoid running out of file descriptors." +msgstr "" +"在處理一個包含多個檔案的 torrent 的時候,最多同時打開的檔案數目,0 表示沒有限" +"制。使用本選項可以避免檔案描述字元用盡。" + +#: BitTorrent/defaultargs.py:79 +msgid "" +"Initialize a trackerless client. This must be enabled in order to download " +"trackerless torrents." +msgstr "啟動無追蹤程式的用戶端。本選項必須啟用才能下載沒有追蹤程式的 torrent。" + +#: BitTorrent/defaultargs.py:85 +msgid "number of seconds to pause between sending keepalives" +msgstr "每隔多少秒送出保持連線的要求" + +#: BitTorrent/defaultargs.py:87 +msgid "how many bytes to query for per request." +msgstr "每次要求讀取多少位元組。" + +#: BitTorrent/defaultargs.py:89 +msgid "" +"maximum length prefix encoding you'll accept over the wire - larger values " +"get the connection dropped." +msgstr "將透過連線接受的字首編碼的最長長度 — 數值太大可能會中斷連線。" + +#: BitTorrent/defaultargs.py:92 +msgid "" +"seconds to wait between closing sockets which nothing has been received on" +msgstr "等多少秒鐘後仍沒有收到任何資料則關閉 socket" + +#: BitTorrent/defaultargs.py:95 +msgid "seconds to wait between checking if any connections have timed out" +msgstr "每隔多少秒鐘檢查一次連線是否已經逾時" + +#: BitTorrent/defaultargs.py:97 +msgid "" +"maximum length slice to send to peers, close connection if a larger request " +"is received" +msgstr "送到對方的檔案片段長度上限,如果收到較大的要求則關閉連線" + +#: BitTorrent/defaultargs.py:100 +msgid "" +"maximum time interval over which to estimate the current upload and download " +"rates" +msgstr "評估目前上傳與下載速率的最大時間間隔" + +#: BitTorrent/defaultargs.py:102 +msgid "maximum time interval over which to estimate the current seed rate" +msgstr "評估目前作種速率的最大時間間隔" + +#: BitTorrent/defaultargs.py:104 +msgid "maximum time to wait between retrying announces if they keep failing" +msgstr "當發佈持續失敗時的最大重試時間" + +#: BitTorrent/defaultargs.py:106 +msgid "" +"seconds to wait for data to come in over a connection before assuming it's " +"semi-permanently choked" +msgstr "等待假設半永久壅塞時,等待資料進入的秒數" + +#: BitTorrent/defaultargs.py:109 +msgid "number of downloads at which to switch from random to rarest first" +msgstr "從隨機更換到最稀有者優先所需要的下載數目" + +#: BitTorrent/defaultargs.py:111 +msgid "how many bytes to write into network buffers at once." +msgstr "每一次寫多少位元組到網路緩衝區。" + +#: BitTorrent/defaultargs.py:113 +msgid "" +"refuse further connections from addresses with broken or intentionally " +"hostile peers that send incorrect data" +msgstr "如果對方因為軟體有錯誤或者帶惡意地送出錯誤資料,拒絕來自這類位址的連線" + +#: BitTorrent/defaultargs.py:116 +msgid "do not connect to several peers that have the same IP address" +msgstr "不要連接到擁有來自相同 IP 地址的幾個對等點" + +#: BitTorrent/defaultargs.py:118 +msgid "if nonzero, set the TOS option for peer connections to this value" +msgstr "如果不是零,則將對等點連接的 TOS 選項設置為這個值" + +#: BitTorrent/defaultargs.py:120 +msgid "" +"enable workaround for a bug in BSD libc that makes file reads very slow." +msgstr "避開 BSD libc 的一個問題,這問題會令讀取檔案時非常緩慢。" + +#: BitTorrent/defaultargs.py:122 +msgid "address of HTTP proxy to use for tracker connections" +msgstr "追蹤程式連線所用的 HTTP 代理伺服器位址" + +#: BitTorrent/defaultargs.py:124 BitTorrent/track.py:48 +msgid "close connections with RST and avoid the TCP TIME_WAIT state" +msgstr "使用 RST 方式關閉連線,避免 TCP 連線進入 TIME_WAIT 狀態" + +#: BitTorrent/defaultargs.py:126 BitTorrent/track.py:111 +msgid "" +"Use Twisted network libraries for network connections. 1 means use twisted, " +"0 means do not use twisted, -1 means autodetect, and prefer twisted" +msgstr "" +"網路連線使用 Twisted 網路函式庫。1 表示使用,0 表示不使用,-1 表示自動偵測," +"並偏好使用該函式庫" + +#: BitTorrent/defaultargs.py:143 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in, if neither is specified the user will be asked for save location" +msgstr "" +"另存 torrent 時使用的檔案名稱 (單檔案 torrent) 或目錄名稱 (批次 torrents)。請" +"參閱 --save_in 選項,如果沒有指定,則會向用戶詢問儲存位置" + +#: BitTorrent/defaultargs.py:148 +msgid "display advanced user interface" +msgstr "顯示進階使用者介面" + +#: BitTorrent/defaultargs.py:150 +msgid "" +"the maximum number of minutes to seed a completed torrent before stopping " +"seeding" +msgstr "將一個已完成的 torrent 最多作種多少分鐘,然後停止" + +#: BitTorrent/defaultargs.py:153 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding. 0 means no limit." +msgstr "停止作種之前,要達到指定的上傳/下載比例下限(百分比)。0 表示無限制。" + +#: BitTorrent/defaultargs.py:156 +msgid "" +"the minimum upload/download ratio, in percent, to achieve before stopping " +"seeding the last torrent. 0 means no limit." +msgstr "" +"最後一個 torrent 停止作種之前,要達到指定的上傳/下載比例下限 (百分比)。0 表示" +"無限制。" + +#: BitTorrent/defaultargs.py:159 +msgid "Seed each completed torrent indefinitely (until the user cancels it)" +msgstr "將每個已完成的 torrent 永遠作種 (直至用戶取消)" + +#: BitTorrent/defaultargs.py:162 +msgid "Seed the last torrent indefinitely (until the user cancels it)" +msgstr "將最後完成的 torrent 永遠作種 (直至用戶取消)" + +#: BitTorrent/defaultargs.py:165 +msgid "start downloader in paused state" +msgstr "在暫停狀態下開始下載程式" + +#: BitTorrent/defaultargs.py:167 +msgid "" +"specifies how the app should behave when the user manually tries to start " +"another torrent: \"replace\" means always replace the running torrent with " +"the new one, \"add\" means always add the running torrent in parallel, and " +"\"ask\" means ask the user each time." +msgstr "" +"指定當用戶嘗試啟動另一個 torrent 時,程式該如何處理:“replace”表示用新的 " +"torrent 更換執行中的 torrent,“add”表示和執行中的 torrent 一起運作,而“ask”則" +"表示每次皆詢問用戶" + +#: BitTorrent/defaultargs.py:181 +msgid "" +"file name (for single-file torrents) or directory name (for batch torrents) " +"to save the torrent as, overriding the default name in the torrent. See also " +"--save_in" +msgstr "" +"另存 torrent 檔所用的檔案名稱 (單檔案 torrent) 或者目錄名稱 (批次 torrent)。" +"請參閱 --save_in 選項。" + +#: BitTorrent/defaultargs.py:188 BitTorrent/defaultargs.py:208 +msgid "" +"the maximum number of uploads to allow at once. -1 means a (hopefully) " +"reasonable number based on --max_upload_rate. The automatic values are only " +"sensible when running one torrent at a time." +msgstr "" +"能同時上傳的數目上限。-1 表示依據 --max_upload_rate 估計合理數目。只有當每次" +"執行一個 torrent 時自動偵測的數值才會有用。" + +#: BitTorrent/defaultargs.py:193 +msgid "" +"local directory where the torrent contents will be saved. The file (single-" +"file torrents) or directory (batch torrents) will be created under this " +"directory using the default name specified in the .torrent file. See also --" +"save_as." +msgstr "" +"將儲存 torrent 內容的本地目錄。檔案 (單檔案 torrent) 或目錄 (批次 torrent) 會" +"儲存在這個目錄之下,並使用 .torrent 檔案中指定的預設檔案或目錄名稱。請參閱 --" +"save_as 選項。" + +#: BitTorrent/defaultargs.py:202 +msgid "whether or not to ask for a location to save downloaded files in" +msgstr "是否詢問下載檔案時的儲存位置" + +#: BitTorrent/defaultargs.py:213 +msgid "" +"local directory where the torrents will be saved, using a name determined by " +"--saveas_style. If this is left empty each torrent will be saved under the " +"directory of the corresponding .torrent file" +msgstr "" +"根據 --saveas_style 的名稱,決定儲存 torrents 檔案時的本地目錄。如果不填,則" +"每個檔案都儲存在相應的 .torrent 檔的目錄之下" + +#: BitTorrent/defaultargs.py:218 BitTorrent/track.py:77 +msgid "how often to rescan the torrent directory, in seconds" +msgstr "每隔多少秒鐘掃描一次 torrent 目錄" + +#: BitTorrent/defaultargs.py:220 +msgid "" +"How to name torrent downloads: 1: use name OF torrent file (minus ." +"torrent); 2: use name encoded IN torrent file; 3: create a directory with " +"name OF torrent file (minus .torrent) and save in that directory using name " +"encoded IN torrent file; 4: if name OF torrent file (minus .torrent) and " +"name encoded IN torrent file are identical, use that name (style 1/2), " +"otherwise create an intermediate directory as in style 3; CAUTION: options " +"1 and 2 have the ability to overwrite files without warning and may present " +"security issues." +msgstr "" +"如何決定 torrent 下載時的檔案名稱:\n" +"1:直接使用 torrent 本身的檔案名稱 (去除 .torrent 部份)\n" +"2:使用 torrent 內部指定的檔案名稱\n" +"3:建立一個以 torrent 本身 (去除 .torrent 部份) 命名的目錄並且把下載內容儲存" +"到這個目錄裡,而檔案名稱使用 torrent 檔內部指定的名稱\n" +"4:如果 torrent 檔案本身的名稱 (去除 .torrent 部份) 和內部指定的名稱一致,使" +"用這個名稱 (方案 1 或 2),否則按照方案 3 建立一個新的目錄來儲存\n" +"注意:方案 1 和 2 有可能在不發出警告的情況下覆蓋檔案,因此可能會存在一定的安" +"全威脅。" + +#: BitTorrent/defaultargs.py:235 +msgid "" +"whether to display the full path or the torrent contents for each torrent" +msgstr "是否顯示每個 torrent 的完整路徑或者 torrent 內容" + +#: BitTorrent/defaultargs.py:242 +msgid "directory to look for .torrent files (semi-recursive)" +msgstr "尋找 .torrent 檔案的目錄(半遞歸)" + +#: BitTorrent/defaultargs.py:247 +msgid "whether to display diagnostic info to stdout" +msgstr "是否在標準輸出顯示診斷資訊" + +#: BitTorrent/defaultargs.py:252 +msgid "which power of two to set the piece size to" +msgstr "將每個片段的大小設定為 2 的多少次方" + +#: BitTorrent/defaultargs.py:254 +msgid "default tracker name" +msgstr "預設的追蹤程式名稱" + +#: BitTorrent/defaultargs.py:257 +msgid "" +"if false then make a trackerless torrent, instead of announce URL, use " +"reliable node in form of : or an empty string to pull some nodes " +"from your routing table" +msgstr "" +"如果是“false”,則製作無追蹤程式的 torrent,而不發佈 URL,使用 : 形" +"式的可靠節點,或空白的字串以從您的電腦的路由表中搜尋節點" + +#: bittorrent-console.py:41 bittorrent-curses.py:59 +msgid "download complete!" +msgstr "下載完成!" + +#: bittorrent-console.py:46 bittorrent-curses.py:64 +msgid "" +msgstr "<未知>" + +#: bittorrent-console.py:49 bittorrent-curses.py:67 +#, python-format +msgid "finishing in %d:%02d:%02d" +msgstr "完成於 %d:%02d:%02d" + +#: bittorrent-console.py:96 bittorrent-curses.py:172 +msgid "download succeeded" +msgstr "下載成功" + +#: bittorrent-console.py:130 bittorrent-curses.py:229 +#, python-format +msgid "oo (%.1f MB up / %.1f MB down)" +msgstr "oo (上傳 %.1f MB / 下載 %.1f MB)" + +#: bittorrent-console.py:133 bittorrent-curses.py:232 +#, python-format +msgid "%.3f (%.1f MB up / %.1f MB down)" +msgstr "%.3f (上傳 %.1f MB / 下載 %.1f MB)" + +#: bittorrent-console.py:139 +#, python-format +msgid "%d seen now, plus %d distributed copies (%s)" +msgstr "見到 %d 個檔案,加上 %d 個已流通的檔案 (%s)" + +#: bittorrent-console.py:144 bittorrent-curses.py:243 +#, python-format +msgid "%d distributed copies (next: %s)" +msgstr "已流通 %d 個檔案 (下個: %s)" + +#: bittorrent-console.py:146 bittorrent-curses.py:245 +#, python-format +msgid "%d seen now" +msgstr "見到 %d 個檔案" + +#: bittorrent-console.py:149 +msgid "ERROR:\n" +msgstr "錯誤:\n" + +#: bittorrent-console.py:150 +msgid "saving: " +msgstr "儲存中:" + +#: bittorrent-console.py:151 +msgid "file size: " +msgstr "檔案大小:" + +#: bittorrent-console.py:152 +msgid "percent done: " +msgstr "完成百分比:" + +#: bittorrent-console.py:153 +msgid "time left: " +msgstr "剩下時間:" + +#: bittorrent-console.py:154 +msgid "download to: " +msgstr "下載到:" + +#: bittorrent-console.py:155 +msgid "download rate: " +msgstr "下載率:" + +#: bittorrent-console.py:156 +msgid "upload rate: " +msgstr "上載率:" + +#: bittorrent-console.py:157 +msgid "share rating: " +msgstr "共享率:" + +#: bittorrent-console.py:158 +msgid "seed status: " +msgstr "種子狀態:" + +#: bittorrent-console.py:159 +msgid "peer status: " +msgstr "對等點狀態:" + +#: bittorrent-console.py:222 bittorrent-curses.py:356 +msgid "You cannot specify both --save_as and --save_in" +msgstr "不可以同時使用 --save_as 和 --save_in 選項" + +#: bittorrent-console.py:240 bittorrent-curses.py:374 +#: BitTorrent/launchmanycore.py:69 +msgid "shutting down" +msgstr "關閉中" + +#: bittorrent-console.py:247 bittorrent-curses.py:381 +#: BitTorrent/launchmanycore.py:232 +msgid "Error reading config: " +msgstr "讀取設定時發生錯誤: " + +#: bittorrent-console.py:300 bittorrent-curses.py:434 +msgid "Error reading .torrent file: " +msgstr "讀取 .torrent 檔案時發生錯誤" + +#: bittorrent-console.py:302 bittorrent-curses.py:436 +msgid "you must specify a .torrent file" +msgstr "您必須指定一個 .torrent 檔案" + +#: bittorrent-curses.py:47 launchmany-curses.py:39 +msgid "Textmode GUI initialization failed, cannot proceed." +msgstr "文字模式介面不能啟動,無法繼續。" + +#: bittorrent-curses.py:49 launchmany-curses.py:41 +msgid "" +"This download interface requires the standard Python module \"curses\", " +"which is unfortunately not available for the native Windows port of Python. " +"It is however available for the Cygwin port of Python, running on all Win32 " +"systems (www.cygwin.com)." +msgstr "" +"這個下載介面需要 Python 的 curses 模組,但可惜 Python 的 Windows 移植版沒有該" +"模組。然而 Python 的 Cygwin (www.cygwin.com) 移植版本有該模組,而且可以在所" +"有 Win32 平台上使用。" + +#: bittorrent-curses.py:54 +msgid "You may still use \"bittorrent-console\" to download." +msgstr "您仍然可以使用“bittorrent-console”去下載。" + +#: bittorrent-curses.py:154 +msgid "file:" +msgstr "檔案:" + +#: bittorrent-curses.py:155 +msgid "size:" +msgstr "大小:" + +#: bittorrent-curses.py:156 +msgid "dest:" +msgstr "目的地:" + +#: bittorrent-curses.py:157 +msgid "progress:" +msgstr "進展:" + +#: bittorrent-curses.py:158 +msgid "status:" +msgstr "狀態:" + +#: bittorrent-curses.py:159 +msgid "dl speed:" +msgstr "下載速度:" + +#: bittorrent-curses.py:160 +msgid "ul speed:" +msgstr "上載速度:" + +#: bittorrent-curses.py:161 +msgid "sharing:" +msgstr "分享:" + +#: bittorrent-curses.py:162 +msgid "seeds:" +msgstr "種子:" + +#: bittorrent-curses.py:163 +msgid "peers:" +msgstr "對等點:" + +#: bittorrent-curses.py:238 +#, python-format +msgid "%d seen now, plus %d distributed copies(%s)" +msgstr "見到 %d 個檔案,加上已流通 %d 個檔案 (%s)" + +#: bittorrent-curses.py:265 +msgid "error(s):" +msgstr "錯誤:" + +#: bittorrent-curses.py:274 +msgid "error:" +msgstr "錯誤:" + +#: bittorrent-curses.py:277 +msgid "" +" # IP Upload Download Completed Speed" +msgstr "# IP 上載下載完成的速度" + +#: bittorrent-curses.py:322 +#, python-format +msgid "downloading %d pieces, have %d fragments, %d of %d pieces completed" +msgstr "正在下載 %d 段片段,總共有 %d 段,%d 中的 %d 已經完成" + +#: bittorrent-curses.py:446 +msgid "These errors occurred during execution:" +msgstr "執行時發生以下這些錯誤:" + +#: changetracker-console.py:23 +#, python-format +msgid "Usage: %s TRACKER_URL [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "用法:%s TRACKER_URL [TORRENTFILE [TORRENTFILE ...] ]" + +#: changetracker-console.py:32 +#, python-format +msgid "old announce for %s: %s" +msgstr "關於 %s 的舊發佈:%s" + +#: launchmany-console.py:35 launchmany-curses.py:234 +msgid "no torrents" +msgstr "沒有 torrent" + +#: launchmany-console.py:49 launchmany-curses.py:272 +msgid "SYSTEM ERROR - EXCEPTION GENERATED" +msgstr "系統錯誤 - 出現例外情況" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid "Warning: " +msgstr "警告:" + +#: launchmany-console.py:64 launchmany-curses.py:292 +msgid " is not a directory" +msgstr " 不是目錄" + +#: launchmany-console.py:66 +#, python-format +msgid "" +"error: %s\n" +"run with no args for parameter explanations" +msgstr "" +"錯誤:%s\n" +"請在執行時不加上任何選項以顯示每個選項的解釋" + +#: launchmany-console.py:71 launchmany-curses.py:299 +msgid "" +"\n" +"EXCEPTION:" +msgstr "" +"\n" +"例外情況:" + +#: launchmany-curses.py:46 +msgid "You may still use \"btdownloadheadless.py\" to download." +msgstr "您仍然可以使用“btdownloadheadless.py”來下載。" + +#: launchmany-curses.py:58 BitTorrent/launchmanycore.py:142 +msgid "connecting to peers" +msgstr "連接到對等點中" + +#: launchmany-curses.py:59 +#, python-format +msgid "ETA in %d:%02d:%02d" +msgstr "估計 %d:%02d:%02d 後完成" + +#: launchmany-curses.py:141 +msgid "Size" +msgstr "大小" + +#: launchmany-curses.py:141 +msgid "Download" +msgstr "下載" + +#: launchmany-curses.py:141 +msgid "Upload" +msgstr "上傳" + +#: launchmany-curses.py:153 launchmany-curses.py:246 +msgid "Totals:" +msgstr "總數:" + +#: launchmany-curses.py:212 +#, python-format +msgid " (%s) %s - %s peers %s seeds %s dist copies - %s dn %s up" +msgstr "" + +#: launchmany-curses.py:294 BitTorrent/track.py:852 +msgid "error: " +msgstr "錯誤:" + +#: launchmany-curses.py:294 +msgid "" +"\n" +"run with no args for parameter explanations" +msgstr "" +"\n" +"請在執行時不加上任何選項,以顯示每個選項的解釋" + +#: maketorrent-console.py:29 +msgid "optional human-readable comment to put in .torrent" +msgstr "加入 .torrent 檔的註解 (選擇性)" + +#: maketorrent-console.py:31 +msgid "optional target file for the torrent" +msgstr "torrent 的目標檔案 (選擇性)" + +#: torrentinfo-console.py:26 +#, python-format +msgid "%s %s - decode %s metainfo files" +msgstr "" + +#: torrentinfo-console.py:30 +#, python-format +msgid "Usage: %s [TORRENTFILE [TORRENTFILE ... ] ]" +msgstr "用法:%s [TORRENT檔 [TORRENT檔 ... ] ]" + +#: torrentinfo-console.py:34 +#, python-format +msgid "metainfo file: %s" +msgstr "元資料檔案:%s" + +#: torrentinfo-console.py:35 +#, python-format +msgid "info hash: %s" +msgstr "資訊雜湊值:%s" + +#: torrentinfo-console.py:36 +#, python-format +msgid "file name: %s" +msgstr "檔案名稱:%s" + +#: torrentinfo-console.py:37 +msgid "file size:" +msgstr "檔案大小:" + +#: torrentinfo-console.py:38 +msgid "files:" +msgstr "檔案:" + +#: torrentinfo-console.py:39 +#, python-format +msgid "directory name: %s" +msgstr "目錄名稱:%s" + +#: torrentinfo-console.py:40 +msgid "archive size:" +msgstr "歸檔大小:" + +#: torrentinfo-console.py:41 +#, python-format +msgid "tracker announce url: %s" +msgstr "追蹤器發佈 url :%s" + +#: torrentinfo-console.py:42 +msgid "trackerless nodes:" +msgstr "無追蹤程式的節點:" + +#: torrentinfo-console.py:43 +msgid "comment:" +msgstr "備註:" + +#: BitTorrent/controlsocket.py:135 BitTorrent/controlsocket.py:186 +msgid "Could not create control socket: " +msgstr "不能建立控制 socket:" + +#: BitTorrent/controlsocket.py:166 BitTorrent/controlsocket.py:218 +msgid "Could not send command: " +msgstr "不能傳送指令:" + +#: BitTorrent/controlsocket.py:176 +msgid "Could not create control socket: already in use" +msgstr "不能建立控制 socket:已經使用中" + +#: BitTorrent/controlsocket.py:181 +msgid "Could not remove old control socket filename:" +msgstr "不能重新命名舊的控制 socket 檔名:" + +#: BitTorrent/controlsocket.py:241 +msgid "Global mutex already created." +msgstr "" + +#: BitTorrent/controlsocket.py:255 +msgid "Could not find an open port!" +msgstr "找不到任何開啟的連接埠!" + +#: BitTorrent/controlsocket.py:264 +msgid "Could not create application data directory!" +msgstr "無法建立存放程式資料的目錄!" + +#: BitTorrent/controlsocket.py:280 +msgid "Could not acquire global mutex lock for controlsocket file!" +msgstr "" + +#: BitTorrent/controlsocket.py:290 +msgid "A previous instance of BT was not cleaned up properly. Continuing." +msgstr "上一次執行 BT 後未清理殘餘檔案,會繼續。" + +#: BitTorrent/bencode.py:73 +msgid "not a valid bencoded string" +msgstr "" + +#: BitTorrent/bencode.py:75 +msgid "invalid bencoded value (data after valid prefix)" +msgstr "" + +#: BitTorrent/parseargs.py:26 +#, python-format +msgid "Usage: %s " +msgstr "用法:%s " + +#: BitTorrent/parseargs.py:28 +msgid "" +"[OPTIONS] [TORRENTDIRECTORY]\n" +"\n" +msgstr "" +"[選項] [TORRENT目錄]\n" +"\n" + +#: BitTorrent/parseargs.py:29 +msgid "" +"If a non-option argument is present it's taken as the value\n" +"of the torrent_dir option.\n" +msgstr "" + +#: BitTorrent/parseargs.py:32 +msgid "[OPTIONS] [TORRENTFILES]\n" +msgstr "[選項] [TORRENT檔案...]\n" + +#: BitTorrent/parseargs.py:34 +msgid "[OPTIONS] [TORRENTFILE]\n" +msgstr "[選項] [TORRENT檔案]\n" + +#: BitTorrent/parseargs.py:36 +msgid "[OPTION] TRACKER_URL FILE [FILE]\n" +msgstr "[選項] TRACKER_URL 檔案 [檔案]\n" + +#: BitTorrent/parseargs.py:38 +msgid "arguments are -\n" +msgstr "參數是 -\n" + +#: BitTorrent/parseargs.py:69 +msgid " (defaults to " +msgstr " (預設為 " + +#: BitTorrent/parseargs.py:118 BitTorrent/parseargs.py:162 +msgid "unknown key " +msgstr "未知的鑰匙" + +#: BitTorrent/parseargs.py:124 BitTorrent/parseargs.py:134 +msgid "parameter passed in at end with no value" +msgstr "" + +#: BitTorrent/parseargs.py:138 +msgid "command line parsing failed at " +msgstr "" + +#: BitTorrent/parseargs.py:145 +#, python-format +msgid "Option %s is required." +msgstr "選項需要 %s" + +#: BitTorrent/parseargs.py:147 +#, python-format +msgid "Must supply at least %d arguments." +msgstr "必須至少提供 %d 個參數。" + +#: BitTorrent/parseargs.py:149 +#, python-format +msgid "Too many arguments - %d maximum." +msgstr "參數過多 - 最多只接受 %d 個。" + +#: BitTorrent/parseargs.py:186 +#, python-format +msgid "wrong format of %s - %s" +msgstr "%s 的格式不正確 - %s" + +#: BitTorrent/configfile.py:70 +msgid "Could not permanently save options: " +msgstr "不能永久儲存設定:" + +#: BitTorrent/Rerequester.py:92 +#, python-format +msgid "Tracker announce still not complete %d seconds after starting it" +msgstr "" + +#: BitTorrent/Rerequester.py:162 +msgid "Problem connecting to tracker, gethostbyname failed - " +msgstr "連接追蹤程式發生問題,gethostbyname 函式失敗 -" + +#: BitTorrent/Rerequester.py:175 +msgid "Problem connecting to tracker - " +msgstr "連接追蹤程式發生問題 - " + +#: BitTorrent/Rerequester.py:202 +msgid "bad data from tracker - " +msgstr "追蹤程式發出損壞的資料 - " + +#: BitTorrent/Rerequester.py:213 +msgid "rejected by tracker - " +msgstr "被追蹤程式拒絕 - " + +#: BitTorrent/Rerequester.py:219 +msgid "" +"Aborting the torrent as it was rejected by the tracker while not connected " +"to any peers. " +msgstr "中止 torrent 檔運行,因為被追蹤程式拒絕,而且沒有連上任何對等點。" + +#: BitTorrent/Rerequester.py:221 +msgid " Message from the tracker: " +msgstr "由追蹤程式發出的訊息:" + +#: BitTorrent/Rerequester.py:227 +msgid "warning from tracker - " +msgstr "由追蹤程式發出的警告 - " + +#: BitTorrent/parsedir.py:34 +msgid "Could not read directory " +msgstr "無法讀取目錄 " + +#: BitTorrent/parsedir.py:43 +msgid "Could not stat " +msgstr "找不到目錄或檔案" + +#: BitTorrent/parsedir.py:74 +#, python-format +msgid "removing %s (will re-add)" +msgstr "暫時移除 %s (會重新加入)" + +#: BitTorrent/parsedir.py:84 BitTorrent/parsedir.py:98 +#, python-format +msgid "**warning** %s is a duplicate torrent for %s" +msgstr "**警告** %s 和 %s 是相同的 torrent" + +#: BitTorrent/parsedir.py:130 +#, python-format +msgid "**warning** %s has errors" +msgstr "**警告** %s 有錯誤" + +#: BitTorrent/parsedir.py:138 +msgid "... successful" +msgstr "... 成功" + +#: BitTorrent/parsedir.py:145 +#, python-format +msgid "removing %s" +msgstr "移除 %s" + +#: BitTorrent/parsedir.py:149 +msgid "done checking" +msgstr "完成檢查" + +#: BitTorrent/RawServer.py:322 +msgid "lost server socket" +msgstr "失去伺服器 socket" + +#: BitTorrent/RawServer.py:338 +msgid "Error handling accepted connection: " +msgstr "處理已接受的連線發生錯誤:" + +#: BitTorrent/RawServer.py:423 +#, python-format +msgid "Have to exit due to the TCP stack flaking out. Please see the FAQ at %s" +msgstr "因為 TCP 堆叠耗盡,程式必須結束。請參閱 %s 的常見問答集" + +#: BitTorrent/RawServer_magic.py:32 +#, python-format +msgid "Too late to switch RawServer backends, %s has already been used." +msgstr "" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Mon" +msgstr "週一" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Tue" +msgstr "週二" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Wed" +msgstr "週三" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Thu" +msgstr "週四" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Fri" +msgstr "週五" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sat" +msgstr "週六" + +#: BitTorrent/HTTPHandler.py:21 +msgid "Sun" +msgstr "週日" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jan" +msgstr "一月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Feb" +msgstr "二月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Mar" +msgstr "三月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Apr" +msgstr "四月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "May" +msgstr "五月" + +#: BitTorrent/HTTPHandler.py:23 +msgid "Jun" +msgstr "六月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Jul" +msgstr "七月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Aug" +msgstr "八月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Sep" +msgstr "九月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Oct" +msgstr "十月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Nov" +msgstr "十一月" + +#: BitTorrent/HTTPHandler.py:24 +msgid "Dec" +msgstr "十二月" + +#: BitTorrent/HTTPHandler.py:126 +#, python-format +msgid "Compressed: %i Uncompressed: %i\n" +msgstr "壓縮後: %i 未壓縮: %i\n" + +#: BitTorrent/makemetafile.py:60 +msgid "" +"You can't specify the name of the .torrent file when generating multiple " +"torrents at once" +msgstr "同時產生多個 torrent 檔的話不可以指定 .torrent 檔名" + +#: BitTorrent/makemetafile.py:75 +#, python-format +msgid "Filesystem encoding \"%s\" is not supported in this version" +msgstr "這個版本不支援檔案系統文字編碼“%s”" + +#: BitTorrent/makemetafile.py:185 +#, python-format +msgid "" +"Could not convert file/directory name \"%s\" to utf-8 (%s). Either the " +"assumed filesystem encoding \"%s\" is wrong or the filename contains illegal " +"bytes." +msgstr "" +"無法將檔案或目錄名稱“%s”轉換為 UTF-8 (%s)。可能是檔案系統文字編碼被錯誤估計" +"為“%s”,或者檔案名稱含有不合法的字元。" + +#: BitTorrent/makemetafile.py:190 +#, python-format +msgid "" +"File/directory name \"%s\" contains reserved unicode values that do not " +"correspond to characters." +msgstr "" +"檔案或目錄名稱“%s”含有 unicode 的保留字碼,這些字碼無法表示為任何字元。" + +#: BitTorrent/StorageWrapper.py:53 +msgid "bad data in responsefile - total too small" +msgstr "torrent 檔出現壞資料 - 總數太小" + +#: BitTorrent/StorageWrapper.py:55 +msgid "bad data in responsefile - total too big" +msgstr "torrent 檔出現壞資料 - 總數太大" + +#: BitTorrent/StorageWrapper.py:100 +msgid "checking existing file" +msgstr "正在檢查現存的檔案" + +#: BitTorrent/StorageWrapper.py:122 +msgid "" +"--check_hashes 0 or fastresume info doesn't match file state (missing data)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:131 +msgid "Bad fastresume info (files contain more data)" +msgstr "快速續傳資料錯誤 (檔案有過多的資料)" + +#: BitTorrent/StorageWrapper.py:136 +msgid "Bad fastresume info (illegal value)" +msgstr "" + +#: BitTorrent/StorageWrapper.py:252 +msgid "data corrupted on disk - maybe you have two copies running?" +msgstr "磁碟含有損壞的資料 - 是否有兩個 torrent 程式同時執行?" + +#: BitTorrent/StorageWrapper.py:284 BitTorrent/Storage.py:255 +msgid "Couldn't read fastresume data: " +msgstr "無法讀取用作快速續傳的資料:" + +#: BitTorrent/StorageWrapper.py:404 +msgid "told file complete on start-up, but piece failed hash check" +msgstr "該檔案報稱已經完成,但其中有片段的雜湊值有錯誤" + +#: BitTorrent/Storage.py:58 +#, python-format +msgid "File %s belongs to another running torrent" +msgstr "檔案 %s 屬於另一個執行中的 torrent" + +#: BitTorrent/Storage.py:102 +#, python-format +msgid "File %s already exists, but is not a regular file" +msgstr "檔案 %s 已經存在,但不是一般檔案" + +#: BitTorrent/Storage.py:181 +msgid "Short read - something truncated files?" +msgstr "讀取的檔案不完整 - 是否有程式截短了檔案?" + +#: BitTorrent/Storage.py:224 +msgid "Unsupported fastresume file format, maybe from another client version?" +msgstr "無法支援這個用作快速續傳的檔案的格式,是否來自另一個程式版本的?" + +#: BitTorrent/Storage.py:238 +msgid "Another program appears to have moved, renamed, or deleted the file." +msgstr "另一個程式可能移動或刪除了檔案,或者更改了檔名。" + +#: BitTorrent/Storage.py:240 +msgid "Another program appears to have modified the file." +msgstr "另一個程式可能更改了檔案內容。" + +#: BitTorrent/Storage.py:242 +msgid "Another program appears to have changed the file size." +msgstr "另一個程式可能更改了檔案大小。" + +#: BitTorrent/launchmanycore.py:65 +msgid "Could not set signal handler: " +msgstr "不能設定訊號處理程序:" + +#: BitTorrent/launchmanycore.py:71 BitTorrent/launchmanycore.py:92 +#, python-format +msgid "dropped \"%s\"" +msgstr "丢棄“%s”" + +#: BitTorrent/launchmanycore.py:95 +#, python-format +msgid "added \"%s\"" +msgstr "加入“%s”" + +#: BitTorrent/launchmanycore.py:121 +msgid "waiting for hash check" +msgstr "等待檢查雜湊值" + +#: BitTorrent/launchmanycore.py:139 BitTorrent/download.py:395 +msgid "downloading" +msgstr "下載中" + +#: BitTorrent/launchmanycore.py:234 +msgid "Rereading config file" +msgstr "重新讀入設定檔" + +#: BitTorrent/GetTorrent.py:42 BitTorrent/GetTorrent.py:80 +#, python-format +msgid "Could not read %s" +msgstr "無法讀取 %s" + +#: BitTorrent/GetTorrent.py:49 +#, python-format +msgid "" +"Could not download or open \n" +"%s\n" +"Try using a web browser to download the torrent file." +msgstr "" +"無法下載或開啟\n" +"%s\n" +"請嘗試改用網頁瀏覽器下載 torrent 檔。" + +#: BitTorrent/ConvertedMetainfo.py:51 +msgid "" +"This seems to be an old Python version which does not support detecting the " +"filesystem encoding. Assuming 'ascii'." +msgstr "" +"這個 Python 版本似乎比較舊,不能自動偵測檔案系統所用的文字編碼。假設" +"為“ascii”。" + +#: BitTorrent/ConvertedMetainfo.py:58 +msgid "Python failed to autodetect filesystem encoding. Using 'ascii' instead." +msgstr "Python 無法自動偵測檔案系統所用的文字編碼,改用“ascii”編碼。" + +#: BitTorrent/ConvertedMetainfo.py:65 +#, python-format +msgid "Filesystem encoding '%s' is not supported. Using 'ascii' instead." +msgstr "不支援“%s”檔案系統文字編碼,改用“ascii”編碼。" + +#: BitTorrent/ConvertedMetainfo.py:123 +msgid "Bad file path component: " +msgstr "檔案路徑錯誤:" + +#: BitTorrent/ConvertedMetainfo.py:195 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. Some or all of the filenames may appear different from " +"what the creator of the .torrent file intended." +msgstr "" +"這個 .torrent 檔是用不恰當的工具製作的,檔案名稱編碼有問題。實際下載的檔案" +"和 .torrent 檔作者本來指定的檔案名稱可能會不一致。" + +#: BitTorrent/ConvertedMetainfo.py:201 +msgid "" +"This .torrent file has been created with a broken tool and has bad character " +"values that do not correspond to any real character. Some or all of the " +"filenames may appear different from what the creator of the .torrent file " +"intended." +msgstr "" +"這個 .torrent 檔是用不恰當的工具製作的,某些字元無法表示出來。實際下載的檔案" +"和 .torrent 檔作者本來指定的檔案名稱可能會不一致。" + +#: BitTorrent/ConvertedMetainfo.py:208 +msgid "" +"This .torrent file has been created with a broken tool and has incorrectly " +"encoded filenames. The names used may still be correct." +msgstr "" +"這個 .torrent 檔是用不恰當的工具製作的,檔案名稱編碼有問題。但實際下載的檔案" +"的名稱可能可以成功顯示。" + +#: BitTorrent/ConvertedMetainfo.py:213 +#, python-format +msgid "" +"The character set used on the local filesystem (\"%s\") cannot represent all " +"characters used in the filename(s) of this torrent. Filenames have been " +"changed from the original." +msgstr "" +"檔案系統的文字編碼 (“%s”) 無法表示所有這個 torrent 檔會用的字元,因此會更改檔" +"案名稱。" + +#: BitTorrent/ConvertedMetainfo.py:219 +msgid "" +"The Windows filesystem cannot handle some characters used in the filename(s) " +"of this torrent.Filenames have been changed from the original." +msgstr "" +"Windows 檔案系統無法處理本 torrent 的檔案名稱的某些字元,因此會更改檔案名稱。" + +#: BitTorrent/ConvertedMetainfo.py:224 +msgid "" +"This .torrent file has been created with a broken tool and has at least 1 " +"file with an invalid file or directory name. However since all such files " +"were marked as having length 0 those files are just ignored." +msgstr "" +"這個 .torrent 檔是用不恰當的工具製作的,最少有一個檔案或目錄名稱無法顯示。可" +"是因為所有這種檔案大小都是 0,所以全部這類檔案都會略過。" + +#: BitTorrent/__init__.py:22 +msgid "Python 2.2.1 or newer required" +msgstr "需要 Python 2.2.1 或以上版本" + +#: BitTorrent/Encoder.py:169 +msgid "Can't start two separate instances of the same torrent" +msgstr "" + +#: BitTorrent/download.py:96 +msgid "maxport less than minport - no ports to check" +msgstr "埠號的最大值小於最小值 - 不會檢查任何連接埠" + +#: BitTorrent/download.py:114 +#, python-format +msgid "Could not open a listening port: %s." +msgstr "無法開啟連接埠:%s。" + +#: BitTorrent/download.py:116 +#, python-format +msgid "Could not open a listening port: %s. " +msgstr "無法開啟連接埠:%s。" + +#: BitTorrent/download.py:118 +msgid "Check your port range settings." +msgstr "請檢查有關埠號使用範圍的設定。" + +#: BitTorrent/download.py:214 +msgid "Initial startup" +msgstr "最初起動" + +#: BitTorrent/download.py:267 +#, python-format +msgid "Could not load fastresume data: %s." +msgstr "無法載入快速續傳的資料:%s。" + +#: BitTorrent/download.py:268 +msgid "Will perform full hash check." +msgstr "將會執行完整的雜湊值檢查。" + +#: BitTorrent/download.py:275 +#, python-format +msgid "piece %d failed hash check, re-downloading it" +msgstr "第 %d 段的雜湊值檢查失敗,必須重新下載" + +#: BitTorrent/download.py:356 +msgid "" +"Attempt to download a trackerless torrent with trackerless client turned off." +msgstr "嘗試下載沒有追蹤程式的 torrent,但程式本身未使用沒有追蹤程式的模式。" + +#: BitTorrent/download.py:405 +msgid "download failed: " +msgstr "下載失敗:" + +#: BitTorrent/download.py:409 +msgid "IO Error: No space left on disk, or cannot create a file that large:" +msgstr "I/O 錯誤:磁碟沒有空間,或者無法建立太大的檔案:" + +#: BitTorrent/download.py:412 +msgid "killed by IO error: " +msgstr "I/O 錯誤以致立即中止:" + +#: BitTorrent/download.py:415 +msgid "killed by OS error: " +msgstr "因作業系統錯誤而立即中止:" + +#: BitTorrent/download.py:420 +msgid "killed by internal exception: " +msgstr "因內部錯誤而立即中止:" + +#: BitTorrent/download.py:425 +msgid "Additional error when closing down due to error: " +msgstr "當關閉時出現額外的錯誤:" + +#: BitTorrent/download.py:438 +msgid "Could not remove fastresume file after failure:" +msgstr "發生錯誤後,無法移除快速續傳檔案:" + +#: BitTorrent/download.py:455 +msgid "seeding" +msgstr "作種中" + +#: BitTorrent/download.py:478 +msgid "Could not write fastresume data: " +msgstr "無法寫入快速續傳資料:" + +#: BitTorrent/download.py:488 +msgid "shut down" +msgstr "關閉" + +#: BitTorrent/btformats.py:23 +msgid "bad metainfo - not a dictionary" +msgstr "" + +#: BitTorrent/btformats.py:26 +msgid "bad metainfo - bad pieces key" +msgstr "" + +#: BitTorrent/btformats.py:29 +msgid "bad metainfo - illegal piece length" +msgstr "元資料有錯誤 - 片䇬段的大小不合法" + +#: BitTorrent/btformats.py:32 +msgid "bad metainfo - bad name" +msgstr "元資料有錯誤 - 名稱出錯" + +#: BitTorrent/btformats.py:34 +#, python-format +msgid "name %s disallowed for security reasons" +msgstr "因系統安全理由不接受 %s 這種名稱" + +#: BitTorrent/btformats.py:36 +msgid "single/multiple file mix" +msgstr "單一個/多個檔案混合" + +#: BitTorrent/btformats.py:40 BitTorrent/btformats.py:50 +msgid "bad metainfo - bad length" +msgstr "元資料有錯誤 - 大小不合法" + +#: BitTorrent/btformats.py:44 +msgid "bad metainfo - \"files\" is not a list of files" +msgstr "元資料有錯誤 - “files”的內容不是檔案清單" + +#: BitTorrent/btformats.py:47 +msgid "bad metainfo - bad file value" +msgstr "元資料有錯誤 - 檔案的值錯誤" + +#: BitTorrent/btformats.py:53 +msgid "bad metainfo - bad path" +msgstr "元資料有錯誤 - 路徑錯誤" + +#: BitTorrent/btformats.py:56 +msgid "bad metainfo - bad path dir" +msgstr "元資料有錯誤 - 路徑中的目錄有錯誤" + +#: BitTorrent/btformats.py:58 +#, python-format +msgid "path %s disallowed for security reasons" +msgstr "因系統安全理由不接受 %s 這種路徑" + +#: BitTorrent/btformats.py:69 +msgid "bad metainfo - duplicate path" +msgstr "元資料有錯誤 - 路徑重複" + +#: BitTorrent/btformats.py:71 +msgid "bad metainfo - name used as bothfile and subdirectory name" +msgstr "元資料有錯誤 - 名稱同時作為檔案和目錄名稱" + +#: BitTorrent/btformats.py:78 BitTorrent/btformats.py:89 +#: BitTorrent/btformats.py:91 BitTorrent/btformats.py:94 +#: BitTorrent/btformats.py:96 +msgid "bad metainfo - wrong object type" +msgstr "元資料有錯誤 - 物件類型錯誤" + +#: BitTorrent/btformats.py:81 +msgid "bad metainfo - no announce URL string" +msgstr "" + +#: BitTorrent/btformats.py:103 +msgid "non-text failure reason" +msgstr "失敗原因不是一般文字" + +#: BitTorrent/btformats.py:107 +msgid "non-text warning message" +msgstr "警告訊息不是一般文字" + +#: BitTorrent/btformats.py:112 +msgid "invalid entry in peer list1" +msgstr "對等點列表 1 有無效的項目" + +#: BitTorrent/btformats.py:114 +msgid "invalid entry in peer list2" +msgstr "對等點列表 2 有無效的項目" + +#: BitTorrent/btformats.py:117 +msgid "invalid entry in peer list3" +msgstr "對等點列表 3 有無效的項目" + +#: BitTorrent/btformats.py:121 +msgid "invalid entry in peer list4" +msgstr "對等點列表 4 有無效的項目" + +#: BitTorrent/btformats.py:123 +msgid "invalid peer list" +msgstr "對等點列表無效" + +#: BitTorrent/btformats.py:126 +msgid "invalid announce interval" +msgstr "" + +#: BitTorrent/btformats.py:129 +msgid "invalid min announce interval" +msgstr "" + +#: BitTorrent/btformats.py:131 +msgid "invalid tracker id" +msgstr "無效的追蹤程式 id" + +#: BitTorrent/btformats.py:134 +msgid "invalid peer count" +msgstr "對等點總數無效" + +#: BitTorrent/btformats.py:137 +msgid "invalid seed count" +msgstr "種子總數無效" + +#: BitTorrent/btformats.py:140 +msgid "invalid \"last\" entry" +msgstr "「最後」項目無效" + +#: BitTorrent/track.py:40 +msgid "Port to listen on." +msgstr "要開啟的埠號" + +#: BitTorrent/track.py:42 +msgid "file to store recent downloader info in" +msgstr "" + +#: BitTorrent/track.py:46 +msgid "timeout for closing connections" +msgstr "關閉連線所等待的時間" + +#: BitTorrent/track.py:50 +msgid "seconds between saving dfile" +msgstr "儲存 dfile 的時間間隔 (秒)" + +#: BitTorrent/track.py:52 +msgid "seconds between expiring downloaders" +msgstr "" + +#: BitTorrent/track.py:54 +msgid "seconds downloaders should wait between reannouncements" +msgstr "" + +#: BitTorrent/track.py:56 +msgid "" +"default number of peers to send an info message to if the client does not " +"specify a number" +msgstr "" + +#: BitTorrent/track.py:59 +msgid "time to wait between checking if any connections have timed out" +msgstr "檢查有沒有連線逾時的時間間隔" + +#: BitTorrent/track.py:61 +msgid "" +"how many times to check if a downloader is behind a NAT (0 = don't check)" +msgstr "檢查多少次下載程式是否在 NAT 背後 (0 表示不檢查)" + +#: BitTorrent/track.py:64 +msgid "whether to add entries to the log for nat-check results" +msgstr "" + +#: BitTorrent/track.py:66 +msgid "minimum time it must have been since the last flush to do another one" +msgstr "" + +#: BitTorrent/track.py:69 +msgid "" +"minimum time in seconds before a cache is considered stale and is flushed" +msgstr "" + +#: BitTorrent/track.py:72 +msgid "" +"only allow downloads for .torrents in this dir (and recursively in " +"subdirectories of directories that have no .torrent files themselves). If " +"set, torrents in this directory show up on infopage/scrape whether they have " +"peers or not" +msgstr "" + +#: BitTorrent/track.py:79 +msgid "" +"allow special keys in torrents in the allowed_dir to affect tracker access" +msgstr "" + +#: BitTorrent/track.py:82 +msgid "whether to reopen the log file upon receipt of HUP signal" +msgstr "收到 HUP 訊號時是否重新開啟紀錄檔" + +#: BitTorrent/track.py:84 +msgid "whether to display an info page when the tracker's root dir is loaded" +msgstr "" + +#: BitTorrent/track.py:87 +msgid "a URL to redirect the info page to" +msgstr "資料頁會重新導向至指定的 URL" + +#: BitTorrent/track.py:89 +msgid "whether to display names from allowed dir" +msgstr "" + +#: BitTorrent/track.py:91 +msgid "file containing x-icon data to return when browser requests favicon.ico" +msgstr "" + +#: BitTorrent/track.py:94 +msgid "" +"ignore the ip GET parameter from machines which aren't on local network IPs " +"(0 = never, 1 = always, 2 = ignore if NAT checking is not enabled). HTTP " +"proxy headers giving address of original client are treated the same as --ip." +msgstr "" + +#: BitTorrent/track.py:99 +msgid "file to write the tracker logs, use - for stdout (default)" +msgstr "追蹤程式的紀錄會寫入至指定檔案,可使用 - (預設值) 代表標準輸出" + +#: BitTorrent/track.py:101 +msgid "" +"use with allowed_dir; adds a /file?hash={hash} url that allows users to " +"download the torrent file" +msgstr "" + +#: BitTorrent/track.py:104 +msgid "" +"keep dead torrents after they expire (so they still show up on your /scrape " +"and web page). Only matters if allowed_dir is not set" +msgstr "" + +#: BitTorrent/track.py:107 +msgid "scrape access allowed (can be none, specific or full)" +msgstr "" + +#: BitTorrent/track.py:109 +msgid "maximum number of peers to give with any one request" +msgstr "" + +#: BitTorrent/track.py:163 +msgid "" +"your file may exist elsewhere in the universe\n" +"but alas, not here\n" +msgstr "檔案可能放在別的地方,但不在這裡\n" + +#: BitTorrent/track.py:248 +#, python-format +msgid "**warning** specified favicon file -- %s -- does not exist." +msgstr "**警告** 指定的 favicon 檔案 (%s) 不存在。" + +#: BitTorrent/track.py:271 +#, python-format +msgid "**warning** statefile %s corrupt; resetting" +msgstr "**警告** 狀態檔 %s 損䢱䢱壞;重新啟動" + +#: BitTorrent/track.py:307 +msgid "# Log Started: " +msgstr "# 紀錄開始:" + +#: BitTorrent/track.py:309 +msgid "**warning** could not redirect stdout to log file: " +msgstr "**警告** 無法將標準輸出的內容重新導向至紀錄檔:" + +#: BitTorrent/track.py:317 +msgid "# Log reopened: " +msgstr "# 紀錄再開:" + +#: BitTorrent/track.py:319 +msgid "**warning** could not reopen logfile" +msgstr "**警告** 不能再開紀錄檔案" + +#: BitTorrent/track.py:459 +msgid "specific scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:469 +msgid "full scrape function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:482 +msgid "get function is not available with this tracker." +msgstr "" + +#: BitTorrent/track.py:496 +msgid "Requested download is not authorized for use with this tracker." +msgstr "" + +#: BitTorrent/track.py:853 +msgid "run with no arguments for parameter explanations" +msgstr "請在執行時不加任何選項,以顯示每個選項的解釋" + +#: BitTorrent/track.py:861 +msgid "# Shutting down: " +msgstr "# 關閉中:" diff --git a/objc/_FoundationSignatures.py b/objc/_FoundationSignatures.py new file mode 100755 index 0000000..6fa0030 --- /dev/null +++ b/objc/_FoundationSignatures.py @@ -0,0 +1,64 @@ +from _objc import setSignatureForSelector + +setSignatureForSelector("NSScanner", "scanCharactersFromSet:intoString:", "c@:@o^@") +setSignatureForSelector("NSScanner", "scanDouble:", "c@:o^d") +setSignatureForSelector("NSScanner", "scanFloat:", "c@:o^f") +setSignatureForSelector("NSScanner", "scanHexInt:", "c@:o^I") +setSignatureForSelector("NSScanner", "scanInt:", "c@:o^i") +setSignatureForSelector("NSScanner", "scanLongLong:", "c@:o^q") +setSignatureForSelector("NSScanner", "scanString:intoString:", "c@:@o^@") +setSignatureForSelector("NSScanner", "scanUpToCharactersFromSet:intoString:", "c@:@o^@") +setSignatureForSelector("NSScanner", "scanUpToString:intoString:", "c@:@o^@") +setSignatureForSelector("NSStream", "getStreamsToHost:port:inputStream:outputStream:", "v@:@io^@o^@") +setSignatureForSelector("NSString", "completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:", "I@:o^@co^@@") +setSignatureForSelector("NSString", "getLineStart:end:contentsEnd:forRange:", "v@:o^Io^Io^I{_NSRange=II}") +setSignatureForSelector("NSMutableAttributedString", "readFromURL:options:documentAttributes:", "c@:@@o^@") +setSignatureForSelector("NSAttributedString", "attribute:atIndex:effectiveRange:", "@0@4:8@12I16o^{_NSRange=II}20") +setSignatureForSelector("NSAttributedString", "attribute:atIndex:longestEffectiveRange:inRange:", "@0@4:8@12I16o^{_NSRange=II}20{_NSRange=II}24") +setSignatureForSelector("NSAttributedString", "attributesAtIndex:effectiveRange:", "@0@4:8I12o^{_NSRange=II}16") +setSignatureForSelector("NSAttributedString", "attributesAtIndex:longestEffectiveRange:inRange:", "@0@4:8I12o^{_NSRange=II}16{_NSRange=II}20") +setSignatureForSelector("NSAttributedString", "initWithHTML:baseURL:documentAttributes:", "@0@4:8@12@16o^@20") +setSignatureForSelector("NSAttributedString", "initWithHTML:documentAttributes:", "@@:@o^@") +setSignatureForSelector("NSAttributedString", "initWithPath:documentAttributes:", "@@:@o^@") +setSignatureForSelector("NSAttributedString", "initWithRTFDFileWrapper:documentAttributes:", "@@:@o^@") +setSignatureForSelector("NSAttributedString", "initWithRTFD:documentAttributes:", "@0@4:8@12o^@16") +setSignatureForSelector("NSAttributedString", "initWithRTF:documentAttributes:", "@0@4:8@12o^@16") +setSignatureForSelector("NSAttributedString", "initWithURL:documentAttributes:", "@0@4:8@12o^@16") +setSignatureForSelector("NSFileManager", "fileExistsAtPath:isDirectory:", "c0@4:8@12o^c16") +setSignatureForSelector("NSArray", "getObject:atIndex:", "c@:o^@I") +setSignatureForSelector("NSCalendarDate", "years:months:days:hours:minutes:seconds:sinceDate:", "v@:o^io^io^io^io^io^i@") +setSignatureForSelector("NSPropertyListSerialization", "dataFromPropertyList:format:errorDescription:", "@@:@io^@") +setSignatureForSelector("NSPropertyListSerialization", "propertyListFromData:mutabilityOption:format:errorDescription:", "@@:@io^io^@") +setSignatureForSelector("NSAppleScript", "_initWithContentsOfFile:error:", "@@:@o^@") +setSignatureForSelector("NSAppleScript", "_initWithData:error:", "@@:@o^@") +setSignatureForSelector("NSAppleScript", "compileAndReturnError:", "c@:o^@") +setSignatureForSelector("NSAppleScript", "executeAndReturnError:", "@@:o^@") +setSignatureForSelector("NSAppleScript", "executeAppleEvent:error:", "@@:@o^@") +setSignatureForSelector("NSAppleScript", "initWithContentsOfURL:error:", "@@:@o^@") +setSignatureForSelector("NSFaultHandler", "extraData", "i@:") +setSignatureForSelector("NSFaultHandler", "setTargetClass:extraData:", "v@:#i") +setSignatureForSelector("NSFormatter", "getObjectValue:forString:errorDescription:", "c@:o^@@o^@") +setSignatureForSelector("NSFormatter", "isPartialStringValid:newEditingString:errorDescription:", "c@:@o^@o^@") +setSignatureForSelector("NSFormatter", "isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:", "c0@4:8o^@12o^{_NSRange=II}16@20{_NSRange=II}24o^@32") + +setSignatureForSelector("NSObject", "validateValue:forKey:error:", "c@:N^@@o^@") +setSignatureForSelector("NSObject", "validateValue:forKeyPath:error:", "c@:N^@@o^@") +setSignatureForSelector("NSObject", "addObserver:forKeyPath:options:context:", + "v@:@@Ii") +setSignatureForSelector("NSObject", "observeValueForKeyPath:ofObject:change:context:", "v@:@@@i") +setSignatureForSelector("NSArray", "addObserver:toObjectsAtIndexes:forKeyPath:options:context:", 'v@:@@@Ii') +setSignatureForSelector("NSURLConnection", "sendSynchronousRequest:returningResponse:error:", "@@:@o^@o^@") +setSignatureForSelector("NSString", "getParagraphStart:end:contentsEnd:forRange:", "v@:o^Io^Io^I{_NSRange=II}") +setSignatureForSelector("NSMutableAttributedString", "readFromData:options:documentAttributes:", "c@:@@o^@") +setSignatureForSelector("NSAttributedString", "initWithHTML:options:documentAttributes:", "@20@0:4@8@12o^@16") +setSignatureForSelector("NSAttributedString", "initWithDocFormat:documentAttributes:", "@@:@o^@") +setSignatureForSelector("NSKeyValueProperty", "keyPathIfAffectedByValueForKey:exactMatch:", "@@:@o^c") +setSignatureForSelector("NSKeyValueObservationForwarder", "initWithObserver:relationshipKey:keyPathFromRelatedObject:options:context:", "@@:@@@Ii") +setSignatureForSelector("NSDeserializer", "deserializePropertyListFromData:atCursor:mutableContainers:", "@@:@O^Ic") +setSignatureForSelector("NSDeserializer", "deserializePropertyListLazilyFromData:atCursor:length:mutableContainers:", "@@:@O^IIc") +setSignatureForSelector("OC_PythonObject", "addObserver:forKeyPath:options:context:", "v@:@@Ii") + + +# Technically incorrect, but not used anyway +setSignatureForSelector("NSObject", "setObservationInfo:", "v@:i") +setSignatureForSelector("NSObject", "observationInfo", "i@:") diff --git a/objc/__init__.py b/objc/__init__.py new file mode 100755 index 0000000..00ca946 --- /dev/null +++ b/objc/__init__.py @@ -0,0 +1,40 @@ +""" +Python <-> Objective-C bridge (PyObjC) + +This module defines the core interfaces of the Python<->Objective-C bridge. +""" + +# Aliases for some common Objective-C constants +nil = None +YES = True +NO = False + +# Import the namespace from the _objc extension +def _update(g=globals()): + import _objc + for k,v in _objc.__dict__.iteritems(): + g.setdefault(k,v) +_update() +del _update + +from _convenience import * +import _FoundationSignatures + +# Add useful utility functions below +if platform == 'MACOSX': + from _dyld import * +else: + from _gnustep import * + +from _protocols import * +from _descriptors import * +from _category import * +from _bridges import * +from _compat import * +from _pythonify import * +from _functions import * + +### +# This can be usefull to hunt down memory problems in the testsuite. +#import atexit +#atexit.register(recycleAutoreleasePool) diff --git a/objc/_bridges.py b/objc/_bridges.py new file mode 100755 index 0000000..315fef5 --- /dev/null +++ b/objc/_bridges.py @@ -0,0 +1,30 @@ +from _objc import * + +__all__ = [] + +BRIDGED_STRUCTURES = {} +BRIDGED_TYPES = [] + +try: + from array import array + from Carbon.File import FSRef +except ImportError: + pass +else: + def struct_to_FSRef(s): + return FSRef(rawdata=array('B', s[0]).tostring()) + BRIDGED_STRUCTURES['{FSRef=[80C]}'] = struct_to_FSRef + + def FSRef_to_struct(fsRef): + return (tuple(array('B').fromstring(fsRef.data)),) + BRIDGED_TYPES.append((FSRef, FSRef_to_struct)) + +def _bridgePythonTypes(): + # python TO Obj-C + OC_PythonObject = lookUpClass('OC_PythonObject') + if BRIDGED_TYPES: + OC_PythonObject.depythonifyTable().extend(BRIDGED_TYPES) + if BRIDGED_STRUCTURES: + OC_PythonObject.pythonifyStructTable().update(BRIDGED_STRUCTURES) + +_bridgePythonTypes() diff --git a/objc/_category.py b/objc/_category.py new file mode 100755 index 0000000..19c8605 --- /dev/null +++ b/objc/_category.py @@ -0,0 +1,63 @@ +__all__ = ['classAddMethod', 'Category'] + +from _objc import selector, classAddMethods, objc_class + +def classAddMethod(cls, name, method): + """ + Add a single method to a class. 'name' is the ObjC selector + """ + if isinstance(method, selector): + sel = selector(method.callable, + selector=name, + signature=method.signature, + isClassMethod=method.isClassMethod) + else: + sel = selector(method, selector=name) + + return classAddMethods(cls, [sel]) + + +# +# Syntactic support for categories +# + +class _CategoryMeta(type): + """ + Meta class for categories. + """ + __slots__ = () + _IGNORENAMES = ('__module__', '__name__') + def _newSubclass(cls, name, bases, methods): + return type.__new__(cls, name, bases, methods) + _newSubclass = classmethod(_newSubclass) + + def __new__(cls, name, bases, methods): + if len(bases) != 1: + raise TypeError, "Cannot have multiple inheritance with Categories" + + c = bases[0].real_class + + if c.__name__ != name: + raise TypeError, "Category name must be same as class name" + + m = [ x[1] for x in methods.iteritems() if x[0] not in cls._IGNORENAMES ] + classAddMethods(c, m) + return c + +def Category(cls): + """ + Create a category on ``cls``. + + Usage: + class SomeClass (Category(SomeClass)): + def method(self): + pass + + ``SomeClass`` is an existing class that will be rebound to the same + value. The side-effect of this class definition is that the methods + in the class definition will be added to the existing class. + """ + if not isinstance(cls, objc_class): + raise TypeError, "Category can only be used on Objective-C classes" + retval = _CategoryMeta._newSubclass('Category', (), dict(real_class=cls)) + return retval diff --git a/objc/_compat.py b/objc/_compat.py new file mode 100755 index 0000000..85d0ae2 --- /dev/null +++ b/objc/_compat.py @@ -0,0 +1,58 @@ +__all__ = ['runtime', 'pluginBundle', 'registerPlugin'] + +class Runtime: + """ + Backward compatibility interface. + + This class provides (partial) support for the interface of + older versions of PyObjC. + """ + def __getattr__(self, name): + import warnings + warnings.warn("Deprecated: use objc.lookUpClass", + DeprecationWarning) + import objc + if name == '__objc_classes__': + return objc.getClassList() + elif name == '__kind__': + return 'python' + + try: + return objc.lookUpClass(name) + except objc.nosuchclass_error: + raise AttributeError, name + + def __eq__(self, other): + return self is other + + def __repr__(self): + return "objc.runtime" + +runtime = Runtime() + +_PLUGINS = {} +def registerPlugin(pluginName): + """ + Deprecated: use currentBundle() + + Register the current py2app plugin by name and return its bundle + """ + import os + import sys + path = os.path.dirname(os.path.dirname(os.environ['RESOURCEPATH'])) + if not isinstance(path, unicode): + path = unicode(path, sys.getfilesystemencoding()) + _PLUGINS[pluginName] = path + return pluginBundle(pluginName) + +def pluginBundle(pluginName): + """ + Deprecated: use currentBundle() + + Return the main bundle for the named plugin. This should be used + only after it has been registered with registerPlugin + """ + import warnings + warnings.warn("Deprecated: use currentBundle()", DeprecationWarning) + from Foundation import NSBundle + return NSBundle.bundleWithPath_(_PLUGINS[pluginName]) diff --git a/objc/_convenience.py b/objc/_convenience.py new file mode 100755 index 0000000..853a04c --- /dev/null +++ b/objc/_convenience.py @@ -0,0 +1,602 @@ +""" +This module implements a callback function that is used by the C code to +add Python special methods to Objective-C classes with a suitable interface. + +This module contains no user callable code. + +TODO: +- Add external interface: Framework specific modules may want to add to this. + +- These are candidates for implementation: + + >>> from Foundation import * + >>> set(dir(list)) - set(dir(NSMutableArray)) + set(['__delslice__', '__imul__', '__getslice__', '__setslice__', + '__iadd__', '__mul__', '__add__', '__rmul__']) + >>> set(dir(dict)) - set(dir(NSMutableDictionary)) + set(['__cmp__']) + +""" +from _objc import setClassExtender, selector, lookUpClass, currentBundle, repythonify, splitSignature +from itertools import imap + +__all__ = ['CONVENIENCE_METHODS', 'CLASS_METHODS'] + +CONVENIENCE_METHODS = {} +CLASS_METHODS = {} + +NSObject = lookUpClass('NSObject') + +HAS_KVO = NSObject.instancesRespondToSelector_('willChangeValueForKey:') + +def isNative(sel): + return not hasattr(sel, 'callable') + +def add_convenience_methods(super_class, name, type_dict): + try: + return _add_convenience_methods(super_class, name, type_dict) + except: + import traceback + traceback.print_exc() + raise + + +def _add_convenience_methods(super_class, name, type_dict): + """ + Add additional methods to the type-dict of subclass 'name' of + 'super_class'. + + CONVENIENCE_METHODS is a global variable containing a mapping from + an Objective-C selector to a Python method name and implementation. + + CLASS_METHODS is a global variable containing a mapping from + class name to a list of Python method names and implementation. + + Matching entries from both mappings are added to the 'type_dict'. + """ + if type_dict.get('__objc_python_subclass__'): + if 'bundleForClass' not in type_dict: + cb = currentBundle() + def bundleForClass(cls): + return cb + type_dict['bundleForClass'] = selector(bundleForClass, isClassMethod=True) + if (HAS_KVO and + '__useKVO__' not in type_dict and + isNative(type_dict.get('willChangeValueForKey_')) and + isNative(type_dict.get('didChangeValueForKey_'))): + useKVO = issubclass(super_class, NSObject) + type_dict['__useKVO__'] = useKVO + if '__bundle_hack__' in type_dict: + import warnings + warnings.warn( + "__bundle_hack__ is not necessary in PyObjC 1.3+ / py2app 0.1.8+", + DeprecationWarning) + + for k, sel in type_dict.items(): + if not isinstance(sel, selector): + continue + + if sel.selector == "alloc" or sel.selector == "allocWithZone:": + sel.isAlloc = 1 + + if sel.selector.endswith(':error:'): + sigParts = splitSignature(sel.signature) + if sigParts[-1] == '^@': + sigParts = sigParts[:-1] + ('o^@',) + sel.signature = ''.join(sigParts) + + if sel.selector in ( 'copy', 'copyWithZone:', + 'mutableCopy', 'mutableCopyWithZone:'): + # These methods transfer ownership to the caller, the runtime uses + # this information to adjust the reference count. + sel.doesDonateReference = 1 + + sel = sel.selector + + if sel in CONVENIENCE_METHODS: + v = CONVENIENCE_METHODS[sel] + for nm, value in v: + if nm in type_dict and isinstance(type_dict[nm], selector): + + # Clone attributes of already existing version + + t = type_dict[nm] + v = selector(value, selector=t.selector, + signature=t.signature, isClassMethod=t.isClassMethod) + v.isAlloc = t.isAlloc + + type_dict[nm] = v + else: + type_dict[nm] = value + + if name in CLASS_METHODS: + for nm, value in CLASS_METHODS[name]: + type_dict[nm] = value + +setClassExtender(add_convenience_methods) + +def __getitem__objectForKey_(self, key): + res = self.objectForKey_(container_wrap(key)) + return container_unwrap(res, KeyError, key) + +def has_key_objectForKey_(self, key): + res = self.objectForKey_(container_wrap(key)) + return res is not None + +def get_objectForKey_(self, key, dflt=None): + res = self.objectForKey_(container_wrap(key)) + if res is None: + res = dflt + return res + +CONVENIENCE_METHODS['objectForKey:'] = ( + ('__getitem__', __getitem__objectForKey_), + ('has_key', has_key_objectForKey_), + ('get', get_objectForKey_), + ('__contains__', has_key_objectForKey_), +) + +def __delitem__removeObjectForKey_(self, key): + self.removeObjectForKey_(container_wrap(key)) + +CONVENIENCE_METHODS['removeObjectForKey:'] = ( + ('__delitem__', __delitem__removeObjectForKey_), +) + +def update_setObject_forKey_(self, other): + # XXX - should this be more flexible? + for key, value in other.items(): + self[key] = value + +def setdefault_setObject_forKey_(self, key, dflt=None): + try: + return self[key] + except KeyError: + self[key] = dflt + return dflt + +def __setitem__setObject_forKey_(self, key, value): + self.setObject_forKey_(container_wrap(value), container_wrap(key)) + +def pop_setObject_forKey_(self, key, dflt=None): + try: + res = self[key] + except KeyError: + res = dflt + else: + del self[key] + return res + +def popitem_setObject_forKey_(self): + try: + k = self[iter(self).next()] + except StopIteration: + raise KeyError, "popitem on an empty %s" % (type(self).__name__,) + else: + return (k, self[k]) + +CONVENIENCE_METHODS['setObject:forKey:'] = ( + ('__setitem__', __setitem__setObject_forKey_), + ('update', update_setObject_forKey_), + ('setdefault', setdefault_setObject_forKey_), + ('pop', pop_setObject_forKey_), + ('popitem', popitem_setObject_forKey_), +) + + +CONVENIENCE_METHODS['count'] = ( + ('__len__', lambda self: self.count()), +) + +CONVENIENCE_METHODS['containsObject:'] = ( + ('__contains__', lambda self, elem: bool(self.containsObject_(container_wrap(elem)))), +) + +CONVENIENCE_METHODS['hash'] = ( + ('__hash__', lambda self: self.hash()), +) + +CONVENIENCE_METHODS['isEqualTo:'] = ( + ('__eq__', lambda self, other: bool(self.isEqualTo_(other))), +) + +CONVENIENCE_METHODS['isEqual:'] = ( + ('__eq__', lambda self, other: bool(self.isEqual_(other))), +) + +CONVENIENCE_METHODS['isGreaterThan:'] = ( + ('__gt__', lambda self, other: bool(self.isGreaterThan_(other))), +) + +CONVENIENCE_METHODS['isGreaterThanOrEqualTo:'] = ( + ('__ge__', lambda self, other: bool(self.isGreaterThanOrEqualTo_(other))), +) + +CONVENIENCE_METHODS['isLessThan:'] = ( + ('__lt__', lambda self, other: bool(self.isLessThan_(other))), +) + +CONVENIENCE_METHODS['isLessThanOrEqualTo:'] = ( + ('__le__', lambda self, other: bool(self.isLessThanOrEqualTo_(other))), +) + +CONVENIENCE_METHODS['isNotEqualTo:'] = ( + ('__ne__', lambda self, other: bool(self.isNotEqualTo_(other))), +) + +CONVENIENCE_METHODS['length'] = ( + ('__len__', lambda self: self.length()), +) + +CONVENIENCE_METHODS['addObject:'] = ( + ('append', lambda self, item: self.addObject_(container_wrap(item))), +) + +def reverse_exchangeObjectAtIndex_withObjectAtIndex_(self): + begin = 0 + end = len(self) - 1 + while begin < end: + self.exchangeObjectAtIndex_withObjectAtIndex_(begin, end) + begin += 1 + end -= 1 + +CONVENIENCE_METHODS['exchangeObjectAtIndex:withObjectAtIndex:'] = ( + ('reverse', reverse_exchangeObjectAtIndex_withObjectAtIndex_), +) + +def ensureArray(anArray): + if not isinstance(anArray, (NSArray, list, tuple)): + anArray = list(anArray) + return anArray + + +def extend_addObjectsFromArray_(self, anArray): + self.addObjectsFromArray_(ensureArray(anArray)) + +CONVENIENCE_METHODS['addObjectsFromArray:'] = ( + ('extend', extend_addObjectsFromArray_), +) + +def index_indexOfObject_(self, item): + from Foundation import NSNotFound + res = self.indexOfObject_(container_wrap(item)) + if res == NSNotFound: + raise ValueError, "%s.index(x): x not in list" % (type(self).__name__,) + return res + +CONVENIENCE_METHODS['indexOfObject:'] = ( + ('index', index_indexOfObject_), +) + +def insert_insertObject_atIndex_(self, idx, item): + idx = slice(idx, None, None).indices(len(self)).start + self.insertObject_atIndex_(container_wrap(item), idx) + +CONVENIENCE_METHODS['insertObject:atIndex:'] = ( + ( 'insert', insert_insertObject_atIndex_), +) + +def __getitem__objectAtIndex_(self, idx): + length = len(self) + if isinstance(idx, slice): + start, stop, step = idx.indices(length) + #if step == 1: + # m = getattr(self, 'subarrayWithRange_', None) + # if m is not None: + # return m((start, stop - start)) + return [self[i] for i in xrange(start, stop, step)] + if idx < 0: + idx += length + if idx < 0: + raise IndexError, "index out of range" + elif idx >= length: + raise IndexError, "index out of range" + return container_unwrap(self.objectAtIndex_(idx), RuntimeError) + +CONVENIENCE_METHODS['objectAtIndex:'] = ( + ('__getitem__', __getitem__objectAtIndex_), +) + +def __delitem__removeObjectAtIndex_(self, idx): + length = len(self) + if isinstance(idx, slice): + start, stop, step = idx.indices(length) + if step == 1: + if start > stop: + start, stop = stop, start + m = getattr(self, 'removeObjectsInRange_', None) + if m is not None: + m((start, stop - start)) + return + r = range(start, stop, step) + r.sort() + r.reverse() + for i in r: + self.removeObjectAtIndex_(i) + return + if idx < 0: + idx += length + if idx < 0: + raise IndexError, "index out of range" + elif idx >= length: + raise IndexError, "index out of range" + self.removeObjectAtIndex_(idx) + +def pop_removeObjectAtIndex_(self, idx=-1): + length = len(self) + if length <= 0: + raise IndexError("pop from empty list") + elif idx >= length or (idx + length) < 0: + raise IndexError("pop index out of range") + elif idx < 0: + idx += length + rval = self[idx] + self.removeObjectAtIndex_(idx) + return rval + +def remove_removeObjectAtIndex_(self, obj): + idx = self.index(obj) + self.removeObjectAtIndex_(idx) + +CONVENIENCE_METHODS['removeObjectAtIndex:'] = ( + ('remove', remove_removeObjectAtIndex_), + ('pop', pop_removeObjectAtIndex_), + ('__delitem__', __delitem__removeObjectAtIndex_), +) + +def __setitem__replaceObjectAtIndex_withObject_(self, idx, anObject): + length = len(self) + if isinstance(idx, slice): + start, stop, step = idx.indices(length) + if step == 1: + m = getattr(self, 'replaceObjectsInRange_withObjectsFromArray_', None) + if m is not None: + m((start, stop - start), ensureArray(anObject)) + return + # XXX - implement this.. + raise NotImplementedError + if idx < 0: + idx += length + if idx < 0: + raise IndexError, "index out of range" + elif idx >= length: + raise IndexError, "index out of range" + self.replaceObjectAtIndex_withObject_(idx, anObject) + +CONVENIENCE_METHODS['replaceObjectAtIndex:withObject:'] = ( + ('__setitem__', __setitem__replaceObjectAtIndex_withObject_), +) + +def enumeratorGenerator(anEnumerator): + while True: + yield container_unwrap(anEnumerator.nextObject(), StopIteration) + +def dictItems(aDict): + """ + NSDictionary.items() + """ + keys = aDict.allKeys() + return zip(keys, imap(aDict.__getitem__, keys)) + +CONVENIENCE_METHODS['allKeys'] = ( + ('keys', lambda self: self.allKeys()), + ('items', lambda self: dictItems(self)), +) + +CONVENIENCE_METHODS['allValues'] = ( + ('values', lambda self: self.allValues()), +) + +def itemsGenerator(aDict): + for key in aDict: + yield (key, aDict[key]) + +def __iter__objectEnumerator_keyEnumerator(self): + meth = getattr(self, 'keyEnumerator', None) + if meth is None: + meth = self.objectEnumerator + return iter(meth()) + +CONVENIENCE_METHODS['keyEnumerator'] = ( + ('__iter__', __iter__objectEnumerator_keyEnumerator), + ('iterkeys', lambda self: iter(self.keyEnumerator())), + ('iteritems', lambda self: itemsGenerator(self)), +) + +CONVENIENCE_METHODS['objectEnumerator'] = ( + ('__iter__', __iter__objectEnumerator_keyEnumerator), + ('itervalues', lambda self: iter(self.objectEnumerator())), +) + +CONVENIENCE_METHODS['reverseObjectEnumerator'] = ( + ('__reversed__', lambda self: iter(self.reverseObjectEnumerator())), +) + +CONVENIENCE_METHODS['removeAllObjects'] = ( + ('clear', lambda self: self.removeAllObjects()), +) + +CONVENIENCE_METHODS['dictionaryWithDictionary:'] = ( + ('copy', lambda self: type(self).dictionaryWithDictionary_(self)), +) + +CONVENIENCE_METHODS['nextObject'] = ( + ('__iter__', enumeratorGenerator), +) + +# +# NSNumber seems to be and abstract base-class that is implemented using +# NSCFNumber, a CoreFoundation 'proxy'. +# +NSNull = lookUpClass('NSNull') +NSArray = lookUpClass('NSArray') +null = NSNull.null() + +number_wrap = repythonify + +def container_wrap(v): + if v is None: + return null + return v + +def container_unwrap(v, exc_type, *exc_args): + if v is None: + raise exc_type(*exc_args) + elif v is null: + return None + return v + +# +# Special wrappers for a number of varargs functions (constructors) +# + +def initWithObjects_(self, *args): + if args[-1] is not None: + raise ValueError, "Need None as the last argument" + return self.initWithArray_(args[:-1]) + +CONVENIENCE_METHODS['initWithObjects:'] = ( + ('initWithObjects_', initWithObjects_), +) + +def arrayWithObjects_(self, *args): + if args[-1] is not None: + raise ValueError, "Need None as the last argument" + return self.arrayWithArray_(args[:-1]) + +CONVENIENCE_METHODS['arrayWithObjects:'] = ( + ('arrayWithObjects_', selector(arrayWithObjects_, signature='@@:@', isClassMethod=1)), +) + + +def setWithObjects_(self, *args): + if args[-1] is not None: + raise ValueError, "Need None as the last argument" + return self.setWithArray_(args[:-1]) + +CONVENIENCE_METHODS['setWithObjects:'] = ( + ('setWithObjects_', selector(setWithObjects_, signature='@@:@', isClassMethod=1)), +) + +def setWithObjects_count_(self, args, count): + return self.setWithArray_(args[:count]) + +CONVENIENCE_METHODS['setWithObjects:count:'] = ( + ('setWithObjects_count_', selector(setWithObjects_count_, signature='@@:^@i', isClassMethod=1)), +) + +def splitObjectsAndKeys(values): + if values[-1] is not None: + raise ValueError, "Need None as the last argument" + if len(values) % 2 != 1: + raise ValueError, "Odd number of arguments" + + objects = [] + keys = [] + for i in range(0, len(values)-1, 2): + objects.append(container_wrap(values[i])) + keys.append(container_wrap(values[i+1])) + return objects, keys + +def dictionaryWithObjectsAndKeys_(self, *values): + objects, keys = splitObjectsAndKeys(values) + return self.dictionaryWithObjects_forKeys_(objects, keys) + +CONVENIENCE_METHODS['dictionaryWithObjectsAndKeys:'] = ( + ('dictionaryWithObjectsAndKeys_', + selector(dictionaryWithObjectsAndKeys_, signature='@@:@',isClassMethod=1)), +) + +def fromkeys_dictionaryWithObjects_forKeys_(cls, keys, values=None): + if not isinstance(keys, (list, tuple)): + keys = list(keys) + if values is None: + values = (None,) * len(keys) + elif not isinstance(values, (list, tuple)): + values = list(values) + return cls.dictionaryWithObjects_forKeys_(values, keys) + +CONVENIENCE_METHODS['dictionaryWithObjects:forKeys:'] = ( + ('fromkeys', + classmethod(fromkeys_dictionaryWithObjects_forKeys_)), +) + +def initWithObjectsAndKeys_(self, *values): + objects, keys = splitObjectsAndKeys(values) + return self.initWithObjects_forKeys_(objects, keys) + +CONVENIENCE_METHODS['initWithObjectsAndKeys:'] = ( + ( 'initWithObjectsAndKeys_', initWithObjectsAndKeys_ ), +) + +def sort(self, cmpfunc=cmp): + def doCmp(a, b, cmpfunc): + return cmpfunc(a, b) + + self.sortUsingFunction_context_(doCmp, cmpfunc) + +CONVENIENCE_METHODS['sortUsingFunction:context:'] = ( + ('sort', sort), +) + +CONVENIENCE_METHODS['hasPrefix:'] = ( + ('startswith', lambda self, pfx: self.hasPrefix_(pfx)), +) + +CONVENIENCE_METHODS['hasSuffix:'] = ( + ('endswith', lambda self, pfx: self.hasSuffix_(pfx)), +) + +CLASS_METHODS['NSNull'] = ( + ('__nonzero__', lambda self: False ), +) + +NSDecimalNumber = lookUpClass('NSDecimalNumber') +def _makeD(v): + if isinstance(v, NSDecimalNumber): + return v + return NSDecimalNumber.decimalNumberWithDecimal_(v) + +CLASS_METHODS['NSDecimalNumber'] = ( + ('__add__', lambda self, other: _makeD(self.decimalValue() + other)), + ('__radd__', lambda self, other: _makeD(other + self.decimalValue())), + ('__sub__', lambda self, other: _makeD(self.decimalValue() - other)), + ('__rsub__', lambda self, other: _makeD(other - self.decimalValue())), + ('__mul__', lambda self, other: _makeD(self.decimalValue() * other)), + ('__rmul__', lambda self, other: _makeD(other * self.decimalValue())), + ('__div__', lambda self, other: _makeD(self.decimalValue() / other)), + ('__rdiv__', lambda self, other: _makeD(other / self.decimalValue())), + ('__mod__', lambda self, other: _makeD(self.decimalValue() % other)), + ('__rmod__', lambda self, other: _makeD(other % self.decimalValue())), + ('__neg__', lambda self: _makeD(-(self.decimalValue()))), + ('__pos__', lambda self: _makeD(+(self.decimalValue()))), + ('__abs__', lambda self: _makeD(abs(self.decimalValue()))), +) + +def NSData__getslice__(self, i, j): + return self.bytes()[i:j] + +def NSData__getitem__(self, item): + buff = self.bytes() + try: + return buff[item] + except TypeError: + return buff[:][item] + +CLASS_METHODS['NSData'] = ( + ('__str__', lambda self: self.bytes()[:]), + ('__getitem__', NSData__getitem__), + ('__getslice__', NSData__getslice__), +) + +def NSMutableData__setslice__(self, i, j, sequence): + # XXX - could use replaceBytes:inRange:, etc. + self.mutableBytes()[i:j] = sequence + +def NSMutableData__setitem__(self, item, value): + self.mutableBytes()[item] = value + +CLASS_METHODS['NSMutableData'] = ( + ('__setslice__', NSMutableData__setslice__), + ('__setitem__', NSMutableData__setitem__), +) diff --git a/objc/_descriptors.py b/objc/_descriptors.py new file mode 100755 index 0000000..6f8b6eb --- /dev/null +++ b/objc/_descriptors.py @@ -0,0 +1,98 @@ +""" +Python <-> Objective-C bridge (PyObjC) + +This module defines the core interfaces of the Python<->Objective-C bridge. +""" + +__all__ = ['IBOutlet', 'IBAction', 'accessor', 'Accessor', 'typedAccessor'] + +from _objc import ivar, selector + +# +# Interface builder support. +# +def IBOutlet(name): + """ + Create an instance variable that can be used as an outlet in + Interface Builder. + """ + return ivar(name, isOutlet=1) + +def IBAction(func): + """ + Return an Objective-C method object that can be used as an action + in Interface Builder. + """ + return selector(func, signature="v@:@") + +def accessor(func, typeSignature='@'): + """ + Return an Objective-C method object that is conformant with key-value coding + and key-value observing. + """ + + from inspect import getargspec + args, varargs, varkw, defaults = getargspec(func) + funcName = func.__name__ + maxArgs = len(args) + minArgs = maxArgs - len(defaults or ()) + # implicit self + selArgs = 1 + funcName.count('_') + if varargs is not None or varkw is not None: + raise TypeError('%s can not be an accessor because it accepts varargs or varkw' % (funcName,)) + + if not (minArgs <= selArgs <= maxArgs): + if selArgs == 3 and (minArgs <= 2 <= maxArgs) and funcName.startswith('validate') and funcName.endswith('_error_'): + return selector(func, signature='c@:N^@o^@') + elif minArgs == maxArgs: + raise TypeError('%s expected to take %d args, but must accept %d from Objective-C (implicit self plus count of underscores)' % (funcName, maxArgs, selArgs)) + else: + raise TypeError('%s expected to take between %d and %d args, but must accept %d from Objective-C (implicit self plus count of underscores)' % (funcName, minArgs, maxArgs, selArgs)) + + if selArgs == 3: + if funcName.startswith('insertObject_in') and funcName.endswith('AtIndex_'): + return selector(func, signature='v@:@i') + elif funcName.startswith('replaceObjectIn') and funcName.endswith('AtIndex_withObject_'): + return selector(func, signature='v@:i@') + + # pass through to "too many arguments" + + elif selArgs == 2: + if funcName.startswith('objectIn') and funcName.endswith('AtIndex_'): + return selector(func, signature='@@:i') + elif funcName.startswith('removeObjectFrom') and funcName.endswith('AtIndex_'): + return selector(func, signature='v@:i') + elif funcName.startswith('get') and funcName.endswith('_range_'): + return selector(func, signature='@@:{_NSRange=ii}') + + return selector(func, signature="v@:" + typeSignature) + + elif selArgs == 1: + if typeSignature == '@' and func.func_name.startswith('countOf'): + typeSignature = 'i' + + return selector(func, signature=typeSignature + "@:") + + raise TypeError("%s takes too many arguments to be an accessor" % (funcName,)) + +def typedAccessor(typeSignature): + """ + Python 2.4 decorator for creating a typed accessor, usage: + + @typedAccessor('i') + def someIntegerAccessor(self): + return self.someInteger + + @typedAccessor('i') + def setSomeIntegerAccessor_(self, anInteger): + self.someInteger = anInteger + """ + def _typedAccessor(func): + return accessor(func, typeSignature) + return _typedAccessor + +def Accessor(func): + import warnings + warnings.warn( + "Use objc.accessor instead of objc.Accessor", DeprecationWarning) + return accessor(func) diff --git a/objc/_dyld.py b/objc/_dyld.py new file mode 100755 index 0000000..9a698d8 --- /dev/null +++ b/objc/_dyld.py @@ -0,0 +1,129 @@ +""" +dyld emulation +""" + +__all__ = [ + 'dyld_framework', 'dyld_library', 'dyld_find', 'pathForFramework', + 'infoForFramework', +] + +import os +from _framework import infoForFramework + +# These are the defaults as per man dyld(1) +# +DEFAULT_FRAMEWORK_FALLBACK = u':'.join([ + os.path.expanduser(u"~/Library/Frameworks"), + u"/Library/Frameworks", + u"/Network/Library/Frameworks", + u"/System/Library/Frameworks", +]) + +DEFAULT_LIBRARY_FALLBACK = u':'.join([ + os.path.expanduser(u"~/lib"), + u"/usr/local/lib", + u"/lib", + u"/usr/lib", +]) + +def ensure_unicode(s): + """Not all of PyObjC understands unicode paths very well yet""" + if isinstance(s, str): + return unicode(s, 'utf8') + return s + +def injectSuffixes(iterator): + suffix = ensure_unicode(os.environ.get('DYLD_IMAGE_SUFFIX', None)) + if suffix is None: + return iterator + def _inject(iterator=iterator,suffix=suffix): + for path in iterator: + if path.endswith(u'.dylib'): + yield path[:-6] + suffix + u'.dylib' + else: + yield path + suffix + yield path + return _inject() + +def dyld_framework(filename, framework_name, version=None): + """Find a framework using dyld semantics""" + filename = ensure_unicode(filename) + framework_name = ensure_unicode(framework_name) + version = ensure_unicode(version) + + def _search(): + spath = ensure_unicode(os.environ.get('DYLD_FRAMEWORK_PATH', None)) + if spath is not None: + for path in spath.split(u':'): + if version: + yield os.path.join( + path, framework_name + u'.framework', + u'Versions', version, framework_name + ) + else: + yield os.path.join( + path, framework_name + u'.framework', framework_name + ) + yield filename + spath = ensure_unicode(os.environ.get( + 'DYLD_FALLBACK_FRAMEWORK_PATH', DEFAULT_FRAMEWORK_FALLBACK + )) + for path in spath.split(u':'): + if version: + yield os.path.join( + path, framework_name + u'.framework', u'Versions', + version, framework_name + ) + else: + yield os.path.join( + path, framework_name + u'.framework', framework_name + ) + + + for f in injectSuffixes(_search()): + if os.path.exists(f): + return f + # raise .. + raise ValueError, "Framework %s could not be found" % (framework_name,) + +def dyld_library(filename, libname): + """Find a dylib using dyld semantics""" + filename = ensure_unicode(filename) + libname = ensure_unicode(libname) + def _search(): + spath = ensure_unicode(os.environ.get('DYLD_LIBRARY_PATH', None)) + if spath is not None: + for path in spath.split(u':'): + yield os.path.join(path, libname) + yield filename + spath = ensure_unicode(os.environ.get( + 'DYLD_FALLBACK_LIBRARY_PATH', DEFAULT_LIBRARY_FALLBACK + )) + for path in spath.split(u':'): + yield os.path.join(path, libname) + for f in injectSuffixes(_search()): + if os.path.exists(f): + return f + raise ValueError, "dylib %s could not be found" % (filename,) + +def dyld_find(filename): + """Generic way to locate a dyld framework or dyld""" + # if they passed in a framework directory, not a mach-o file + # then go ahead and look where one would expect to find the mach-o + filename = ensure_unicode(filename) + if os.path.isdir(filename): + filename = os.path.join( + filename, + os.path.basename(filename)[:-len(os.path.splitext(filename)[-1])] + ) + filename = os.path.realpath(filename) + res = infoForFramework(filename) + if res: + framework_loc, framework_name, version = res + return dyld_framework(filename, framework_name, version) + else: + return dyld_library(filename, os.path.basename(filename)) + +def pathForFramework(path): + fpath, name, version = infoForFramework(dyld_find(path)) + return os.path.join(fpath, name + u'.framework') diff --git a/objc/_framework.py b/objc/_framework.py new file mode 100755 index 0000000..d87cce6 --- /dev/null +++ b/objc/_framework.py @@ -0,0 +1,24 @@ +""" +Generic framework path manipulation +""" + +__all__ = ['infoForFramework'] + +# This regexp should find: +# \1 - framework location +# \2 - framework name +# \3 - framework version (optional) +# +FRAMEWORK_RE_STR = ur"""(^.*)(?:^|/)(\w+).framework(?:/(?:Versions/([^/]+)/)?\2)?$""" +FRAMEWORK_RE = None + +def infoForFramework(filename): + """returns (location, name, version) or None""" + global FRAMEWORK_RE + if FRAMEWORK_RE is None: + import re + FRAMEWORK_RE = re.compile(FRAMEWORK_RE_STR) + is_framework = FRAMEWORK_RE.findall(filename) + if not is_framework: + return None + return is_framework[-1] diff --git a/objc/_functions.py b/objc/_functions.py new file mode 100755 index 0000000..1d1bf8b --- /dev/null +++ b/objc/_functions.py @@ -0,0 +1,44 @@ +__all__ = ['inject', 'signature'] + +import os +import sys + +def _ensure_path(p): + p = os.path.realpath(p) + if isinstance(p, unicode): + p = p.encode(sys.getfilesystemencoding()) + return p + +def inject(pid, bundle, useMainThread=True): + """Loads the given MH_BUNDLE in the target process identified by pid""" + try: + from _objc import _inject + from _dyld import dyld_find + except ImportError: + raise NotImplementedError("objc.inject is only supported on Mac OS X 10.3 and later") + bundlePath = bundle + systemPath = dyld_find('/usr/lib/libSystem.dylib') + carbonPath = dyld_find('/System/Library/Frameworks/Carbon.framework/Carbon') + paths = map(_ensure_path, (bundlePath, systemPath, carbonPath)) + return _inject( + pid, + useMainThread, + *paths + ) + +def signature(signature, **kw): + """ + A Python method decorator that allows easy specification + of Objective-C selectors. + + Usage:: + + @objc.signature('i@:if') + def methodWithX_andY_(self, x, y): + return 0 + """ + from _objc import selector + kw['signature'] = signature + def makeSignature(func): + return selector(func, **kw) + return makeSignature diff --git a/objc/_gnustep.py b/objc/_gnustep.py new file mode 100755 index 0000000..4184d75 --- /dev/null +++ b/objc/_gnustep.py @@ -0,0 +1,13 @@ +__all__ = ['pathForFramework', 'infoForFramework'] +# +# TODO - I have no idea what the semantics are for GNUStep .. +# +from _framework import infoForFramework + +def ensure_unicode(s): + if isinstance(s, str): + return unicode(s) + return s + +def pathForFramework(path): + return ensure_unicode(path) diff --git a/objc/_objc.so b/objc/_objc.so new file mode 100755 index 0000000000000000000000000000000000000000..518c8e8630d774d16f5a24dddf3aa0de03548544 GIT binary patch literal 964424 zcmeFa4R}@6nKr!kIVTWmXoH3^XwZP@gqQHwVrS* zPjYsW!#B{unILFElQbZ-P;mw;PEjES1PfEJ(1L=3f2R1A-)PGiJ=X zzvjL`v+pafG8K^SFkY#|n^fVEPp>K^ z{~x6d@VMvh`(s2+0HYQ)dI1KX(Y9T%fcxyq8Q;IJeC}+On*fFlmRAA>o-r6e?g~{y z{+}{YI%7s*pd{eRm2yywSCk7pl`OC?l9n@ORFv10Gh6*jTz~v-RX^6Y5HWH9#{8-Z z2Lk0R4hQd5yYV(zsAmr}s4AbK<*K^ozCgfz|)O~LD}BP)@RJP8$zjMGck<6 zI}18C3ooB;7~l`{C5&0$cMDeczNCjyc7yQp>4xE^N4!kL)8m>ksGBal^68?78^+B0 z?)r`nE=Lqh|N*Jz_Ta5KrYH5AR1727(+l)!r-$f7%}-u+?Sh{0mc~N<+CRk zG5Jai$6CMs~WwLq8MZL3)(mJ!`fC(*un4!Yg6)fXCc>D&|$q zo-ya{@85$q62RCFzQ7J=CSeSUwZtf%mk9=8PFd6K|h1p>QH= z@Sk@SMoyS}`TS=KIUGYAyXixkcCie9=>zgzec%1axqsw%*LwiPKf*7?pM)=L zq|k#)z#m_J-^|3Y10&TtfWSY(Mdvi!=}4hhBj??J-^i*tGx;~Sc0^zVhU+;q@lKT= zgQvoS7{!%WT^>>3szX|1?D}q|5L2!ez03BC-ruP~9(|Ew{NdlXzpDPkK_N=uw;Fv_ zeuDq^o(6gwXGQO+#3NVoL?jg^DEUR!7Zmt{0$)(z3krNefiEcV1qHsKz!wzwf&yPq z;0p?TL4p74C=g8c{H)-oBB^en=V!rW@6YP&S+!#ky=hqdv9E5C_h-Qrum1g?=IypG zGg`hHVe`+n`imiDoMInBd z>35Tx%Y}(LPa|)-EaUn1jruuO;?X9u8XCM6c7rf&)FXY+=Rv``YirGNQD}K4KZ_tu z8q<00#BcHr%Lq+D+3A400`C?Q9@|Cx0koGd+cqxTi?rYN3c=r?mESTh?9=!R0zRb* zk8eGqpHFFgGKmY?%ST%STzCwR!(*&v)b9ZvrNE=#$W}?ybktd+>64=9C{iSRBY&4U z$ZOl+*$d<&DG==L*W{QTxb-B!7)-Fav?N%66GqUvYQmt8lKqk_Em9K4DXTjg@I{Sk&px+YB*Rq(-ogWk9={Ngz z=jr(@Gh8`J@${QdYo7XJJUws5czXLj3BOHfo*ulBJXLy<+&9M4*H*@8di%u~PrrGu zqUkpmX_{Vwr?)4?XnXqr%Xn~|;_2=0BEQDIP9zhS;^(w$AJ_+)7Ac!|+i>JpDO%pPQa_)Qc(jRZ=xB|$!PQY4TqbRBk>r)9i1v@VT4Z^O z0+umGR|1a}_>=YBdI}qxpC7__IP3dCvqAWQKWzV)-l+|3|FG7S<6F^$za5_a?&aXX zK1A_F+TR9z?*P8a=61o?X1_g?`j~@6nWQ0U7C(lSM@|PH*R~Gy1l^NK(`ADq&8YiO zjGng+>Pk=h<`_N49Qxb)A9}YtJ#YQ!bHHo89C}jbLbKnfHD}E#4Xvg>R56zQqOaD4 z&XkKD=sdD55`o-kISUO`bf35cbg!0lCyg(Q?zi@j(cN0tmG1Rhh@aAx@}tm|e8{Pg z`fhx0_TNso`q|z2FmdkZfY<+T<3ssT#fO>Cem*|bJ)-zvQT}`8gSI2mhwEZXtR*oX z{Ns&Xc~F-V<3U+zR~}3|_P5h4c&s}Q{_)i3fVbpwc)&h&k@>%BTfXtsC2b36OS;mg zz@BWtxai5-HbeUMmggJ&F#dY;UxX~b1-l$RzrkGd!3Fc>i)of;)Q)V-0sM_(vm75i z6HdgHU2m>Ad(eFO(-xFnq02Vwvd_hpU2Cp6S8Klf3CqsaWtAW0neY&B67Uh}3wZNZ z{dq&)qK`{~%j(dY|EUfAKkw9{PL8fKO2eOqJ{ME3SqEj?S(f_E@-LvzsN-|W@OQlK zcLX9kgH77zu2wb|{)mCOgFin4n!F|H;<5kxy`yG8l$bC7{Ghq!&eb`FuyO{8qMU#z z22D$v1GMko*rogm-$Kh%coE}vCC2MoHBL{MtDkcIhq0oPINu`iKDYjs7lA*<{HB(V zi<`EbTMJlYgR?Q8;n+r7==sKQ`ZB?aYisR-_l_$+XTtelt@JT4mXGIL3grrSj9d`5U*rcbMtMQ}3M&9r&=evEaR( zq2GU4o97oIuS|$>Y#*>fO&d7JPOIPk4Eix%&VTSb)t-Vee$~Md=ub-U+pniJ!H?j) zJk+#_<*oYTFR=V@=?8VdkHFX<@xBi_6u$Gcy$$sz{2pZ{Eb6XflmyEQ@bEC5> zKWF$AKMVFHfR~Rv>0324igd?k)qe9%z$}yFT7xJxXWele{V%nQk|p*^F`e>gZxt26 z;I){?RpkZ9^Kex&e9M=R36taLI>W6otaj1L!trgZZ@_M$OpWW`AItjaHnJ=$8Yp$8L9=cHCvU`@YdjUN^_HMU4e#RBbVs_6zPuU#*LsHhe z*u4)oYP(m`)bdej)0Pi6Sf0Ryu68eQGi6%Yy;G-^JO>PI_n=eb4k){K%bqy9SEkw> zcfc~LX6y7iZPzkldUEQl8J@OL!=0nvdoIN6-gnW4f1k2@p5v^i?B1#4F}pYJ>87aN z^Vlq-?A|F^zVXzlGs^Cr+WXh--niMM(`UDP_$=)U1z6z^k>eX{9LlNLQP7iyGfLgv+LV7xR~K zw{@3iBMmsz!lsofn>Owg_{_PWA98DHo0i#?SKrlR)YyyN;fd{lmj!z<-7>y;0``fp z#v~}$g1nw=pY%Tf1HQ+HtD7+Y2kuXY7Q9nS8PsxAu5Hlgv3Ut?g_1wS1G?MDgyp;1 zjEfr+^fjRkRyO0*!OvndC#UW9idO>J)57rup(T zVICDrK*v62StJ4;rC1(+9sBC|W=(+W*r*q`M$S>+oHo0(w@Qq1wO1NzuXMX=uk^I} za_M5Uw+ij#Ls#LK=V$P;cW?e;j4)c_tDOn;Zn%h*xNYAf!v#vd+2{n!ysXXjv)5Y z2XTNq#R$elkY8lO*R&DSts5sskblv!6lw4yo9|hdWg6z79O?$^OGntZ3ZHu%V>$Xf z4TAxH;KUJ2w|Yx0;W-O?+5+5eMht0wv*E1@Ga&ich)-9tPrw=SFzz9=9S)Aa3S)eroOpp|`M@zBFe^fh>B8S)tY)3yq^oM1 z16aSnxrl~x?{t=F7$#Cm3Q}`JtE>@RO9-?X(zK>ak$t7_7c^ag&Vb%VjHMUqzsiL3Lj zZdgKoZRC50U#u^ARsf#emD-JG=riy$8E5u`E_#g1>8I>cj`B|tk0ea=34Z8%*$!U8 znPP=@~cLeh}}(2X_P?pwE2f zIgU-xpO(<9HxTE#ZYycQaTGMDHNz#_)%;-Wd}%*0K3m516Gpa4T4JqFW-=O`kj}7@= zl530)9~0J6xz>2|P}p-BBYvK=a@oU)&hdh{v zJqdd5!not});4by{-s;Fo;YS#@Q0Fa2hn~V^|5Ij)+Zm?34IrxP18jB$j2m&IzgNE z>!Hu2D|I^b+Usfb+n~o2q;A8$HgPTG;D!;TE9zHB9{lLw2$V-#c>|RV5Mz|R&wrP{ zgSAhOfIN>uS#SMI&(zxCQyIWziR82KPfwv;?Gs>a>rV6m_#iKt&%7TS-&OX;Xog)4M3AH;?7~Ei@kUVq@UbTF26s9s)h3e2uvScpnW_P(Cx0 zC}&bOKVy7e*wMQ7xi4>{7EZ<#! zdyM-koWHgXIA_Cd1@!L~lu;Q|hO9tN^OpuF!(VM^o-ch5Mb9`{b;fST?;t*0OC~L8 zcS%d>GlQO#SBynfSZ6M67%Ie)L9lV4?-Gnz&Dfm}J6Q$!&0jKz?S5^JveRE{&@z~1 zH+U;4JN8O%h2Dl1Ku*wvk+}mz{Ui0-gMYfKkAny@Ey{TM>}2C&=`veK)&Bscz<;w_B9kT zO*(*%IXZudey-E~8UtLXGY&#Mv1gq$?N!k0@EouU) z|L!|YnWJq@dbK0-UvQOduXIfUk9-RyYcn>n6EQxfTLerACqH^I5&@U1j&i8-8&*p_H8rp`WfPHvu?LxqjK0U+GV@ob<+&r-md29qYU7W z`8UVG(I1(%Fr1hH>NxYhblIK|o7G$j_88+I#|Pk(DrLZU{gLJeVDEqj<4a~c@f(%I z@*Jn5el>oB20f0Imt&_A&^E)NZ9H9J@5^YP;a?@cK)G;@r<4=ge8)z?K2=BU6KoRu zL^}n$w7z+(ccTqkMSGxa)O2m5N-fWb14}F%r%GLTaMK64Z|;W54HyH zjwAmz`8#~h;t0Qu5UNG=s8;`s>YE|2Ragf&Jst(6!nG z{#L^IwI2Vn6UauwnBvICWlS>@^1MKf$)4;Zly60ow=q_Z7_ReoPla;{ zkCT&*^2lztoanKvSo#H!56Xoe!zv*s`?Y*jP(HwK6XRGJc-{}T2XR>J88G@UaK@29 zV>0}y?EV-FEX+mpez5EXN}jS?^;j@O_CfObE%15xZ0R4DV|~IiYykQ)3bMoWaM~dF zLXfdx#|T69{jHOzGn#gwY4BS|70-upelk5Y1b(P-^&Ijp&?vH`4aB;D-T12B`_miq z%3*TYNjd&*H0d4;!#>6h;4e_)M?|$e)CFoQH{a_!4a;#;4AUmMj|3d$I zos{%24j|ppKzV3*Cm5duhkgR zWO&P9>pXcs66sAZz(-*WnYPt15p#`1Fc(fWXK}n9F(>qm-%Gkm9SXm7m~pqz4(iUZ zJqriI?up(t@G0(wjT{namGk4UU$cj*X#y zs<9yZl(ZWyB9n2k(4%`1NB{JUe)o{}acRe6F%xOqlQI!|;2K0+K6sK~U4nW**(2S| zt-?Pka&Ch3k74(sV+Q@@9`@%0nr6Z?kzWw7@$1_WEYdf|0Z zp8OE+=hQuH3ihRKE=)R1CJQZpivR3&GS*P^xcFU7>1hSQ4 zzATIa5vf!(df}t)GT@>A;G+z={Y}WrYH4qR(%xXslu25`PT#af`&=1H?uJfrSnzgQUK#A=V39KJMd8Kzvv*twdk%gD89gHB={?D4jY~!=?MIaT zq;B7jjWM$eez)RD4J9OT&@IN+yugTBD-{|6}8j+)J|AT%i{0+{d3*mz(KlLv7 zAoN8%pxp$KLZ5?vi1a@&&bj>8Qp+>sMrD77$n`1M$WFP2IB;JX^j^RQ*tfi;_Eku~ zv;N>Yd(CT`?3ULs#~Y%?hYnHfdbdHp+au+au^q^S&3dQhNe)))t0ls+1K z!>CVzG-V39Ed4w8cw~RqRSs!c?zU4}3;nNAITuZ->0Ac$+!lv-5V4 zitjo4)`ho&q(g53DuA5>mVoFKYL#?pXymoGnf2zInA8= z`Q@A*Q@?Jyr4b2Y(2YvPIR7%alt)K zaEwT_z9MxDaaVi5Z}K@$rH$uU(NuuN-5Hn@A_m%o@uR76-!jO2Gx;fLQvbXCT(h@Z z_cdFd>)zLW=bA5U`|tMKYxXVH?+)m9`O$Z%qwM~^h0SOe^`F+f%aV22BII@oa6uPYinBCUbzWLIEa za~S$O6Mv2P&DbgSu-R{m)TJx29%?X_eEkvn{mu2i@k_e{U&Hcb_Tm1>0AlF09l))a z@GOkD=!#K5OR9k5}`kJ7G$ zr3}KKM15P$#Re|XWrHZYAg@Un{OxLYH}dC_AG#cH9e4+QCjORfhxf_z7pnb%fw=ZZ z!)_U{Tio9fWF7jOuJ+~rRs3fAN&oN!=-w!%cgG>)6ye8k$T-w94jEgz;*jwacrVbt zoKvvhXs=rNy%|gRTf?ogJQ*s!&-qjcxPrd+tl#*7+bPNwWf*>Agm$Xboa~yLEpgpZ=}&qFEK+)AU~T`vXv&2p z_7B&(w->m0$dkNnIUCeCn=uV#=7-9}O@8PI^mL*eZ{_~T%vR{Y{E!`eH#}5pWI`^i zsV$k~Le2d$r?wm&7ihaqp6Ovd=!FL`ZbWDf|UZ~adIAMu_d%OAT9f&{caX%iH1To1T*MQk3X^l2FgU30f zv7&v(+)!&ey-K=+-x(4`KEBZs{~GlzE%D?OwXTwp&G~LlzDSnsVcj&NK%_KhKu^sxF4XtUFtaabj>15T(hy^8k9$zGxT$eS+L98 zPmVddnUg6*jvu%iy$4GAw_LN3?`1s6bInss)BXZ}nWT?rzzV?IpyCz-9ts_lItl1>gZ@b}F7n@z;sJb|G#Pz+J#bgH}rh`7memmEf-k=|W2k$dWM#+wOank1NK$~dHxBm)72T#%E*bvYj+u8ndR0T?X83ZCK&D!aT9%<4H5P2o&h12ee9?9* z4{fkssHvGYDXqS6Dd1i;QR_`AWG^N3LaI6wFx`D7pq=Hd`tTDhKS0q5u{E?o{9td> zf#dS}9nWZc+kam7xlno-GLVH>8uq77bk5q1NlY>EKixHlLmE8a*fV^w{Bn4f`>Nhs{>TQ##MdThi*fOUeNp`G_mq+?>3@;WRWUib zYOIVuI4xuo8QXv80UH@ul5}cm>~B6trRIaN2MLwY#B*g zg7;vohrYp9TYwuR|uWN*&Uy0 ziT;ZzBYEwRzg64ID1UkX2ETinNSV40`wDkqFCO*}g__nXd0Y*ZMVJxU-L>8|G>J7>s_UK*YCW9jktL99qP~?pngR& z;9H)4YW{r+n&i**RcIa5qHY>#(m0FDir zFNPh<306xVU<_dr9_z9mVX;n$=o}Zk(#R|k{&8$W$2o2jO$P3c!2kS z*>4Bl6$jHXmNejA4nNvOIaSY_;n>24ZQCoD->`0baW2Z_m7yY%kI459!kHU-awgmZz_hk2X=oeXeSK zIaT^s{Z%^V0e~3|z4fp+fC1tEP^Q z3N=;osoE^qUKrP2h2=@n{Wr2zT+A4;lbv6YzyiEc9x^>4qU)QeD5opScdJfTy~m-kyYOW-#|oe8%`hdZupnK5E+zV;)8k< zP|qejN#jSMckm}sKR?j+rPU*@LVq6?2f=TwALUlcF-f$^bK!x;uW(O`_TA}2Hy)5{ zaP%w1Pgjh59PPLD-3j16+R>ch&^fFFM*Zf#!e?i|Z-)Q=FnnhGY5%?768iG=-$OTI z-LPfP@p^AltqB@h#wP9aeR(_m8_Ja#{_1hHrhmnAm&053DR*05m6{v09#G?b-}G3Y z{*a13anG4rgBNW(RG+?VIep4QpK?KOcb^E)&UnQidJg^Cf_`m5zXotVkoug{FX@l9 zyyB1b>sQ*pOj#c5S6+?k*O!j{4gFfE`qjd?I&5QK*F5XL5zA~C8tYf4UZhXH{QT z>`-vOG(E%iso zN%dv8I4>wll>OY|YDdmpZd*Z-_oAAYIzzxU2qAM(?5A1+J(bsuil zeb^oALvVJC4=aW$KJ+fVL?4QEAChU8l}*0l#yCC{yZX>aw^{1yLze18QiAiHJZE}%`19-lQclTGo$ai&2M}kX`g3^dwv5yMb2|vbDLxr zPMF&m?OOh|oqbfxf3M`I{I9yOzn=3z@qkPIf1>5T_ZWxn^yA61xbdS}(!LerA$)H| z`#$U9XkQ(p{f37W?UNR|XrHfW@7;I#I`GIx3SO_p?1QpR58N1&pGQwA`AJH5`jMay zmAVhf=!2G@Oc}3D-lO7j%Z?}l2NgD~niG9+C z`#Z#7>FdB}qaUYu+k4Ma@LBqBT)TSomBJWZ{{3myrgwdeF1e!=U5t+|hc3?C(!bJ^ zLI0U^NA9`9T)?u+eT6EHmeiou34NB_Zy@LENe^LPF2*WfDd}d?-|sMB=Lf|#(kI89Pp(&Je7nyn zjYxm3{}<4%GpEe7SExB<-S6+meA(NNYYp{SYe4%M(Ra_>g?CBMI`8bO5U<93Aom%O zT;j?6dI`cG^>%7;=)fxU5A#j#359>oxoXpMBBf~sY4HcCQ?NY(u~#4dlF>$%QL=!Uwahl-gSwnInQ&$Nd@Q@&U4Je%xqlctFK z;t6{BIgbz7h^4k(yZ}B#<1O;8HN;y0BSW42!MnIvX6PRgtMBc!i?!w6DpsGj0e6pr z7l3EhU)NO2bt1;yDc77U*ZuK9*v3D}wR8VwF~o_VKo$!**J7+k&*4h2zLEkwi)37+ zQKZ(bzDvRZZ~6y*tj=rHZI`@C3j8b1Jx-=v>$~ERmiSK=KE~AI@sH`$KU@I3HIxVc zX3ts6`Qsc-tnF-GImmwO5@|1!gQSur@D-s^%BCLV5j5LdS6j-L`Q zMGK6}?6+z++7A0F*E5X^I3J?U>?bI5Mwh|*nn>Y$wspDuCI7VCjDaj(mTc38>2vid z^6a@0S>uw!l)5Ki1B}QL$Y4s{OOQV!vcOpfs(T0WZA9jc#OILUpJY((E%DwIvl?qy z;=SACZzD2AuXBdGt?9NM+dL_9tX;)sBE#!98JYgZ6AM9$e99YnBG;DM6~A+i#^Ro& z6ZHu4B;(hVE9~3cnTN930~H-7MNU}tZ$4AYJf!o@K|UD=;y%siu#cdj9AgvC6xGdY z$aL<~4f@4RJX=J&#JvTkO}UqMhP6XqI0nuSAoiZ;mvQP*Q=3wAE#uRE9KR5UNd-NU z@=zCj*e>H-uOs&1G4{!^6YC_Faenp)FZ6=zdcPElQO*q3@5MUKvjM$#C5v(M;P*aA z<5^jpGfK&WEyS7G!!kZ;L=c}5mHHf)j0>X8(ScuzlK8V#u*o>jBXQxGHg$dtzvJx# z;H7gs_iu@`lUC#x)*`Fq`77=TME`mIDoU^F7`>wR4s&fy(P@J{i*|nr?*^22k8y3T zp;5H+-eSU%cUa4_T(P^WUsQKqxX+evfX?FVB&N(_a2i-hXD!$}nF5Ov@uSI`?R>jo5iH+yMvp+@E5HpWI~6dWyW+ zC1J9^#0NN9;+eIVs;}^SvKe(B(&KD;Hy9p~%9u0r8-}i2%~-$t{$EL7-JTR&3YeC zn%u`@{CTXVcbc*vD{tn0dFqB7L+WLnYK?O`aPBL|J?I41B#4t=+nxUUj1I?8*WQnI z-1TuywX)BDUZVR^1zlgmcBE{=zqP}^Xt9jH$oV;BGn4cHEv$H&qrFj}0miIP);M&a z?`d~{zK~tYnmOy5Fm(iNWIAQ|+u0{Lasli{vbr0d_s|3v+|Y$r(09%&w9c#pu75s{ zcGZ~{sYmOok#|DVEt$M^+Hv1Mad!2VY?|f|!;@qztMxQU{fv*D_)Eq(a zh-;B{W7~4gU+lv^EB8rZ&7#_V9QI%C+t|G55_K%g_)xBYppIIne~`XInJibw`!F6D6jy{{=zdM6+^C&AkUm9rZ9hSBWdTBR4-WlC5V!S`OVUWmg zT8H^fD|8NLd9=7=v+k3rFv~f8zt~taNoxnuK!~{Bkr*r z&vKZP;VF4uj{9N4S7$-4ZH#r$Rw?vg;--_fg5p63yUTq7pF zU1@Y?IB@YdEdq_;%LH)7KDQHd)ppu?Bb)S!{l@-club;xKRNa>on;)l@m?j;%{GKz z(aj_8;nZg^)f^nL4&Zb_(+@tupH^u4NxsTH7m$8eXDRxf$w3VUGgvleq4Q{v^wNG2~MV`Sj^&>YMV3)&%WY zKZlJx^DOi1@S62VuXB9Yz{AFNv}wXF$@pS3&fEst3@PifPn7jVsT@;NsmpkedB0&L zrulo4|FA2mtlKnE#t2d<2TcVcdFpuV9pQSaadsW!2=sjkuNmVH{MzKDi0|;MF6?V^ zUZxz|<$5&7;>Nch??juP#yO9#&-0WV=X>l)^hg|`Gx`qIba{uW@$M;Yx5<0*C1vV3 z>^10+`>fK44}S;myfS(RYt!Qx@0vOVa396}%$D)4nqOmYr1XE6_1|dYL$tJSpdapk zllUcLogR0Zy`2XCKACt2@4O}rd~@O#ew>>#4gC;4!BbziLZMeS-<+8u?M6{gTUx0F{;0y5iU>bO`-zkqiE1iJtfgJ{I zGTASbJH3zZnuen76++n`zv@S{PB;5=+8G05dQ<>fy7dUZg9S>Dlzjf=UO6Um>^2@f zC4Etu{>dRnZZS?WMwN_b3hhqbIyL?>wp>z>ZZ`M9*x%Z3L}<&Eq{}pETcMZe$7y*c zTHY-hDQW<%M*a)v(*{0W0b6qyd?ECy1nzX*Fi%==k}(4NaC|72`dP}+hcjoDz%M$x zM*AGW#JVbVTk2}Oo>IOVy4k&+Z2@CqjJ-;K3-{z%M$>cPXW{?pb}`pH44L(5UBO)M zPxn%WUBAo8AKGrn8Rzrn)NSczP>nTCJ;>FcawH$YGdWhYfgdfAgPa@T-9W%hB~18d zrGQbXU`Rc2_RXfMxxjnxvn;>W2lQKM=egh34ENq>8Gn@a5pveqv{mlI z^q7rB+v!_r{mQqDQ_}u{R<8NS(#2-@EAkFW!04y#M$m!5`h=rln1G@DU+8;mPPTNh z9CKiM%y8dj%D4KT1*W1&vfZKY4VV5^D}0eZI{qDPwgDd^hq{L6XwXFYopC;V$Dqje z;KMi6@;-;)CVT_qkh*&-_;DV6c)MW;3KFdzn?-X@Eqt6DcLf9DJRBWFO+Joi!U(zwu>!sSz-vgdS zcppk0AYRYA_ZYV^Y!AvPc-xVes^Jy(0MFrbdcapKsQsaD-rJWp2pdW7*%4zQX4$jMg^Tkr$$*y>b zyT=mKB_8K~3TND5hr01?AW!3LVBgedq4OCTg8|N?ST`PC!&iaxXb0zo9J5n#mOZTO zh;h*VmV>|8*h719_@9|9@$ZOqvTl5P$kX`aj+xJfzoFq(vu->*X@7)4yDe=!>~?W( zChhhoozy95w_78NwcX~LjbqDq>O4DE_tTQxGFi7hTCVleW>xM}%aylV=Y?Z+FIME* zvaTH~cd=cSgB&>Rwq87}^OnWxUZ}}ab<1MqE^JWcE>ybmPV2nY(YmdlgjL=r{#dzB zI&~h`cr*<@xuEkl!baP2%%V+>j}0(hpksUT+#Kh!FYvsajC1@2+tAq-!{>8cvCvzra_r!;iuzc;`eD#y$F(v9Us& zgv`pZg6oZPtl&OFjukkgsm6-){Z)M4@LhVW5Z&wnVVdn22RQEh0Py5k@vf5pHr)O1 z9xId&MaUleRnaY=p?OT}?Nwwue7Dlk7yL3`BaasDl8U$XR13VysC zzEXNH$*az!7;hhAd+-UyFy;waRNs=EO!MnJ zH_GIiwDEQwbj=T68*8~&riGf|Gw3)8-`fR0u2FHsx2Ld=!SBOQ+@a#4zz2GD?4rh{ zSk0r~*`w~8PAWru3%>F3E#TQ%7oNV7SzK#+XN@k$do0sY4&N3^Dzl6e!!=XCKkm1|w-Y;#F2oz_2Va_Bqu@QDqr#jm=x>!M$clrHZz1J*A&= z?1fLBMY!fx19yETm649n7x3i3y=J)waf3I<0)Kq(O{OQ~JR$BZODYB28}Uw!U0idQ zxF5e4PsI0*&ryBA+?%k;i(`nV3B{9~Og!1vR+JUjZlOKX^+)Uah&Lz6GugC*@!z{~ z)|i~Ng@zlj4+Fj_`Hn$Q3 zAHwexE$5Kk`vTC%Sd3k-BU#2Df=(Qh>zQ(26VFV)sr~cEZcw%#cWmNZjVEtQK?Y(H z;NKr^tVy_7 zgK27%y1kM-lXbb4gxCSsiU~*E{TZpE>_XSE2C3G2Bo8kgi*8o2=<(I&8V|o=A!E^& zapYztE5=UPDpSr47cD4;zWTHs9c3A>zt1wDx65uW$TY(qz5exvUjH(}j7vgK8(3b& ztnn>b;BU?fR07|1=#xoVL;MMM!Q-w5+I-Y$Y7)sKGSJ2n5zK2>ykq{Ys6#+Y4oKN@=++yptYQY z&mNIy$n5JDjgh`%2ksg$-Z>=uQNL&m%5#l89>y}{$#ru(vHaEepGF&w82Yn}ZLweI59~SYC-%KX*NBWa2CA4V;tPXt-<_NzV;u(Z9N?XyQ5eAp!uod6w-fd zeG0f{K9=f9Qz?>J8A#ZxgX6kUOPqH_?z#^JI4B>G0SW8 z8j6lt>ezo+ow@2{y)+dAer=_OQ>n(xrU50hdVd;t7;_{AzZg80HXP%qy7$UxoX1!+ z9Sd=v_OWE;tfm4dsw@e2He|M8-$Q5y=Y&{SD_7wB#*cv$)d{p^& z+O{>r4|`hfom{1OWrjZmEf2P;IH>zO;P(0$pI)tNx)XdtEFW{zGY+2`-?rCt&eYV$ zJ}L2(ak5R4wkk&dsvI-WFOE4Wp*npA`p!S5HO&N1G4Igvc+HDf`)is9rEVDwefga= z(7Ece_LWX^*#@LhKZAFN$a@UqY=hzf^cD65{HbM(26o67dh96e&}H43fi_|`32DjC zG6^@+X+ICY6Y>+bMDmk7!`R~Nw~*`lv=8_eyyD?sHdw|R&ic9I^Otaqm-n5S?LO#Y z-@e*6%*@;BGbt_KM&Cs)7Ga{|B*3 z_Br?r?bKiFAil#uJ4JhC7UW{B+dcRFy&NCFYuYN0UBbC$-SL>M`lM3LHD4XA?6sG3 zUk}!MFi)vFsbw8B`27;fU=$Aaq;`dK{-lC);FN~Lxv$5bM>zFaE;tjrz?l*c=i>|w zXQhV2xv$5rq3!(SBz*HexVsLv)5|qukGj{U?p#bKe|M_!AaoMzOa4~R?mR#2Fk~x1 z*;LE;-4?A^sdg#!aGU-W-`V+8arX4ahrTjMvWBPgu&mK6)R>1?g|fZ*dy?$D-dc-9*~o zW|Sb$$1{lW?J9m4+b!eOH5k*% zjGx>GF2>}ogdSq9$^I)H?K4NeOP6_4|6Y^+6XvFJ9Tc*l`q~H^V!S?pcPHt-_LXx4 zoX5oX&*iri6s;aCkJ4Zc_okeym2G05vy5e|Z7+xGqk7V!TD#-*$25q{zkfuwg337WYj-XRlP$ z--nL{eOtl#4xURmkCAo?ylnU@dm-yA*eTd+tWU}BGf`)3_|N(OL_hm4kfGO(x_%?3 z_1a$9e%lSvZ-&LsKLU-?x0l};wHs@ly?oH)S3c5uOyA!l?L|TD88iGBbr-Ag+ehdx zL1yK?ORhVizO%<+6zV_A`mk;B_0>08jo&)^e|I;%3EKj@fU=og+d7x3{P^DvmAYGx z@vN2f+o!&FyUGoFKEB0z&Qj%HIj?YoPmJ^L^y@*ZLeMQa^d`PRrP`8s*-rpw!F*{C zQQube_s&Oq`pynDcg61^()R_uId*bv2!=mMBR}MxA#rqZm+{869wxs7-!Ux41K1Ic zv9WROLNn~yDBve??MkyBRe|Q34zCPS-(K@4Z@h=zc3Fps4 zRR8uI(r~Jzom2IpznP>Hc(?m}cizeRjOV~U>{+4fXXBd{a_W}FSQRd;-Mk((dw2JZ4Zc4&K`hP8oZn*k5J zNrrxzfbH;Fes_#~wmpE4c0%n}G9HoUjz=)x^-Z$wbAQ?rl;QWmI8TRucKIGGVjPrz z#JlAD*^{^K4-3&3pBi`eN&SHh>x}wDD=|kFf504B+UYaESAS)SP^NHuST(0#yJh@#bo^Wf^;5KM%)~pnN0q;UN7p!-+jn-^vS{3iF@C+LRF7@# z(w4|^;6ChUl(q!4+xe73N3@qLeJO0Gag}xEek?2b1RT}AQ_--C;}vZ$%d0WyzO`of zgLB-krR>Ik?ST#^OMk%F9nikv8Pqw8u{B+vVcFSKfcPWllv~8+yfW%7WESr;u7wX= z06#w@JavPyzo!wpz7AvZtkb6<5BmI}u;`aj=Aoypq$z!}Xj~Y-LGvE(XByce=RjsR z-+|wL&~ruEpEw=>$5HTCjL>5TIX}d=WwA!mD#x;P>`@rPIw+IEJbW(=^C)~52Y520Cb=4Zxm@wZ-N%;eKKfqwCON-2>53BM5gjjch8eJsPBdPb$mUQ zaWlEs6i?jim0UOYpz}>izj~+7&fz`q&w`Ck4nC;tza7UP)|YaGCur^uUW>asgfSiW z*W-Mf{9cG3Fc#xop&s*Ga$Jq?E5EP4uWY#J$*O{(*?afnQ!n z`a(Z!&?ET;>OuS%lt4G27tJxf7*T1idGDm77nZR@j_=sp>SOr|3z!Nmgr*F+Rf?@Lh0M{9_h(nC7cSC00JFeFW z;Ro)Rtm&%8_BgsGp8M=cSMpL-B;{q?B-m>eD_3XKMQy0`}d5kNg77c(l-EK2%{kfeR|B|_k*SUPMw;XoAn`S-oc@G%BW7HnJ8f72F{0e7t@H@Q;`;1|Ol)c3h@|1>s z$sSAmzMOU(b5C2{r68uuJD<5{bphr3zs{S>0he;xg1z6sGr0T)@-$z;)BOibv{Q&Y z=-fNqVk?wi*~iBb3u&|XolzfS;{Fz4L07VL+xZD&9aEN{ zr`)=1isRF2-$8&-d}<+~{6B`CXyOpqt|drXqgH zvz_2Oc*TAj+s;pY6YFoBr?$0^P=4q^?3vrQj&>)|*gNdRmr(X0HJ|BS4SyJdSfH)oYPviSDM!0U=sx<0gS|{-FLE8)d<{g~8OI}cB0XGe0A)kABPax&3 zsOcHJm;Hk6z!Q1$dtE5gs>@`t4Gq7Y@KI*D4c|oWR~CEacO{kImedlX+g6P2(k~p- zoo-1r$V<4sjWZji-OJ-_Ob_KrXW)~}XXsz{%5R{_I2imV$Vv*%Mz@pR(molT`YfIA zYyv&&@gCHXKasqKT>rX3#r|=x%R4VXkGIJ4%_?0f@4jMO@w5BQ6B~G znRfoHyeAN2Vf~sX!KXje(YL4F$Ga?D&JX^UN?&Ilco@DP^NS9H{Q^A-U1j9`vY03E z-p=f<<+sT1(4#K;wq=K|n|xWcX(Nw)Jl}#lcIOm_T6p#a_f?KjYYWI*&Dgw(F>hVT z_IcLM4F55x=KovX#dpc1e#Gi~mpy!d{qUY~Xad|fflj=i2X~x#&)|&IrzXDpTsPGF zvz$!fY1)Q+3dZ8R2`8h*{Q6M7KNRM*HUb}HlrJggUTgLPArQZo# zm8bM6L&@isK_-5OnnqDqP3~E7(b0<0v2z;Fd&g+`X1b)M5LJyq%=i3KN5cu)hKxLS zQQK+k-QrlZ`Ki#O>1?kkaa%9GTmSMi-PaNyA#nxLbs0-1U$LjKSbvdJlZ-@_o4aJ65GN{u#9Y7S2`Un{Zq+flcDKGQh+A zNs5O!qjj~zLoo($oo~Zsv7Wue&A;dO*v*vx=XZ3qB?r}b3f}^A(=ta6L8p_{&H4(g z%}CvR`dq_Cj=Y}y3MD&QpV8+riQ7{4L+kTurO(d~r2R1k;yL}% zAK0U)JwzIK_h@H1Kemit9YOs}#P>`~yvsX8(&*!0e#`HY!JbDB!?$RbJ_&sYw@;$? zA2~ir(@XI0n-J@QpBnQ`HeaM)0=fT4;k)_WsJ{+zUTHc8ru?YA*cr8|#|Y*pW` zLfgx+{wRXp4_^(6_wkoLInaoEfy9~O;4H+J2I8FF0Jeb`0r6^$;x!%T3nX3=C!~S< zkhn6YgS&&b!to`pd24(-CsP-2w=D4;gLaa+#zi|O>mY53mv|?ET&uH0=OCv%=yzD* zeiiWU=fXWz;eMTiJM@AuF?Vyp92>*o#XW=xcyetn=(!fK2H-DM(;~f?`=5fI4>T>{ z2LqNRw(;&k-H#U+X&9D04fOmgFo=(X3+x(VQSfuH)`vB|4WJ|92V8rAOqQXX-X|6B zuXDc1yAz!GCggR4obx30t}&A$M~2y=G|-y79yUhsek-)+=h{Kt&@0n8#v*Q;DMatX zXl8NZze~OAsg66pr~1+SA!rv?#a$=i z%WQU)C2meRoo4${99HXejjLR-EA7-hTsP}`waz%<+!=zo3gZJF@XOPcUr7})et8#m z=a+Ap5J~7qqQ6VMOH@8Suc!J>zVEOQzD+%}4ViS{`E;7Jck(d6$+T~;E3aEWB9X|( z*n6klC=8VMt;c)lqRdNil?852IpWE*qeo2pzz_cRZFiMxkENZuN!j3w7ku${<%@TB zj4w%<-TC6VAcPmVCHlM6yF}&V^LnZu%}4*dnTgx>LMEf|beeRC=0X2t+H~c0>qjK= zX-4dQv|V?(G`xo{N?0|qvR>lml+$U4FEW3+;)^%iRW8|;cIqwzUwq(;uPa|XV`6;i zwW&K_*p>&lCHlM6yF}&V^Lnc9NI)0R;S6E7M-RXH0w0wL(LOsPN_n=R_DXl6;(P- zIVjU<%2tU^Q&v>WXyz2eT}3|Pbme%CQ8;}x8EMQ%JUj4o?U|ZVX@*~wYf6^!_q%k?Lhzx(7wwa1n_KkxAl%TgKLknPJ;3+QD1!v?yQOWgr1X$Y$oje?nHmE z2^ER*KWko3^5 z=cL)bg9Edgc1Ny_KDDK1yR)HeAx3z>dk|}FMZ{+@<`a5ds}6J4>3BC5 zcQV`1`;(Sfze}C%6`8abA>5_H^&^z2gX|vXydQ9~sk6$~7B4o#zf0yCRvvUu+1$0m z5x*_VYscJE+PHNWxefF<^+-H(o_ea%8y4~WleBTzue#w{(aYo>EMwhP z*?-)r0{fQEwI{X%U7rY8*gxz&hyEF6FxDr;Xjju#&@M}xr}ibVuUrorYoh<`3(BPA zWlBBXkoOW|6Dqwd=f=np`&yAaY>_CPiuiHJk2|YdJtlQ)N+##Q#_mMAg)uZe@t+*O zdwADV9d~|D^_~2vKa!vg>4WI}Xj;VZH0Y1uz4S*C)OYZZ{(}RjB33{89wU`;Qp2J@ z;*_O75}#)K8VC9#OiO>nDMx=qr=!mlHBJA?fj4IR8#(U6CGzy?cQ;oWhF6-~r=_0C>(rf2=W=$HlA7>fp}{Ivt}$|&og z9mg!#4SQC}ay4c>(P|m1a(W!I@GWg;{2`3)W00unK4xKmV2@*#+#57D&~afg^wtAf zO^2Qu9Or3g0v(_5-U`t3lN!=T;%)qV8gPgG`1xf1mbO)|L&w|JEyp68-UAyLW~|b@BO1@FLTuBcY}u1rg4a1Qz%$VpVCYRx8s#Un z;e#~0U{YD#SGT3r-McMq>2uoen7D65XxKjNTl)87Cfdf?_FBf#Sx@?a#uJZNqE`#| zP6Y43{z=$1-US4F?&h}yn`X+rl2xwQaT(qrb}VDbh#h-dKttL<#*Vo^>p|o#RQ~0Y zeR{%~??cTWqyevqOIHBbH?Kk3Yj=s&f*w*g3MREcK1Aqo&=mft3Hp&=Dh4cyoH#VT zBfH{K?OEcfBSFw9RPhG-k2ox8Bx9z}-%Nj3w^bJW*3%Io>agM3&{v^&twB4Vy3~6omC$%G8qip&l`c&HPPpUv#+xnf>_UzvMgG)B%Pz*)6X&Ju%KQ)K^enqA)8b_}v}oUm zk&nxDuPk|w*;T@q`xp4p>DY6I_1TcUNpKxL(0Z;DaO2mccJHl`T&$DG7o$_%}yK8^c% zaqfa`^8G06zeu)3_OmF@{hh@aQ{l(;DUN}twJ4U)&qED*Q^$6xl40I%)!}@qJd-)-0v`TQ8Sm-A9($~rl9qfATKd(VoX4Ib z9=s#R40p;i`Mj^eG9JU)dvY?`oNgH{L(%7az{^*CmUk7)yEN3@JS~0jz6kG&_#VCh ze7Ba5EYW)>@+#$?QJnn)olZ+$HjXa>EwT3?6ZGRfu0O%~P0~^fVHwadnLGd;OOdyU zJ_dMD3LdQ2^$T%N4*hEfMmk{JsA2GK9s2Ca^1B|QnCGrox0-d;Ja#jVRNtp*+(-PNDX}~i-f<4rOFyY)wHKd}~S6$ni$atGVBjz9jcsQWm)1l6w{=ocM z5cVDYF(6}W*(cyq)f_OIk!~hjr?2d%?B5{W-+<~TaFYF$eMDbN3eZRNkL&7AAK7=* zEz7}vC+HmeTg|>MnW_7VckHXw8MMp$l=2#kX0%zv`|L?u?x7-WsZ*pY+pEjJHLcG7 ztu)+eiFhmRT@vCFD^5X<<+(lR&?w+n%zg9r%i}ljj(VxX<$~W6^O$QepEH^R^yRhR zELdLqnH^2rgb!=&qk~TltA+1Q+a{F1nUvAp-}JP=?^+Ad*!j2reeU|e;d8a$VqW3w zFHmt6)!$wz-TUkK3-SKN7d{H)AYJ{*H6NzI7Ws$t<;GRUuZ14&ls0PS_zg&F|9X5U z(%QcszZq%mUyo;OMElp{HzKY5>+y`YX#aZrNu;%ZJ^m=t+P@yZ9%=1gkKcr}_OHk9 zM_P_IlOlhZjWqph_$Ws(?!dp6KFS|=Ano$6#~(Dq+xM%u%2FBsXG}wmT{d)&I(W=z zwv5GFsek$oJ$LShZMg5P8GgoEIp*T~J^CrnKVa_P(z7jZmgiq+ z``otN5(6&UD@7I0qhg$HCSI2D&s@_ejM@>*(>WILogE&(*K7v?P!{EQ7F?aL01Uj_ zE&HY3^~Jq%DD!W)A4uLY$29iOZmC22Yhib`;_nU}6XMmt7gg@TTSAurJz`2CuI&D5|SxLj-_-_?-@ zk9WR?MXqzikW$$F62NeLhcw;hJUtH3uaJHNY%AXphiUp<5&a?DZMPR?;p{39YjTPJx;XVtIrYSFYLfPs$HIAmtc69#Eu3%YwolBH>9S8~*5m%W)H`>%p3*(l*ZE1!LKuuGC#Wyu&N|;o z8%JYhrESG~x!#|kz5`Rn(Vh31vHH>X6@al_<;ys{E=$~;GESQ9J2)8aD$O`cv>bf^ zUEg^cXDE}9N5(6p9Y>meowVaf(|?n89O(+Ar5#6lInvUOBTZjS+Hs_(BQ5PX(wyr^ zJC1Z1=}Hy*KDrfm=)k9eO_A~M*Phb9<#|rbEeGh|qllaGvvU@j;pf9#8&Wp+UlHr} zI_;MNR?5ibv@2d4`o;LTFZjSUX=+aKZ_nzr@^tRECJfl>0PI^UV3csrHFP$WZP^7m zrOne(|61%5wgvC-S&s4s;>v<+>-?r1+D~=X#9eYsT($q@E9x%C(jQ3${S*9M>RqDp z@p(Pfck-h#lSFNAis2;X3uTN8uDrb}O?irM*Zo_r^Jw@^yItNx4vmu<*5Mc|sV7c7 zuKDQp9USDo6W}9t%qdqLs~>G6S@LgY4rQTJr(t8AeF##%*Xn%Aw;GFQO8IWq`IPUl zPA^8fR;MZJRXR;sFVkttdWlX`)-9c;tYaU-5ss~TAHx1!NM}uoyge3A+Pp4utz`ON z=Vf1PXnZ`!^; zKC0^4_netQgGO)E(FO=KD7J~BhG%F`NRUa4?a;*D*kT(LG?>_niZ-^`20LNSWQN{Q zQA2?mG^F82`tX+4cuQ|VLj*+&Em~C2@Bj^pEw<>zUU&r!%=>=V-e=}yGNICY-yidt znRE8fwb$>x_S)vd?8mmBMftN{5Icf)Md+C;V1Gu{ea*<9LZ73egGY*}_qfJ`+%V7T zJR?5>eHew1cLhtnDSJS9EC*U%guNGmAAZ;1cZ>MK&4)i=o7iLdRC(~8;~Cf|ux~INIqDsLk6D_&I&$%yHUeu z2kHYpKYA7V32|ZEz&S3OuI9K1@g)y&pRo=3K@2&2*7@6d=1N80umgxI!Wf~G4LIMh zXtb_-G3{Ize2~}l-;XMsZJviVgR)m>7}Y#KoQPY&?*PweG-58-8$LTFW<}}74{g-& zRp*wBk-v^i#$MS%)NPNi*Jm^o%u{mH3e1_Sjv+E_@Px*+*~5#)=J3tX;#b1#>5Ycg`t-+IWTeC#nAHQvnz{;$)pS#$LzhH=$0 z(En!Ky%aY*Q$7pdo18sqnP)xrw9ne`bS7iNQ2)v3YTReX_z?Ae1bi>!!kggxUw$YM zG7yu{20z|%BT%{tehVq{=x*W^#&Q*56zGYEK=T<(aJHiKmvQC+n8R`K3=YPWEx9tE zI1<2FCcC8OxKV@sSHME_YMvE{ICs6wO5SlQYh}j!LZ^xqy)OqG08{#DmySKv7utKR z%FnhEIrE_#0KS_@4~(x1v|}%Kb3pE-Ew(`;$hiPK7aq#}47=>=O8POiUa*k#g)-$R z!#ltNm|Hn{oVA($lt=HG#OL4IhwtKULGG)J1*=zO(2f3Yw4bEXzE{p1?Ww zUA)T)^ja=DM32}#>`(kcs=Y@}==QqU7w`5)o0Yud8oc_XylXO+0>PlUU^~lB&V7ryh=RD^mOka0@TSdGcwQMQ`!nsHz^we9 z|0MrITPDVl2mfvr+L#8o%trY+i^m!Vmy{ayn9~T30kkhVRLJLTz#3<8jB?Jm$Hx`A)1oP$S7)s__AxDM9Lc}Zbsy0$=csd|O~-T_YXD~_Cz!};SAT8x%Cq%;Vv{3t=CU6R zr|!t5;M3ffFn@TbhDE?NrfOH&gMcZ^O%{HE@d`}MvuD_46T8B;oGDE0f19iS8`OA> zqe0UiQ4HF}`c^A>U@z3)D|Oq%YscPKXB%e$HnE9E(H`~_BGZXKSQF*vQ180*yUBb9 zpGP2Q&PV(h{TxQ1xC4C544XFk#P=S_3B)`xkQ**|f$kl6MV9IDmOJnOPs(zyk=5ao zI0Gxz+e(D)?z_?*01?4Nw!k!3uOMOnsYGBz#C;6F;{zjx88qS3g%qk6$~ z?IUt>Br8APe9~7Q^irWO$hpQ>WjzPb!RHTJv7eW7Jrs@3zZYv%2ilSNY0O=0GOOva z@pzue^|6|MUc)#f3;rFe_UChegCnRX$vT(0a(z%{0}e8$6um>{>hPqLbx80ety3iP z`{J%^_FMa>rRZ~*fqdxXV}R32D}xef7BSM}_Vvx&h;| zQJ(XKY^=ANKG)6ro5QxivV`%8K{FK5@KpPNm}?~eb1vTSZ`@-vC@+EgyAeCNhPYi! zxWyh9{XA$k$^KEG-LtM~uj&tdwc6h^d`(Xv?}}QxEcA6T`@-Bx@J`OZ1|Sz8i}o}B z4B`;#uExm(=H`wbQYbChR(MO%8C3=dP^|(+GXvxH|lOk3VR9;XLY19EZvuJD+DYQHOhw_5{pB*?@xE zpWBy&&x6ODc~G|uLFb!R_R~|d4a1yfoPCP?5U{IMc;UiP>c&IhsMv4tRoG7eEO8I zKN2?UCdALL0A946TI#F?XeVFW8o4&gh>vAc{9rM7z@(3n&t#Uw@7Fc`+VDjY55W63 zaXxupxa9Z14YQ9pO!;8N{tdp}u;35o?vkyagKYh`YT~`(DG!c7y|u1-fMpnat88~r zy;!o|yaT8wIct;+xj^hV;16WZ{L2|%sGrZHeW!3_{&~QWdck#^w*aoYaHK)_Uuiq+ zGwhclk4`4>W5ONrc;l59WC@;#&13Xq?=)#c;Wx%P^f`BqgXajIWqy+X`wL}jVxN0d zf`{R%?6R*7*jUOFtz~WuVPFCzJpF1kaZTun<4QA3qRKaxH@~~-~r!1 zp>bbg_CmwG4K2vkiTYWnpTXaJre#^KvJat0O%>YCqR%eS-aifcK4g$7egw*(XHIu# zB<(=(Nbwsucd@KU-o-*b&ASt=+IL`2+0#>a^?2dcke}eq{v}Z(bIA)v7GN-tZ(r}q zRrx9HPTHJGM!i#@c|%^%{N5goYdIo6Y~%A*Z6{zKouy?5?Mmh&q@I(oFWq*eqZ_zw z++<$|wz~SdH>Ix$R_&TD@OiBtVvS+L{x|xncJ*bZ^i_<$kaw?Xp>u{DeepcgKRByUi5|hwt`2TS5nTVvBggh!#>;9SAI%g|BSw%XGETM^_6wndC|^+ z3={m+HVy9+fp4n=^dk0Y=}I^68MDEPt*%M(o(Hgp=_!cL01ZD*x$DU-Zj8sH7GyH) z!Js+!PUx&A{T`*8%)_9yy3mZT`HQ{+9pDbc={_VpL-I8xd@fhHryC3OhC2{%!;0h{`3`WaNh1 zcLH8UHri131Ir>tDQMJ~q0Q3H^>SGJ$3$ zbm~k#N53=ptRA_n@V<(DPJ_Rf?@_k|_pGGkzx$5t|KeRP#x-2ymtT$R_PcbO%s;_C zJ!rF#@``82>{wn1>y7fr+0SX+ z-KDpKKc9W0gTs`kjy;0B_06y=vYgy%v|XKC>KK0}ct3QZ2V;}3Kul5osH5cP?);Jt z-y*%a`tt+tKXUqW><+Y30zQ__dtLB5OZ|@Xw@>~46MoN2-rs~aNrP@a$h9P_qR;1K z(XVO8F5ii`nH`MB37Ru*l(-wls-cX2zr*VE`uJYx*_@G|J_qw@_*Qybh;xK}r|NOP z-rf(n8-^@`&x83jt=gZq63&=Yode(JaF#1MpMJX~;%(ztTV{D%t=J>$L#wZBfN#qR zn)iPsG|^*bvrYJ0aBulf>+lZ#h=-=D_#&fUaJy+_3vx`ix#V<7(5$~n<6S{ytm?yx z{d6|g&!=)fj$C9z&sF|}?{q5qG=Y2d^OSw=)%JP)`^rAQU-5s5SK#@8{Hf@(mHr^) zhy#w?zeV_h*xuhJ{`$rC2CfFpZ!ZWMD|Aln`stb{jK_2Fp9HX8dQ3|Nzg+n!(as^v z9q|S1^NSzA?i1Zh^OGGifAPzV?9=?D0PWta=kC%IN8!Y%WlytWE9Mk;ICjdt_oMwqTyyw&OQQ3QT->n=Ju!Q1694u7KbqeUe0^Vgnm-Pb&GojZieRihyL*RP}@ejVRK{g!mPurk_@Xzs)q~M?I+i4$# z=rqQ6Ue;sk!gw~|KE+MpegD`I4|lkLMHh7=n5X zVsDnhp5eX{pQ$ln{cOt8`0V1%a*jRVyes9}ZkBiJM8-NWN!kB%^vi_IyWVBP;Wuok zagb@?i}l+b8Nszq%EJ0C=ehIDk)`4%;(c+jaYU!Y{c!Auc)|Tr(G_B2`haIQ@;7ZG zJ2qyYx*umw5$#mSJ{6bUxlH?hzB4x5o*lqmkoI@qKb$#ULo>6h=tFD;Y{JhUsX{yw zZ8_Qh!S`(PbkgB{!nF2x8UvjQa)PTULwbGgXVna&Khzbf-Tj*N=N$$)_Fts^mv97VwL^ zCBHM*oqea~p_l&O7JUYHJp47&>TKJ}T-&Jku;yXYB4gp#=iHhuY=BI6?Day7XR79t zE?#sY@?Ny4Pd5kAFQXbaaTkTAfet4hILBeV^ijQ4W*@{@ zgBWW`ktusx81r3XAA=?tUu^}A?~Rr@Y;yC;3&&x6)k$7C`v%fE)@VO?Fy((1aQ{{E zH#{$AJKXP6yt_&HILJFdZnRBkuk{vv95(`zIO^A2M?EhTk0X0cbCGsZ#|%K4!nG9Bj-Nkyty8O=H2h$ znrXds5%l}{nD@U#WZpeSbI`mK=WM(|(q+*6R=)n0bJEzu%_H9s9@==(Ry#H#7j=iR z%#!^VZ4H`r8?k2GH$vUImxIQSXF~UYUUKJ3d>sFovk#D?bdP`Hz1RcnBHZaBb8_q~ zHxEb$-=$;SbGoqK>TImS*ngqt)QYhjNY3fbo7MR4yjSCz#dVfB)n0hSj%8P(?u6vC zk%gFN9-fU>^=h#{;LNf1{h+aUo|WAnpS=-^BSN(owvq{wQf`RQ#VoL&m!*02~FK|{#-XbVLwe`N`Q|g9CyNB zf#1N%0?6jHF)C~;g0={s&^^LmGWehC3>>v0`RA>}nHXa*EC%CnMSS)_w@ev~$8LBW zuCY2F+d+5~nc$aWxrbTjtUq}iWXnA>p)&`>))f3af0n?hJFzdN@iDXQ(~R%akL@qJ zFt%xGt?EYTwVFHmvw&6JtCiZG;GD_~zn||Fq8P{K?v&S?l0;fb#C>1w%Wr_YVwgvEbPUYy@y zbuI(HyF>H?&`BD3@dsPUi`jL~eADTwL%`le>+eHWESsa|J8O@|ACVLCdw}de2m6)F z>J^>W+?bFP=6$7qZ~fhRBG=ZcT?RdHjx#@r7ocwi?L%JNdq4U%F>mqHE8gkfXU8tu z88mB-QLjTACifGq+J>s2aX0*&ia`v&%AeP%p=Mv!M0Tp|zo@ z7vZk1rMm!^sv?|oC@M877tfNjsU`RhVs98SsOCupFK@nB$+#`Z>D!Cwi)VlIVPh=icy_t837d>GC2L(aydLwYQS+Gjo^EqZMZ9)`+OITQ zW&LaCV;*-dkeEHjm)+u$CHM^=dp+R4D>?~&>*e^5`?G0V;;xWP*z>f5oqMTviXX(d zEL{w(RA=-v-ErY4kS+ z&6y`z2K9OObyDWxH=gC-S=xKq2hU07>65d*o`L(q3Qo9>z74kB@;=_Z#diO{^rh*q z+N%Bj&Lt+})$Y3iG}uC2amd)R6dD|8JH2OFor{kvJ~Z03H#T~ z6Z|)3y+?ZkK8+Cd5(~MTwU4o!c+_}VZdK%tVH>y>%&~&=Jjj=4ah$h;Q@lIjBWaI!VISfk z`zKE%tYl68A=~L)$mJHfQ!QxTx=Hm#e=m5S@#uTx!$IReZ`ANe(Mi2){%7@^ck?h7 zpTdt@C&*aZu`kXsm^bX_e~hODwB+I=Uhvo!o)G~KO<$qu!>@6-#H#%cVwvuF_;j-4 z@5|43TCL7UTh+L3S+2+BviUu+fi{128vnNkIJan@8fUe$KkTykZz%c)#%L$>dC;fz z(gD~lj}~B@%q>s}9kvQGZJM$Vr-Ofi-su007?clHh_Ri9GlkWFZ!lbR}Bs? zFUI)O&}}vSS}ND*EyL6BkRk6LqTd$0-H$y^_zL6o%rO>zY#U?0xwmh#UBdGjz%JEq zAb#S({I`Yq2pl}I|70w(UV8h8)%kECa0D>6{2eaNU zqMpG@ z1CF)4bu{@ke#2J1^#aVbocvPsQpDS+IL2E};90roV6zabAA1Nk$j!3f_6ZQF#6k@168xet~ZyHyh*sqt9bM7JEtI zsKhk*!-&5?-GzF5J8*Uq~D~)p2L!TGxKC=WSf8w4C#zuI&gErtpC9je_?#Au!uY96-H|k+Hb{81n+p%1-rppuQ99g8fsp5BQ|>e+WNt z^rn>f4cY$ze|569fkT_G{JOVsx7-^a&z4wR*bm%aiMD;L_i|=_Fy*uOpZ)QA zHTRkOWel|+Z-A}ws`~v2Xnp33Q^F|sgO59856_(W>nXS6|1F>7NX&~lvvbN6{4e@= zo!U2=xr}yabkir}v~Ie9`%6uK`*^Op4{hcHx@`+>-(>-YoFAWAecq$Ud9>B)08g!L z#-6~;yHs58j8cIC_1jo;-TW7Sg|({sK+gH0E_GBqug9}J#9Nlt&q8?iVtCjKd?tCf zt=K)ic=j~U(#I`R_gJ zF58V~*x$bTekJof>s{?^RyJLg@TWjGXm6&=&cbiRamT2;JFia` z9aNX{P1_OfI=o|>vAftKIiYaGldJy!`C`*x#D_WG z$oQ>#;t<>9JGN!VhWUt7#5I)J;gm_I5B8MCw}qVZkkAXcPsqD!dFG)gSNq1^*6UyZ zw_kb#Yq21q-_UMYJeIn|jiMjmtbaXZi$y)(UU-bLJkCBR)}cah5^!+YX2+1TWkG?G zFO}N=LYClNHQE;XqMm~GGbwX$cH&;}csb+5xD>nT*m{?J1>XCWV?qm%6)YEB zn2?Vp&{s3A&H;}8y9anM?H9^^@N7`~;8V_1`UqlrqzV+&iufzak;2i&^E9X&Pap@{uk~62t$mW>DHx%oKjxu#6 zVs~fXYjG<^$GPUlrR* z=hJZFiIQ!}c{`D>R?|)=Hr@)FUz(@+z3Uv<5jpQ-uL5nxA|dbs&~Q+nf8`kfa}DQ` zIuGtiQ)X7gw;jhfY}IW?#>1BxSOxzx;ugZOZ1R&_+F85)Y zYwUIY+qGsFpGPh;*X#X3tt*3fz(0fc>-nDhZ2XpW$J%gDl71A*3ixijur346X+$O` z+8caMvK{o(Xs%DEZ!g(zu1~B@@T?a(X5s1PS55%mZsvXHpy!ypH$saEGuR8|y3B6fj*ii?C7(OmX>_&o zG}<{2adRGhw>shyjY77EwSsLsZGw(<8&}+6-2TLB;H!E*Li&Oo0^h^oV(@d!JL#iM ziDM(}%A7Gr7w)xC-?BY_jcNW?pxczY5|n-PW#@dFU-?e3uHeZy$50KK`fK6UHN?Z~ zp9Ec*)W@t?U8S-QZn&9vf_L=aG$8I>;TQHj6rcOhxA;29B;bk28hjJiFrS-1m&7?Q z>fS_Hp>77&?2Xum^bd0^Z&qYWnbL*qCOihXURA|`o@yF>xYM|+E?nqqv=a) zbI#3D7pC4k$Y*{!S<+6KVNRp$Uea!^X&GZ~;QaBu){2EKe6Pc&3!lyStdDj(axW`T@}OMy>_QWrN% zFi`(+%4<_RqmBwjY)_iKaXL6661-seiGFcTJwd8IdRdVsY)F-!s>NuH-yE zX$a%X;(0mxN5h+--w@Uj&hN&l$U!_W(1bYG4&Qa(eBK@ty2;xRexjN1^V{DryY2Ha zFW5w-?PupkFEQ6dzhK0aufo$oxyyE-=c27jegBD>2_M%uIkPIdgU<*(h%>93Uqf!u zPo~pfOgXLT@O>Q%3!lafjRHsT>u|Ic{TY6qc@3I@8#LTo>>k*Qn2!xS6`5~*co*9t zj!T<>eb6lZwUkF({$Ri8Sv!XEi{j3KuEFKOlW)U#z_&nK3ENa?i+PTCX4F1JKdRq> z1?c&h^1%ZqP=-7xpwEmJ<6PpT19E2cVABTh2Lm6#5BO#&8?Is_>*CyI9$*+41VfuJ z{P<$dm3kTE>64f{{mnt;duvf}D_??lQ?!2*=PSn~a>%Sxy|iO* zvRmM5+HDSeKN!w_5^J^qdcPTv{TavuxnDh@1I{4L4V#1Wpjf|m2f+(>7gU|mSy2bR zD}Z}#r;dxw3RuB5ST+=V30uM#`+M7nx1^7jOMt^=e>kpkTl=zkUYyU1pZ`5#-j5It z*-B5JEPG_QBdCRC^t%%MPJB)Q#O{;UaHlWMum7cvd`syqA;zA99|cBeddrBuVXh&p z1-3n~Gj7Db&Zc`5Z@_QTWJUZ0b3S1G;1`1p0UFrD^@I*nIN0am%Nok(fxK`>aW{C3 zvPJ35;MvT9WtP0J@JaSvllnU30_HNL59N&LV2~Z)ojsHtfN@qX!P#Hh8>O))bFo54pAI4Ze92FbbuWaCA>>IOv@a~!Px$mUyn;Dw~{DBO2=xR+2VR$ ziRZ)hbNZEZ`B{)@fsgd_n&k5k{5*j@`gt&E{{}ACx?Tb2OFhRfJDf|pqTd#4Qt8%N z^jK6y>a_sM! zYt!lG(B&4i;N3Nk%38%BGsU+faA-H?R>Y4@M?Hh`J%LyFk2bT@wHN(~Bl9J%Tp?jb z7z4KofTzvMJ}&ym^}Geo^*%(=9@uFeHuQ{*&?^S*aq^ycob9EqOgwk&6t-pO0Dqg_ z=?~kvf=g<@%M$$xxHY?YpV*k7mAN6&<2wuwbgm~kPs}AKctHI=_6^ve*S)IoK-Qf4 zpI!EDH)S=}JLq0-O}86Be~qFiLhnUx06DkEaY-H29ikrSYw``sE-9Uyh(R%qF4JsZ8s06mNjW#GY|AdqFG|#%4PTtD;i=>dWN9S-fY79p zGvBFGa;E6%;?0yH-aOIe1ZKy69qk4lf+rETK#L!+Em`M~xfXi8K94>5;sl(`>+aHU znkG0O-hM!IXgMDp-5@lfbgqd?za(G21^jqLmg38|AeR|@k<2Rw_*;YG(%R#T z@J!;;2s7Z;0DThr-VBY$yERQfC!TZ{#w&V6I11k$dHmL20goq65c2w^&$T8VvZ&g~cZ)-kWc$3a6aZvCOdZ5KN6dneG=C$|h`URp-LcfUQ z?>{8%h#%~}Zbj!4w-Z;`2Jx2P(YGL9pewlAv(TQ%Z{VHc8#9M&ZytROXe+~BVXg_c zgD#-QYh5B&=gJ#TUDS?IA1xC3kNrFNE#h(1^P>+Zjx7WFCUYq&-<-=YmGDR53_Nhz z?VIUJ@V=&Q@IIl-!l3!TW@&ijCE>Bp#rN*je6MgL#!z7QKt?VwNDq=LjP^KXo>hBa z$X<~2cLE>Qa(vEv;X$=CahL9WZNvfkMNua99CN1hTq*uLvBj}(;>byj3mxEBhmhyh ziEkPgG{5jN_lLPAN=EHlYIO)*<6I~9&+wer6Wv0ep#-Wcagvpd?1p)FGFzbd8}dVK0k5H>SoNuwaD)xWou;I zz*mg>cyinYV*e1{e6R3*FV3{wXX(D2`nj(9&b+IFWc3RM&9jJlBl#rvvgr#58XrZJ3^UsjZ6{$q1APzEaH={Jo|c^FKE!$4 zSEuG#Fi*kB!~G@`cPgFGw&+sW^0NQlLc8@@(2ntcmf_x4*(bp7^MEg#I1c#xeW0O$ z;(LYpX~wh*&(iuFRNrPdb&iVolfTgI@y^(C;u_X*k81bYSJSl1^VDhE1x?L>oO9_( z6DF`eb(e(B`uA+1Hi`Mo)#JEHj|2DDUW@p2;+83W0~WF#z@<9MR>Ik8>c*a;@B;9% ztHr;7IVoNyc)PbZ$s6aaQ@pW2$M1tzJqVsy3!jC=p** zgYE0KvHrq8Esk4a%**yICH>18PS`TwH#LraOP=&>A|I3FEtGh+k6`~-WTxHpW)*y=P7c0+l3C+r|B`S` z;`W=cDel&L%vY_j0$B6wFXA3|bdusU9oRRlj9v;| z2xkgP+s}>J^PF}5jgw~pGI0F8&N`%wN7EYePYxVUFiktam+_Z7?FgU4-fkrSO_y(G zw)kcy^j;mHG9^{>K#(Z6P?VIo$2>wInUU_r$Ht-GR0WzoTr z{8)bBo8@*k^gh%HH+uY_CGhYoM-vYGtz~FtXte02S)tqhte$yrXVfUjDAq?iN&b4p z0bQ5-Rhf;GwN8tA5v-%c=wTlt+_uwT+@7V4$gy;H{ClhF$vvl%p3>5fTM zy3KHd^A%p>`OR9+C#+#*HT?$bm#^lJJ+HxIf)4E((}1zebd4XsL0d!m)KYMKr;;aE zqfWl0iL`j7#HRxfs!4Mdrw*U|@4^18BWPdF zmf&9cGt#eQFTuQKzxYZc>JA3dP_*pLL&Y72(X{=|29{AV=~pqA3h@{A+4${%af70z zokDvm?)CGF^?HoMd4Zt#2ng#1jFJEPOuhrI1W>nH)pgr;pBMQDI?f$jw_JD~-^t#? z3dG8`#b>MWU$H`utL98%CkDgZw{$3cM{JS!0U;NvAU9f+PbKe$GvNWiZ{#vIs*0b# z`!I16yz@Qn4*)!`B!3=9`;qU2&)_%91J?Tmrft4%(nvG{yQAz`?bkO$#9Iwly$}1Q z`0*NxD^xq+U!(`z7r9;OY`(du1Acq;othsN!atbgNBAA+LCnJtK10Bw5c~{#xtBBF z4)LL8aDDKDA?gp76W)Uk{@UPuZaxDYej9yN;y1@0GGVg>eBMoycI~srgJ$7$(c8}0 zhYg?oU|u$EsPPc?fMtfP0q~pl74NWMe5h4>_ff3rO%~{e>jc=q_tz_Nm>f6eHein$ zd70)>-vIm&uLZyVP`q~VK7--xGhiQuI&*UE{*JDCCiJ0r)1g_wLC77?*8gAq45q`O z<<6A1DI@lFYkaSq9EME>SV!*Z%~t!|z2nYopZjx>7PO~i>gO2$!23rExUS&;-?3`{ z1wQ|4W=0^3)A+{gux{mi$NCc2inUkeATL0794ll_HSz+VfNoe_jI&cqE;ZLIxx-w$ z1m{1U`l#b$Oie2Ot2OxJ{(-U*LxYYhe6S6B+K?fNpIrTb>?w0ky9s;R9oW-0E^1)E zEgo|n?X;FV5WjGT*~L0b%FOk6zMVQ_P0{YarU+8^{EcBD1>vxGA0)Ax0 z{$&T`Zocp&_yWPZHc1(@orIH~|19E;(X8ij@u0PCKRFIED?{>wZTi1m4h-Q3&${L( z2J%TBuR`0E(dUs7T>6dZHa&l{&<^hH{#&l2M@e1)CoYcmMyem| zwEmi(kJI`_VbIKV{9i7A&F}h>HrlO>IfabBY&hnf#TYJ)tK?y(ReM_lo@c;j8>}IxoZET-86(I$Gjrv*s(q~ z;3v&k>C@2a*21SL!7lcUq9Z0_EBHv zhk51TxksJ>#+DI}%bY#0s63@*7)z7fTV0KH@gPS^$d2u*BVWc`UPV8*qYd0a=(QQ6 z!1i=G#86|bE4?9&7oonW^$iL)Oc5a$IkwNQrJ75Hw zv&*&xt=Nn%r5Atp0%x5dV~y0cV!WaF=~8`*UX@!lfIK<4d)Wh-lFPO^XSCfBG%sDQ z@en%oWh(#WZH5mv1LMR^yN5o+8SCiBPx=QxSLcky9Y;AJ?hd|B7vA6=4sSE!I!Xu^ z8GyGJ@IH>YN`89$J}CP?#(&In%1s*+KP9w|Gg3NtYtTmA zQZdds0XM+>Ov8R2uGP?b42ZfKn6gEMZ8aj$`7yZ zV^cW)5`59OR@-l&{xi_$U^iiXcB^{Yu0mbl2llL_%{KPSvGISZoJ5}?`x0}rrspgh zJ_67I^ZsT|suBISfa}UNvtv6qNT0Q@0w;2|V4h~^yXxEt zh4izPcADKl+jZ9s+IC$NZ2(@3dWZ239K+Jk5Bjdw^q+UlQh8>B54`BapeYy|$k%>= zdwMx66M(E$W6Nj$Hp(sk`~|BU)U%x7d?s|-t?v&m`>oF9pD+8b*k5TS+*sZ&dug^> zAK*^R`acfdj9Q_`pU3`O z_|?Tau5u5s+%-#N{(i<)sk?oN_>%qFABErK(_(9<@D0*&Mf`D` z`Br+x&@yPtRx1XLQRpz6c@Jc7E3FKoY=eJX?+-99o8>Y^?jqP%}j!`wX=={L6hP|*C$Nrgx6f=0WBYny%z z$5Ro1Rrb_j(=7cTT#sOKJ$4m|yu(@$MqC#w_N5lu=L%M%wrIX5=QOx~WyiMf!kDL? zZtYG#=WVdFKf`&-ept|W>SD~FehA6KQW4+DoDQ_(X4|9F;NVQ)Bw|HM{}Fng*owxwc>@15zUN!Y0>V_SajKZFKPm>>Fbo@=nIn_qhuDr@34c=&~1y z|ChR(t553lIzIL5Il9kz>`%}AJPngUHkhMpg>e3nIM{>pl05h5&>hbeVqXgP-Wh6d zxfJoG3%j@4o`k;D3VW6Jw_#86!UY;0F+P*=E!?!!RW{pIcDkmM@z4hs0nfDlb!jQi zI4%NiEh3-7+6RkksL%MuMaHVTob9sirJQdB`D3lvO`FNXSq5?a@GJTw@Sz=NStVbz zUH%|oUy3%PxX%YV2ildr=*T1kv7Ft<1%4|rj@Z|_*`B=}c;3mq7XJja*P(d+%k!vj z3T~hsv?2MKA>ZkrkTWQF2LHfk#qV3%=ABKR#JK_QP3XLfuqN=YTym1~dMJx=)9=41XkMJJe9ai+tw0E#J;gW5 zt|hGXeDkOqicEM0^yAk567wFdI^nD^8=p16RNDQ#?dx?=J zEWl%Fvt)5T{Qu3j`p!z~huz14+kSfk?ic&vYHc%KaC5lV%*C9VS&ny;+fCgElY33) z|60#+w(Rj6&rH<+tIx#$Ep2ZB?mKjbG00dzXVy!=7r-ZIW^E^ZMlMaw#{qvAo^uWH zZqPmx<}0~|fM;95W942f@D9oQ6G=G>O8zc!nm9MdGjpU%tHa0>n-VgMd@i)-+J?~I ziW?fUuWxAlLPbO4EnkN}DC+~KEa@5l_tO@#4Cv(n_+>_eE)bUnT_6W%oU)*&;!G8D zMz8z9LjjK)u_jj zgK<>S--I0gwDH*{?{UoG??@5mIT|*}XYg#Q;s5b|+z&m|7`Fs^{*v2_anKbEz{8I= zvvE$&$Muo5Nr}r#V>8HDL$_VjfcehA7@Yhn;H_B)0C$6J$Dp4`3^{W5bAF6x!22y& z6Qc$HIY*7Jc_M$QGbhgQX0?*f>-uXn{)i3WlyPKZ4)WuJZ{#|<0N`_ydl{e`_~H~? z01wVj>brH>X|-~v0MD7pIZ@Qz@@eWiefJ>OeDPMpN7+o79C|DfTU=$A8@>qO3OzR? zR5sGzc-dF{EqE64di>P0sc#eRfK`U(a)Enoj*PT)?&sA?H-(hY}f8(9`pg)}L z#d*gu$kUYRZNMFFKjVMd(_Uq?i9h|DMl;?c&gk8S=x+?$DHne5&weR8^3X3sp0nqw zb3)|j9{-|I@QEa!jcfKo4j3q73y;s^U5UT}6M9z;aAg#$U{|Hltn z3xuzK&5yd};mdyKk6efP*I($5%*R;@taAisD!J~FF~+pUTI6y(WmGp_4?h2vF{9C2 z=8uj+jMBT4{5EoJhF7}vbzOahKUDj?e=+KFjTfVS3+lF@UJJ?sZ-SuRKnunP z+$aYRsS$k|V_kx=g1)UK7^7Z`a-MDD`vG&i4f$hj_(S+y;}Xkb4wcSxXI*tWRp9eh zN*mMAHtyj?K55+s+mrG=hB5z-&&pms{FEiIKRW@Z8EM8*ha9IhPJPyO%U;lJm+&Rm zy$%D`pZ8i}{c#s%E^z?+H?nW>9OAu5m&Nowk~X0$YdY_MKG+bQuWW6^<8vKzIcGeN zp^au|ETLMD;3UR9PIR6Q;GM>6D;AuKapzI5N*%LP9_upORellVnIU+OdPCJ=8MNKu z)I%F{PE%(#-iusy$_wnr7;}KP^|bZe&%|&fW&f6W$rd=U9gtkuT)aiC8)nH%A%a=7S2(CtJV+L&#A|dLJKNbD=*S z9zq6qN`c2$@*DSt;J*o)%)>a=<2U{DdH5cNXUr2qpPFekeL0BVjQQnn=2@Ske=o)F z8vT1ceosT+g}}d{>;u53?ZCs@g1ggK8kGXC+mNT_IkW}FYju9PmpF=;9KmVi?7Rf7l7>mo^E~|U(U`xd z@eANrtDdUi*;4F%R87h^9)`??F85C>)V{3u;FQg$J_!HjFT9Vbr1q_kUnw?mzGy7Y zZk8hF*es*6I06`TfH%&9KM#A#I@b4`@Y#sLnY|Zy^KJvqXG1r?IA8m2sn1sdwn6S8 zFyEirNARorhnfuL?6j_2VC2xBj50y!k0rJbcxE3VFV4nq-s9}SZ`d4OiM_GEFXL9{ z*H*!XGrYtJPoN#|P1MJDL&k-E;2m?jd67c`aS>i$sP(dj;#{0vt1-;$;)Xf-ZP?+X zMK%z}YN9iZg5v$qUmoY$z?QW^d-I_;JocrnSU>197v98mL)jd$6(9N14*k4H))V`7 z^pE2_cX{~nz5vc2Z&k6DM!?R-e&A1ods&nYfKKHoCv z0HsD9o^2DGu-#KR|FVa;u1*;6&twSwk(FG5$f!3TYz z#*r*Hk#-fHU!{FQg}?=shsQj>DEve=@p+Ebh`F_Cxe9)RdGz5wVW#g+IqPNWtFQ&x zmgJ8U-$U6`hrv^kkLIb(+@lR$pH;%ed3`Y(y&^EN)u z;eQz4w;M*|Wx*;t_SB*1rlZB42rGXZW&hRgsLRdc)q$Rra5rI@ox9Rh9kHQ@a|yfhxQ6sUx9x zt*Xd9Pj!c0D5zR|ol%2vQ)i~H3HJc^FZ`46{&!+ze?Pj3OOz7c-OXfpvgBLBi&Il}l zT(5|S5_inx0&l||?_*ttHCnjW6S$Dqf^{rj1AV{LsDTe?8a~yapDfXR+E4ljckt~# z%Fm7DEiON9s$P%#(Pq*{hn*^S*&z;>eoXOUDnC{0ZnTxwuU`>=wx9M}nl`yF<7)H$ zEh%kAPSfUEX;b_A5<0rET0?XUF&L=<9>Wx7_i64l(D)kZ&jb zoRLpDl<-N?ZXv9oXE@^ojv$}izg1J04}%$CygaXivkKVXSMP%IPV*Pa*2K6IcF@@c zL8Fy&6AG6;N%y#8tMAOmN)2l$su+o1!aKE}d0 zQHj-T#GQ8-PqtfT$=oRm2}?bup<&rNdf;0BiN1ap{`_RwP_RtEk$1*HpAvly`^tnR zeF2bv9idajl=muMt7q-;(Ee-Ts}cR*AMznC#5gJbA*;+!l2PF{t5b{ljB^wUi*;zcz?ehXAbL1 z8RVX_%hqOzOkk`O?I-iRCv{wMUC=zg(U}W!xg}%$@EhZo{BDe|O2sADTyynYdDpkh z6>xRVvZ=Emdd`fi;9R+8qI<*wM}x+x$(paJ*p`%g2E|WKTS3z!bpXMmjeG=`eF{E(a)m?@PdKK>Eua!E68|**u2a6db4yjOLt`%T2R`7y;!NU1Q(!gT1*=>Qt894& zSOIj|{#d^G`@lN#jXI%EE!@pAZv$5`oV=~Nzwa^#tguh~e@g3+) zNAP_gz7OI1tN8B2_qXxgi|>EN_fC9&qqIG~4fPA4EAu`G*$o zzf=3?e|P)t-+ByYAAA*N5!MGf*`=V-KCG$S$Bo~+AU_TPKRg!R1Hc#7EW$e9uN-<%(9# zdg3Gg7h+74*#~g$5TBvWPBl*GR(P(*b)Jg9HF1ZL_*X90|MQ%2p-v<4j`&)s`^-n5 zkT1qT;bA>SFMc0)^>hKl*vb1hY2&pv-GMy`&aTFHRcl{j}e|$ zwmQ#>m8iWE<9L2i4d-OEHlGW9C+Qn(#6k z^(ry8e6C5L=~Nf~mn7iXerg|JRl_;p-Y?8GUV{HsDSb27TrjQeTR30w4i`=LyJ)&{Fio2WftUMIJ`L)B+IOjCPxF7M`p$EH3w@_)!zshD zC4TS1xcK3-x%zvK`j$E9ckcO^q2&8SJFfoNf1)iHEZk)izf=3if79K+t6gUdW_R&s z>hWd^zCHME#&-t3CFT+S12b~zPs<(J5WL%T%2N0Fd`0f_v934F`g6g%SDnh`z6kJS zm#nj<*V1<6#{_LMPaJ6B5bxp9I1M^880$sdGmG|ku`M(M-U6CM-{0aRcvp7ZIKdtB{ar-f1FR!M(bGEm`YpT4KCU$PeWV4 zEpKber%?ST-VJ(}TJ|*mhpO*97rX{;rt8Bg!*_|_Ehx(mpMhrNd#r9CA2OLZitmQd zm{D(pj1g~y0!MBF-upviM*73g8&y)S-CP%b>%beJ!8Hk)0Qw`(7Mx1TT|6`CkD1KA zA!iTrJ;t!37;*t~8c4tJr3w8Sr=0t1m~Y->%m8RX?%W0~zO3n&x-0kq?zT~M#r`)d zIy!;#5OU_A3;obPr|1l@N|{$?$op5Bm#WvloAsD)AN|RlL*chP$aQ#ZtV5ScJ`}Ii ze5E5a=3T(*fCH6h=(H_IgZ?_auklC+bt4c~*u*ROJ!vuerP?bGWWX%M>MDED>`?IT<<15hP zodZ~BQBN!5_loSQaJT3@+09<)9oHjSc`+rIZ0hj^N-2gBcdM1K7z)798j@n z-hxTMOtf8v`j?8XM;*?wyNu(@l%1t~2o>@FT;bwbw6}JM&%`+Nux`(X_RN9(o7N;7 zF_pj<%9=@^$ljXL6+@1!Ij;71s4HTea@L|9dpGd=p)UCAf6c@gv-uytZ*uF7lqKOk z|JC462ji_YM=8^9!U$(u6oIgGX99+jM5H%_Sg8E}p$5et2r z_9?oS;eV21Nc5Kq$(AFNva+%MEQw64!i^^sM zTu=33FNZcJe9fyigntJAcWmXh`M>>D1M`0a_eQfn;9_!|_z!!&+37RY_lYsgp*&FQ z|Itj*TQJYarH?H-bG_vld~T4@^N7!8mgF2T{7;N?lnc@G9n3JDfDYiS?3L1y*LK{KS6KScmr@tdqmW}vQ z%oBU>knzoKybkmz`vN+g#8VKrQKp-1k-p{b3m1L6Wp=3PvIgfotBanf0~EM)fI^Ii zHW+mP?ni$Yedd%J6mHAHe!FjWa!=^d5}_&Jkrm5V=L(GX#unw$w$AJtP_NxrVC5M8 zqFn4Pj3T{dQa?=X7jXvfKo?hgYUGc&Z-@SUo==*?zED5R=jbnhm=epP-Q5?ru@wUP z`{M$Y!#=aH8ON|&RX?(KkTO5?b3o)b+Qqp<_VZuc*$-$;;sS%lpHFbCq)*k(xpJmm z_Z>vv0c$g8z0ZhO#NT~U^?PnN`u(yl-=)SI#$C%Y-s}>yq)F z+rWBgSNIC%ndqzLPjU7&UDv5XoiFJ+hNwJQZ}`E4JdQ1IW9}Zi_VK0RZ&4N>Sd4o3 z9=W!2`AjK_>oISf&Pv4c&6jG;_KN4 z*TpV-6!(zjt6WybfzfK58SB!|=L*?V4H|vNbh(&&KA=IrWgyNUxUAMbqmFuury?Z=&g--kh8Hp(6LHKrMy9Ks9O>st?CD~>9Jdv_V!X1| z`|eU>Ia_>uieI$kC1JUr{DHco<_|}T*lvGrM)uBPuI1UT^=}#Hs<&9zD^c(~GPcCH zzF|FaRXUq-wyqvg};x&6lRY>rQj>8xGub+y6&ojr2E zvkEw`*Z-__$+5d(xvx>fMC0X$AF%CSf#X>!#zN-nhU31ex{jsb_~9NG9IF6F(gfjH z<%VOg!0@bb$#EoP9Q3Qb#}o|Ru?dfA7;^7uFMLsI&4~}v#%hH-#2M(Rpc~T2;SV%y z%Y(*;W6u<}9Pi#wh(p6dZnz3viEO=MF5!zc)$~71(f8O4tKJ?+!+BS$qI zX9SHs+wC!k)3*`p(C+Qx8h={a84SmLlap|~Qs$vzfcCzp;Na!C0@}!a#x`2qPchyf zUcA~c(~J%4zUL~9r;@WVJjuz~i2ETfh3(J^{s>qKyx{nPj64srJ6qw%LHH( mA& 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%0DN!?lxvlp$+T)aQ4Q|+fS)iIRoJpV*Hx2 zM$Decl(k&@=pV`~3W7_hLfy(-Jsgg1?XV$Nw|=>VwZuI;^o3qNBYs*FuZ33?O%*3{c_J3F@15*1h^|Y{dmuna5vcWo4k*#U+%ft z`{)vWe9tZM4FmiO@0smu=6B?qz0?95K0HS!!1xif=@luxGNo6g^y-wZF)A)c{TQ4` zIkRMQ5?n8)yh|3P^u;NCiI}nLlBHtCt4r31PlY#%tAb#vwUPPHoI5q~pD}Z4;se)C zohci9oH|F$+&VS!2ivKM52hzRn4b7>4&10~C%{eO^8@>*MfuL>O``{+&_rvSN z55kF`rf*K^Tf~n9LDtav{V}+unEPj2i=TuGQhH%ZSKWif*tD1aG~7}AEZj}}99$`0 z3Xc~*4|9F&!wYbum_M^C#4o{X#IM0?#c#kHQ+iV0*Ms14ldWFZU!E_<{_>=b{|C29 z=}CP}ZzCO_FHh?J7M#>~CEQUq@4!hNO)p95rQ&zd%f#=&<>L3@3h@VURZ6c;>58S` zLu|%N{{)^WZi2Jo&*14|){~bn5&sKbC;kFnFaEdx)1`4+eGMn|`VU+sn+IVF)i5=fkVT&0y6fj9|*O zx`d{05u;yeXnISS|Kj>$du1ExX478!XjuIiZU@^OWP1)i*M#@{H4_B=v1R>y&l_+V zoDaV*ws~zWdoKfmh&p)ud?`E>W{q@jLl%fX;eshyVGu4@<8v!>Ww_wuOb{>! zng0vEl+K*HV4cso%r)VHudulQ8}7T{2e)Bf2p9b5HjLrnf}gNq3^bei&}|qG!}`c= z7_Y+mJZzTAW=ELk-M)XR-wWn>w>s8$@@p9r!un#rmgg?4?~IN7tncYI^h;QuaU1KG z`d;EHSov?uLdvziZWjbsR*Cn8CyGs=?hc(l9awI zrLRiqO(}h2O5Y-8t$S4~@gcC#SB6E zI=)?9F2?riN-;iMoz%tjq%Nk5_;5{YF+NS$l%|tQ2T~n9Rle(Cm^qu*( zST^RvGO_u#F{LMUF@3Xie4C!X)qZ-*l%Dh*zD+NZj&IY8#rQD2Dy3Ja^l@T*o1WAK z-=^0}$A{^Q#HJ_yo4!Q4`L;rA_i7TGO;Q(Zu1$Q#=Gua-HrMj^xWCM%RBSdCDVv&< zO*UmSJ7tr!vz4p!zXR_D?+kwq+c?%1 z-Ut`MoSPX3TI{Z~rG&`vd{{ zR!-WaA9}HL=IiT{HYta*(wTp+s}nPaUbkF43|=Q56$CR{iy1R#6sGjp6?|xq&VR8# zjC(Wa@0c0)W+eBeZD&-a^lGu`t@aPJaJKUd4;-7)$2zy9jt}@bqWC<+19j3@pnv9U=NT3r z=4|H~7M44k4-0Q{w(|@NKi;Z8xUaLFXLzvM+0HXOsP9$nJi~*kqn&4XsGHl^d4`Ad zeXgBnc-%~;&+zat*X=yR!}FZ&EaJoR!Ok-@9N@a0XK2v()OMbsLElr` zd4@*AUYvrSKe;N!vd5sdFLc85ZgLcRSCpNat1TJi{WLE7+qE{?_g7Jj3H%o$Wls<5Odf z&oey!itE-dPpGZzJi`-%-Nw!{JRu+KJi`ic&)&+w$qY}k2* zC-wcioo86AGaGgmak0lwe4b&k&ehm?hNt9%oo9GzxZmr@DX{v>&NDpqrR#Q{;jf1~ z+j)k+UgB)$8UFgBvz=#nT4x*VJj2sNUAOZLPv7cn=NX>XSrj|Zu;eeUTbnF7MK+vg zSfV($^9)PYxo+nfp3!+2JJ0aUxvtxJhG(93w(|_n<~!SYhG+Xb+j)j(J!azb49~vf zx}9fuZVzYk;knbC?L5PC4>;R-hUdOUqVsoo9HVmFsq%;RV&*&NIBQ&~@|Ygym8Jj2U-$-V|w%-eZ}mlgAN zp5f)6+{Vr`ywcOz&NIAnwX>aPcx9Edoo859;B4m^mdOV@&#lK zrD4GQJae|0!M))*V&;^Y3&qF6E5rkW;CjtpmLp#uPa#}81g5OG9MhTqVm3XVHn15E zS4ij2>#M}f@7GTip8{*1wcPXiCDO6Iewnx$PW%}IH%T80uNR*IZxo*$1UDF39c$p$ zDZNcfFA$%HP2%%~aH;f*V67AEOWPZ=(kH=58%~DjNWTQG6H~t%8pM~vi^Z42NxiOw z6aQ=BO|rQf-a?;tDT>bzSPZ;cmihhsz^g;W1?bHC@wo!#f>&#@{3E}t)2f5;wJGq9 zfqlZ)u7@8I&x7fAKH+N(uz$kkEnx1;CtThZ_D{HcKD>YYmvH%WaJl#mc)0j8xHC-r zFW(HaF0wtA*LQ?j3k4Z?U$`60IRAPvd<=e8!2@7x`!e`kxH}FQ-vqPnZB_~2pRqFH zbNwDtq=5$?){hQbNn)!xu_&RLx&B}T6ZrKch z>tr(rzDHaK-|KA8{+kPm;yXok_6IS1T@auh-sPvDxA&3N%==vnbU;o6iwUAz`O zX~Qqzc`3b4YUbZUh~I#5qxA2 z#5^L!96Zq{d`t5he-Gc%8Y$)_FK@N^Fy?s8zf!q?t@&40ZM9i>ud}WBSFYWvza2Wa ztO~-neXfkx{BIv4eFgfZ&bH=%`*mkq^S`Zin)&li2iI-Q|IQ@mSbyHx*8K1M=4@;J zcT1gZ&Ht|IXlwp=-*w&A{HwG^vNivzv98;if0fqNw&q`@HPXP@LHG}?fo;wI5BXqg z{(rpW*KS`FgzstnX>0!XwEna;|9f-Y#@77rt#P(B|N93x+nWFV8fRPczyDWfTl2sF zKWAI>uU5Tm&A)n<>$c`!{cq<^r9t>XCujTpqYtJy+nWD_rOvkI|1i(l*8Cr8eYHm; zJkxbs^M9zdpRM^n+CA3eHUCFi*IE02q_(m(|3_cBjjj3D$Ol{VubJv)+M0ij*44J= z|5$mDt@%Ih>o&IL|M+@mTl0VXk*@8_@fwexc+LNb)^E1v|3p66n*S5632n{)srt*- z{GTdUwKe~zZ+Mxu=5N}~+1C6`Cpz1jzv(__Tk|*l$Jy5W|Lo{&YyN*~4Qy-ve=c_2 z+T@@Al?`kD&lKmj=Kt(U*KN)J*(=Vr=Kp*fXIt}suKdE*{GZ?Lx~=&?S6*yu{{ayF+TizmD|{w|LgsoZO#AnL}y#`fBlTJoncAGa{=CF% z{%^YYI^V|OZ~BTS!N>cWe-+QjH&w3RLcD!5-t~7G&%c=_d)oY)>->GrdouoiQ%8=_ zGKk`9-#B0g_5$-_{Y&&2L1fo%*ggAu?y%wD!XUVdo}e!_4A17~4(;MOf*+NJ0sB!m zwKX%?=8hp^@{5~>r}Sj*HoY>XSEcNeIoir$9NRFiDC9etcs|;2S;oGziq{nzuGjoE zQP+0GW|H`5c($1JO(}hCN@pDqw_66AWDQ{U8&mowvFV$|X3U3J zorq3YZ_NLLZuZmB5BP&__H)qt|3NqVdFW^UK{xw4-OGGiC?+?&Ws#URxn)^OUm>O+ zZdpT_*AaUe`kiNa<2;}TKhJ|7gL}e^4;zC!y5A2`^5$D6TXHtAHIFk*N`^me7m>^V{)0KkFxl@ z*%aEgHV9_76r;~>ozmN+^rYX-rXXcgD833kiHEDd#+pQ3%T@qNQ@S7bO~ z!_UqC55(sGuVS9r@3zmfA%G3-@ZH{-Ah-geJ-<7|>uB}*u7lTcb_IN>*D$sJ}V{mc4)_DbpNVC-U>^)P>rnKl2d`C``mx5l@j{0;Cp>EFZS#XrI` z#XrGw#9QD+;$PrKv6a8cIgDWJ?7kuQyseme9Y(u(UBd59%me{>mVF2G-B>Yeo9`|b z)1Kd553j+-_;xXE``rTgV{~ge%texLjA6Cd`1v(op5Q{~^TehK$QuanJw@Cxz%K`@7B_B%TV?)3`4Bc}^n z@N;XQ&EnlSR=W+n4fHABvL3l8FH+VjLh`%@H`v<))vCj|5{|0OxcK?H< zFYe=BNnbC7mtoToJ7Ui8;aTI7Ijhj$%+vdbCjRFx6&J%vU5Nj=P11?~x$DHl|J*HN z;(uPg_p&2K5b8*VM0 z3YUuSfh#$h-;B5|BQ}V`9}Xv0`}6ZQ@G;_@;W9D%4?k3jcZF-<0oXI<{BV(&@#=>w z;DPAG{0}$4Si-ohWA@Mna&gg-o)vVSpU z|GL{#ukeRAWN-EQKk;~YMG=KFZj6KfUL6|GH~meR{KELhAjJi7W1Cs{;~_8GpY{oV z?3Ln^Q#>u^c#rGHmtD6#uAiE1wfU*Pv+Z&Hq&(Wn{ONwzTUNoo7ZmSt{nR9VMG$V@ z*V*>CHtRdS*5t68wcldpY}R+aw#W5f?X#Kw-_a`PcDUZz_PGB0m9y<}{ZDnYJ+A+0 zZ_4(#{-^yG+vECqJGZwzuAc`x+aA}?w>aA#*UxL5ZI5e~Teb_Ac1tih|QzXOAli^qnJnTv4#m^*tJcC_KWMJ+3Ic*qJ@9 zC|nw|?Quns_6lhKC{kOo#}!34xD9(;Q6wMO+Eqw&3|)dk1J|1z?nU+sD<`G*yD;?{KIwjxT2QYA7hUzYB|bvYm=6D z$>w2Lan2rBv`u^0+2e|~(HT+z1IxD9(;(Y78l zw#OB1x3lZ)aYfr{kIsD9?jG0K~Te{lD(h@;AO6}#}#d_GTGyb zwm;o<_PC<$A9rStE81SM%^p{@L%HkhaYZ|*?(A_zJFIiv{MoU)bLU#v_hxO6E86k% zShqc{sI~S3+2e{@&v1M8xT4mICHA}z1fJbPTx&Wd^VxT0OUx($0=(Js@R+2e|K`I|F)Tv3}g&g^kTZ7QAF7JLvn z?^{7+_PY))4B}jdw%v77Hh0g89D#fBVa_E-m>*BKa2r_b8OxF9&z8+@F!OF~Z~DBH zUZ2t%Qu?Blz8D{77RB!$wmR;5PsV?*zg-aRR+SBc?aUUw3?3xD6|NND~8y%U|bj60;_szd5CE z*{a_~8^t~x%$8s`aYwj9d;~m6%)02VIpQwxJaJdJUd;XPY7}>eSBQJSNnQHDiEpJr zz>-D^~FhztH)>C&E+3re{-n($1{;?@nT}3QpRV_5a;Td$LxnYolw&!NuYl zm~!KLodZ{-^rTHpuabT)TrIu;t`$#&XNfO_>&4^n1 zVa6Fg(Vml3<~(>ZI%NhKxE}5co6Xa(f1-kOVBM?WQe9gYLL*cd`_`R&R*1{Sb(YB#9JnV7ZufU9dvDC%iIcvr5c*V8QB? z{TgvQ^rn=)Hl?on7(Lt zy|-c9ZZ~)v)|aB+s5V>;&#I2wIo9ng`jM1xHm{_(sl;w>pQzo2m!06fw&vZ@UdpY^ zX0JZ6jpgalURS$4d3vszngTX`;ddbIbTlzx^od3v<>RWVzh9__81y5$P^3%4Op zj|!Eek*7z6L$;PvsB^#M=~3Z7x9a;G;LKT+XdmT1Ct}5Q^?b!{YJV@o*wO2=S-d+?I$0|)1#t;T_;bEij>=ur$

^M+c~0?10Z?Zi7AkUZM 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%0A@LKVzAhW$tyc(`4<~Ksy>xzGd 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�r4!z=ze)M^&|Y$W9QA>v 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 2: + key = map(lambda (x, y) : x, self.stack[2:]) + key.append(name) + key = "/".join(key) + + self.additional.append((key, dict(last_attrs), self.capture)) + elif self.in_body: + if name == "outline": + self.outline = self.outline._parent + + def on_char_data(self, data): + if self.capture != None: + self.capture += data + + def __iter__(self): + """ + This skips the leading element, which really isn't an outline. + """ + ii = self.outline.outline_iter() + ii.next() + + return ii + +if __name__ == '__main__': + import sys + import pprint + + # here's a few OPML samples. You'll have to download these yourself + # - http://opml.scripting.com/discuss/reader$19.opml + # - http://radio.weblogs.com/0001000/gems/blogrollFlat.opml + + if len(sys.argv) > 1: + fin = open(sys.argv[1], 'rb') + else: + fin = sys.stdin + + data = fin.read() + fin.close() + + ompl_parser = OPMLParser() + ompl_parser.translate('text', 'title') + ompl_parser.translate('url', 'htmlUrl') + ompl_parser.translate('rssUrl', 'xmlUrl') + ompl_parser.feed(data) + + pprint.pprint(ompl_parser.head) + pprint.pprint(ompl_parser.additional) + + for node in ompl_parser: + pprint.pprint({ + 'title' : node.get('title'), + 'htmlUrl' : node.get('htmlUrl'), + 'category' : node.get('title', otherwise = '', parent = True), + 'class' : node.get('bm:class', otherwise = 'unknown', inherit = True), + 'hierarchy' : node.hierarchy('title', otherwise = ''), + }) diff --git a/plistlib.py b/plistlib.py new file mode 100755 index 0000000..b0b541e --- /dev/null +++ b/plistlib.py @@ -0,0 +1,502 @@ +"""plistlib.py -- a tool to generate and parse MacOSX .plist files. + +The PropertList (.plist) file format is a simple XML pickle supporting +basic object types, like dictionaries, lists, numbers and strings. +Usually the top level object is a dictionary. + +To write out a plist file, use the writePlist(rootObject, pathOrFile) +function. 'rootObject' is the top level object, 'pathOrFile' is a +filename or a (writable) file object. + +To parse a plist from a file, use the readPlist(pathOrFile) function, +with a file name or a (readable) file object as the only argument. It +returns the top level object (again, usually a dictionary). + +To work with plist data in strings, you can use readPlistFromString() +and writePlistToString(). + +Values can be strings, integers, floats, booleans, tuples, lists, +dictionaries, Data or datetime.datetime objects. String values (including +dictionary keys) may be unicode strings -- they will be written out as +UTF-8. + +The plist type is supported through the Data class. This is a +thin wrapper around a Python string. + +Generate Plist example: + + pl = dict( + aString="Doodah", + aList=["A", "B", 12, 32.1, [1, 2, 3]], + aFloat = 0.1, + anInt = 728, + aDict=dict( + anotherString="", + aUnicodeValue=u'M\xe4ssig, Ma\xdf', + aTrueValue=True, + aFalseValue=False, + ), + someData = Data(""), + someMoreData = Data("" * 10), + aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())), + ) + # unicode keys are possible, but a little awkward to use: + pl[u'\xc5benraa'] = "That was a unicode key." + writePlist(pl, fileName) + +Parse Plist example: + + pl = readPlist(pathOrFile) + print pl["aKey"] +""" + + +__all__ = [ + "readPlist", "writePlist", "readPlistFromString", "writePlistToString", + "readPlistFromResource", "writePlistToResource", + "Plist", "Data", "Dict" +] +# Note: the Plist and Dict classes have been deprecated. + +import binascii +import datetime +from cStringIO import StringIO +import re +import sys + + +def readPlist(pathOrFile): + """Read a .plist file. 'pathOrFile' may either be a file name or a + (readable) file object. Return the unpacked root object (which + usually is a dictionary). + """ + didOpen = 0 + if isinstance(pathOrFile, (str, unicode)): + pathOrFile = open(pathOrFile) + didOpen = 1 + p = PlistParser() + rootObject = p.parse(pathOrFile) + if didOpen: + pathOrFile.close() + return rootObject + + +def writePlist(rootObject, pathOrFile): + """Write 'rootObject' to a .plist file. 'pathOrFile' may either be a + file name or a (writable) file object. + """ + didOpen = 0 + if isinstance(pathOrFile, (str, unicode)): + pathOrFile = open(pathOrFile, "w") + didOpen = 1 + writer = PlistWriter(pathOrFile) + writer.writeln("") + writer.writeValue(rootObject) + writer.writeln("") + if didOpen: + pathOrFile.close() + +def writePlistAtomically(rootObject, pathOrFile): + import shutil, os, random + tmpFile = '' + + while True: + if sys.platform == 'win32': + tmpFile = os.environ['TEMP'] + '\\plistlib-temp' + str(random.randint(1,90000)) + '.plist' + else: + tmpFile = '/tmp/plistlib-temp' + str(random.randint(1,90000)) + '.plist' + if not os.path.isfile(tmpFile): + break + + if os.path.isfile(tmpFile): + os.unlink(tmpFile) + + try: + writePlist(rootObject, tmpFile) + except: + if os.path.isfile(tmpFile): + os.unlink(tmpFile) + + try: + if os.path.isfile(tmpFile): + #Try to read the new plist to see if its good, if not don't save + x = readPlist(tmpFile) + x.clear() + shutil.move(tmpFile, pathOrFile) + if os.path.isfile(tmpFile): + os.unlink(tmpFile) + except: + pass + +def readPlistFromString(data): + """Read a plist data from a string. Return the root object. + """ + return readPlist(StringIO(data)) + + +def writePlistToString(rootObject): + """Return 'rootObject' as a plist-formatted string. + """ + f = StringIO() + writePlist(rootObject, f) + return f.getvalue() + + +def readPlistFromResource(path, restype='plst', resid=0): + """Read plst resource from the resource fork of path. + """ + from Carbon.File import FSRef, FSGetResourceForkName + from Carbon.Files import fsRdPerm + from Carbon import Res + fsRef = FSRef(path) + resNum = Res.FSOpenResourceFile(fsRef, FSGetResourceForkName(), fsRdPerm) + Res.UseResFile(resNum) + plistData = Res.Get1Resource(restype, resid).data + Res.CloseResFile(resNum) + return readPlistFromString(plistData) + + +def writePlistToResource(rootObject, path, restype='plst', resid=0): + """Write 'rootObject' as a plst resource to the resource fork of path. + """ + from Carbon.File import FSRef, FSGetResourceForkName + from Carbon.Files import fsRdWrPerm + from Carbon import Res + plistData = writePlistToString(rootObject) + fsRef = FSRef(path) + resNum = Res.FSOpenResourceFile(fsRef, FSGetResourceForkName(), fsRdWrPerm) + Res.UseResFile(resNum) + try: + Res.Get1Resource(restype, resid).RemoveResource() + except Res.Error: + pass + res = Res.Resource(plistData) + res.AddResource(restype, resid, '') + res.WriteResource() + Res.CloseResFile(resNum) + + +class DumbXMLWriter: + + def __init__(self, file, indentLevel=0, indent="\t"): + self.file = file + self.stack = [] + self.indentLevel = indentLevel + self.indent = indent + + def beginElement(self, element): + self.stack.append(element) + self.writeln("<%s>" % element) + self.indentLevel += 1 + + def endElement(self, element): + assert self.indentLevel > 0 + assert self.stack.pop() == element + self.indentLevel -= 1 + self.writeln("" % element) + + def simpleElement(self, element, value=None): + if value is not None: + value = _escapeAndEncode(value) + self.writeln("<%s>%s" % (element, value, element)) + else: + self.writeln("<%s/>" % element) + + def writeln(self, line): + if line: + self.file.write(self.indentLevel * self.indent + line + "\n") + else: + self.file.write("\n") + + +# Contents should conform to a subset of ISO 8601 +# (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'. Smaller units may be omitted with +# a loss of precision) +_dateParser = re.compile(r"(?P\d\d\d\d)(?:-(?P\d\d)(?:-(?P\d\d)(?:T(?P\d\d)(?::(?P\d\d)(?::(?P\d\d))?)?)?)?)?Z") + +def _dateFromString(s): + order = ('year', 'month', 'day', 'hour', 'minute', 'second') + gd = _dateParser.match(s).groupdict() + lst = [] + for key in order: + val = gd[key] + if val is None: + break + lst.append(int(val)) + return datetime.datetime(*lst) + +def _dateToString(d): + return '%04d-%02d-%02dT%02d:%02d:%02dZ' % ( + d.year, d.month, d.day, + d.hour, d.minute, d.second + ) + + +# Regex to find any control chars, except for \t \n and \r +_controlCharPat = re.compile( + r"[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f" + r"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]") + +def _escapeAndEncode(text): + m = _controlCharPat.search(text) + if m is not None: + raise ValueError("strings can't contains control characters; " + "use plistlib.Data instead") + text = text.replace("\r\n", "\n") # convert DOS line endings + text = text.replace("\r", "\n") # convert Mac line endings + text = text.replace("&", "&") # escape '&' + text = text.replace("<", "<") # escape '<' + text = text.replace(">", ">") # escape '>' + return text.encode("utf-8") # encode as UTF-8 + + +PLISTHEADER = """\ + + +""" + +class PlistWriter(DumbXMLWriter): + + def __init__(self, file, indentLevel=0, indent="\t", writeHeader=1): + if writeHeader: + file.write(PLISTHEADER) + DumbXMLWriter.__init__(self, file, indentLevel, indent) + + def writeValue(self, value): + if isinstance(value, (str, unicode)): + self.simpleElement("string", value) + elif isinstance(value, bool): + # must switch for bool before int, as bool is a + # subclass of int... + if value: + self.simpleElement("true") + else: + self.simpleElement("false") + elif isinstance(value, int): + self.simpleElement("integer", str(value)) + elif isinstance(value, float): + self.simpleElement("real", repr(value)) + elif isinstance(value, dict): + self.writeDict(value) + elif isinstance(value, Data): + self.writeData(value) + elif isinstance(value, datetime.datetime): + self.simpleElement("date", _dateToString(value)) + elif isinstance(value, (tuple, list)): + self.writeArray(value) + else: + raise TypeError("unsuported type: %s" % type(value)) + + def writeData(self, data): + self.beginElement("data") + self.indentLevel -= 1 + maxlinelength = 76 - len(self.indent.replace("\t", " " * 8) * + self.indentLevel) + for line in data.asBase64(maxlinelength).split("\n"): + if line: + self.writeln(line) + self.indentLevel += 1 + self.endElement("data") + + def writeDict(self, d): + self.beginElement("dict") + items = d.items() + items.sort() + for key, value in items: + if not isinstance(key, (str, unicode)): + raise TypeError("keys must be strings") + self.simpleElement("key", key) + self.writeValue(value) + self.endElement("dict") + + def writeArray(self, array): + self.beginElement("array") + for value in array: + self.writeValue(value) + self.endElement("array") + + +class _InternalDict(dict): + + # This class is needed while Dict is scheduled for deprecation: + # we only need to warn when a *user* instantiates Dict or when + # the "attribute notation for dict keys" is used. + + def __getattr__(self, attr): + try: + value = self[attr] + except KeyError: + raise AttributeError, attr + from warnings import warn + warn("Attribute access from plist dicts is deprecated, use d[key] " + "notation instead", PendingDeprecationWarning) + return value + + def __setattr__(self, attr, value): + from warnings import warn + warn("Attribute access from plist dicts is deprecated, use d[key] " + "notation instead", PendingDeprecationWarning) + self[attr] = value + + def __delattr__(self, attr): + try: + del self[attr] + except KeyError: + raise AttributeError, attr + from warnings import warn + warn("Attribute access from plist dicts is deprecated, use d[key] " + "notation instead", PendingDeprecationWarning) + +class Dict(_InternalDict): + + def __init__(self, **kwargs): + from warnings import warn + warn("The plistlib.Dict class is deprecated, use builtin dict instead", + PendingDeprecationWarning) + super(Dict, self).__init__(**kwargs) + + +class Plist(_InternalDict): + + """This class has been deprecated. Use readPlist() and writePlist() + functions instead, together with regular dict objects. + """ + + def __init__(self, **kwargs): + from warnings import warn + warn("The Plist class is deprecated, use the readPlist() and " + "writePlist() functions instead", PendingDeprecationWarning) + super(Plist, self).__init__(**kwargs) + + def fromFile(cls, pathOrFile): + """Deprecated. Use the readPlist() function instead.""" + rootObject = readPlist(pathOrFile) + plist = cls() + plist.update(rootObject) + return plist + fromFile = classmethod(fromFile) + + def write(self, pathOrFile): + """Deprecated. Use the writePlist() or writePlistAtomically function instead.""" + writePlistAtomically(self, pathOrFile) + + +def _encodeBase64(s, maxlinelength=76): + # copied from base64.encodestring(), with added maxlinelength argument + maxbinsize = (maxlinelength//4)*3 + pieces = [] + for i in range(0, len(s), maxbinsize): + chunk = s[i : i + maxbinsize] + pieces.append(binascii.b2a_base64(chunk)) + return "".join(pieces) + +class Data: + + """Wrapper for binary data.""" + + def __init__(self, data): + self.data = data + + def fromBase64(cls, data): + # base64.decodestring just calls binascii.a2b_base64; + # it seems overkill to use both base64 and binascii. + return cls(binascii.a2b_base64(data)) + fromBase64 = classmethod(fromBase64) + + def asBase64(self, maxlinelength=76): + return _encodeBase64(self.data, maxlinelength) + + def __cmp__(self, other): + if isinstance(other, self.__class__): + return cmp(self.data, other.data) + elif isinstance(other, str): + return cmp(self.data, other) + else: + return cmp(id(self), id(other)) + + def __repr__(self): + return "%s(%s)" % (self.__class__.__name__, repr(self.data)) + + +class PlistParser: + + def __init__(self): + self.stack = [] + self.currentKey = None + self.root = None + + def parse(self, fileobj): + from xml.parsers.expat import ParserCreate + parser = ParserCreate() + parser.StartElementHandler = self.handleBeginElement + parser.EndElementHandler = self.handleEndElement + parser.CharacterDataHandler = self.handleData + parser.ParseFile(fileobj) + return self.root + + def handleBeginElement(self, element, attrs): + self.data = [] + handler = getattr(self, "begin_" + element, None) + if handler is not None: + handler(attrs) + + def handleEndElement(self, element): + handler = getattr(self, "end_" + element, None) + if handler is not None: + handler() + + def handleData(self, data): + self.data.append(data) + + def addObject(self, value): + if self.currentKey is not None: + self.stack[-1][self.currentKey] = value + self.currentKey = None + elif not self.stack: + # this is the root object + self.root = value + else: + self.stack[-1].append(value) + + def getData(self): + data = "".join(self.data) + try: + data = data.encode("ascii") + except UnicodeError: + pass + self.data = [] + return data + + # element handlers + + def begin_dict(self, attrs): + d = _InternalDict() + self.addObject(d) + self.stack.append(d) + def end_dict(self): + self.stack.pop() + + def end_key(self): + self.currentKey = self.getData() + + def begin_array(self, attrs): + a = [] + self.addObject(a) + self.stack.append(a) + def end_array(self): + self.stack.pop() + + def end_true(self): + self.addObject(True) + def end_false(self): + self.addObject(False) + def end_integer(self): + self.addObject(int(self.getData())) + def end_real(self): + self.addObject(float(self.getData())) + def end_string(self): + self.addObject(self.getData()) + def end_data(self): + self.addObject(Data.fromBase64(self.getData())) + def end_date(self): + self.addObject(_dateFromString(self.getData())) diff --git a/pyDes.py b/pyDes.py new file mode 100755 index 0000000..2180f5f --- /dev/null +++ b/pyDes.py @@ -0,0 +1,751 @@ +############################################################################# +# Documentation # +############################################################################# + +# Author: Todd Whiteman +# Date: 7th May, 2003 +# Verion: 1.1 +# Homepage: http://home.pacific.net.au/~twhitema/des.html +# +# This algorithm is a pure python implementation of the DES algorithm. +# It is in pure python to avoid portability issues, since most DES +# implementations are programmed in C (for performance reasons). +# +# Triple DES class is also implemented, utilising the DES base. Triple DES +# is either DES-EDE3 with a 24 byte key, or DES-EDE2 with a 16 byte key. +# +# See the README.txt that should come with this python module for the +# implementation methods used. + +"""A pure python implementation of the DES and TRIPLE DES encryption algorithms + +pyDes.des(key, [mode], [IV]) +pyDes.triple_des(key, [mode], [IV]) + +key -> String containing the encryption key. 8 bytes for DES, 16 or 24 bytes + for Triple DES +mode -> Optional argument for encryption type, can be either + pyDes.ECB (Electronic Code Book) or pyDes.CBC (Cypher Block Chaining) +IV -> Optional argument, must be supplied if using CBC mode. Must be 8 bytes + + +Example: +from pyDes import * + +data = "Please encrypt my string" +k = des("DESCRYPT", " ", CBC, "\0\0\0\0\0\0\0\0") +d = k.encrypt(data) +print "Encypted string: " + d +print "Decypted string: " + k.decrypt(d) + +See the module source (pyDes.py) for more examples of use. +You can slo run the pyDes.py file without and arguments to see a simple test. + +Note: This code was not written for high-end systems needing a fast + implementation, but rather a handy portable solution with small usage. + +""" + + +# Modes of crypting / cyphering +ECB = 0 +CBC = 1 + + +############################################################################# +# DES # +############################################################################# +class des: + """DES encryption/decrytpion class + + Supports ECB (Electronic Code Book) and CBC (Cypher Block Chaining) modes. + + pyDes.des(key,[mode], [IV]) + + key -> The encryption key string, must be exactly 8 bytes + mode -> Optional argument for encryption type, can be either pyDes.ECB + (Electronic Code Book), pyDes.CBC (Cypher Block Chaining) + IV -> Optional string argument, must be supplied if using CBC mode. + Must be 8 bytes in length. + """ + + + # Permutation and translation tables for DES + __pc1 = [56, 48, 40, 32, 24, 16, 8, + 0, 57, 49, 41, 33, 25, 17, + 9, 1, 58, 50, 42, 34, 26, + 18, 10, 2, 59, 51, 43, 35, + 62, 54, 46, 38, 30, 22, 14, + 6, 61, 53, 45, 37, 29, 21, + 13, 5, 60, 52, 44, 36, 28, + 20, 12, 4, 27, 19, 11, 3 + ] + + # number left rotations of pc1 + __left_rotations = [ + 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 + ] + + # permuted choice key (table 2) + __pc2 = [ + 13, 16, 10, 23, 0, 4, + 2, 27, 14, 5, 20, 9, + 22, 18, 11, 3, 25, 7, + 15, 6, 26, 19, 12, 1, + 40, 51, 30, 36, 46, 54, + 29, 39, 50, 44, 32, 47, + 43, 48, 38, 55, 33, 52, + 45, 41, 49, 35, 28, 31 + ] + + # initial permutation IP + __ip = [57, 49, 41, 33, 25, 17, 9, 1, + 59, 51, 43, 35, 27, 19, 11, 3, + 61, 53, 45, 37, 29, 21, 13, 5, + 63, 55, 47, 39, 31, 23, 15, 7, + 56, 48, 40, 32, 24, 16, 8, 0, + 58, 50, 42, 34, 26, 18, 10, 2, + 60, 52, 44, 36, 28, 20, 12, 4, + 62, 54, 46, 38, 30, 22, 14, 6 + ] + + # Expansion table for turning 32 bit blocks into 48 bits + __expansion_table = [ + 31, 0, 1, 2, 3, 4, + 3, 4, 5, 6, 7, 8, + 7, 8, 9, 10, 11, 12, + 11, 12, 13, 14, 15, 16, + 15, 16, 17, 18, 19, 20, + 19, 20, 21, 22, 23, 24, + 23, 24, 25, 26, 27, 28, + 27, 28, 29, 30, 31, 0 + ] + + # The (in)famous S-boxes + __sbox = [ + # S1 + [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, + 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, + 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, + 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13], + + # S2 + [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, + 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, + 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, + 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9], + + # S3 + [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, + 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, + 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, + 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12], + + # S4 + [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, + 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, + 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, + 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14], + + # S5 + [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, + 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, + 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, + 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3], + + # S6 + [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, + 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, + 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, + 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13], + + # S7 + [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, + 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, + 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, + 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12], + + # S8 + [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, + 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, + 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, + 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11], + ] + + + # 32-bit permutation function P used on the output of the S-boxes + __p = [ + 15, 6, 19, 20, 28, 11, + 27, 16, 0, 14, 22, 25, + 4, 17, 30, 9, 1, 7, + 23,13, 31, 26, 2, 8, + 18, 12, 29, 5, 21, 10, + 3, 24 + ] + + # final permutation IP^-1 + __fp = [ + 39, 7, 47, 15, 55, 23, 63, 31, + 38, 6, 46, 14, 54, 22, 62, 30, + 37, 5, 45, 13, 53, 21, 61, 29, + 36, 4, 44, 12, 52, 20, 60, 28, + 35, 3, 43, 11, 51, 19, 59, 27, + 34, 2, 42, 10, 50, 18, 58, 26, + 33, 1, 41, 9, 49, 17, 57, 25, + 32, 0, 40, 8, 48, 16, 56, 24 + ] + + # Type of crypting being done + ENCRYPT = 0x00 + DECRYPT = 0x01 + + # Initialisation + def __init__(self, key, mode=ECB, IV=None): + if len(key) != 8: + raise ValueError("Invalid DES key size. Key must be exactly 8 bytes long.") + self.block_size = 8 + self.key_size = 8 + self.__padding = '' + + # Set the passed in variables + self.setMode(mode) + if IV: + self.setIV(IV) + + self.L = [] + self.R = [] + self.Kn = [ [0] * 48 ] * 16 # 16 48-bit keys (K1 - K16) + self.final = [] + + self.setKey(key) + + + def getKey(self): + """getKey() -> string""" + return self.__key + + def setKey(self, key): + """Will set the crypting key for this object. Must be 8 bytes.""" + self.__key = key + self.__create_sub_keys() + + def getMode(self): + """getMode() -> pyDes.ECB or pyDes.CBC""" + return self.__mode + + def setMode(self, mode): + """Sets the type of crypting mode, pyDes.ECB or pyDes.CBC""" + self.__mode = mode + + def getIV(self): + """getIV() -> string""" + return self.__iv + + def setIV(self, IV): + """Will set the Initial Value, used in conjunction with CBC mode""" + if not IV or len(IV) != self.block_size: + raise ValueError("Invalid Initial Value (IV), must be a multiple of " + str(self.block_size) + " bytes") + self.__iv = IV + + def getPadding(self): + """getPadding() -> string of length 1. Padding character.""" + return self.__padding + + def __String_to_BitList(self, data): + """Turn the string data, into a list of bits (1, 0)'s""" + l = len(data) * 8 + result = [0] * l + pos = 0 + for c in data: + i = 7 + ch = ord(c) + while i >= 0: + if ch & (1 << i) != 0: + result[pos] = 1 + else: + result[pos] = 0 + pos += 1 + i -= 1 + + return result + + def __BitList_to_String(self, data): + """Turn the list of bits -> data, into a string""" + result = '' + pos = 0 + c = 0 + while pos < len(data): + c += data[pos] << (7 - (pos % 8)) + if (pos % 8) == 7: + result += chr(c) + c = 0 + pos += 1 + + return result + + def __permutate(self, table, block): + """Permutate this block with the specified table""" + return map(lambda x: block[x], table) + + # Transform the secret key, so that it is ready for data processing + # Create the 16 subkeys, K[1] - K[16] + def __create_sub_keys(self): + """Create the 16 subkeys K[1] to K[16] from the given key""" + key = self.__permutate(des.__pc1, self.__String_to_BitList(self.getKey())) + i = 0 + # Split into Left and Right sections + self.L = key[:28] + self.R = key[28:] + while i < 16: + j = 0 + # Perform circular left shifts + while j < des.__left_rotations[i]: + self.L.append(self.L[0]) + del self.L[0] + + self.R.append(self.R[0]) + del self.R[0] + + j += 1 + + # Create one of the 16 subkeys through pc2 permutation + self.Kn[i] = self.__permutate(des.__pc2, self.L + self.R) + + i += 1 + + # Main part of the encryption algorithm, the number cruncher :) + def __des_crypt(self, block, crypt_type): + """Crypt the block of data through DES bit-manipulation""" + block = self.__permutate(des.__ip, block) + self.L = block[:32] + self.R = block[32:] + + # Encryption starts from Kn[1] through to Kn[16] + if crypt_type == des.ENCRYPT: + iteration = 0 + iteration_adjustment = 1 + # Decryption starts from Kn[16] down to Kn[1] + else: + iteration = 15 + iteration_adjustment = -1 + + i = 0 + while i < 16: + # Make a copy of R[i-1], this will later become L[i] + tempR = self.R[:] + + # Permutate R[i - 1] to start creating R[i] + self.R = self.__permutate(des.__expansion_table, self.R) + + # Exclusive or R[i - 1] with K[i], create B[1] to B[8] whilst here + self.R = map(lambda x, y: x ^ y, self.R, self.Kn[iteration]) + B = [self.R[:6], self.R[6:12], self.R[12:18], self.R[18:24], self.R[24:30], self.R[30:36], self.R[36:42], self.R[42:]] + # Optimization: Replaced below commented code with above + #j = 0 + #B = [] + #while j < len(self.R): + # self.R[j] = self.R[j] ^ self.Kn[iteration][j] + # j += 1 + # if j % 6 == 0: + # B.append(self.R[j-6:j]) + + # Permutate B[1] to B[8] using the S-Boxes + j = 0 + Bn = [0] * 32 + pos = 0 + while j < 8: + # Work out the offsets + m = (B[j][0] << 1) + B[j][5] + n = (B[j][1] << 3) + (B[j][2] << 2) + (B[j][3] << 1) + B[j][4] + + # Find the permutation value + v = des.__sbox[j][(m << 4) + n] + + # Turn value into bits, add it to result: Bn + Bn[pos] = (v & 8) >> 3 + Bn[pos + 1] = (v & 4) >> 2 + Bn[pos + 2] = (v & 2) >> 1 + Bn[pos + 3] = v & 1 + + pos += 4 + j += 1 + + # Permutate the concatination of B[1] to B[8] (Bn) + self.R = self.__permutate(des.__p, Bn) + + # Xor with L[i - 1] + self.R = map(lambda x, y: x ^ y, self.R, self.L) + # Optimization: This now replaces the below commented code + #j = 0 + #while j < len(self.R): + # self.R[j] = self.R[j] ^ self.L[j] + # j += 1 + + # L[i] becomes R[i - 1] + self.L = tempR + + i += 1 + iteration += iteration_adjustment + + # Final permutation of R[16]L[16] + self.final = self.__permutate(des.__fp, self.R + self.L) + return self.final + + + # Data to be encrypted/decrypted + def crypt(self, data, crypt_type): + """Crypt the data in blocks, running it through des_crypt()""" + + # Error check the data + if not data: + return '' + if len(data) % self.block_size != 0: + if crypt_type == des.DECRYPT: # Decryption must work on 8 byte blocks + raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n.") + if not self.getPadding(): + raise ValueError("Invalid data length, data must be a multiple of " + str(self.block_size) + " bytes\n. Try setting the optional padding character") + else: + data += (self.block_size - (len(data) % self.block_size)) * self.getPadding() + # print "Len of data: %f" % (len(data) / self.block_size) + + if self.getMode() == CBC: + if self.getIV(): + iv = self.__String_to_BitList(self.getIV()) + else: + raise ValueError("For CBC mode, you must supply the Initial Value (IV) for ciphering") + + # Split the data into blocks, crypting each one seperately + i = 0 + dict = {} + result = [] + #cached = 0 + #lines = 0 + while i < len(data): + # Test code for caching encryption results + #lines += 1 + #if dict.has_key(data[i:i+8]): + #print "Cached result for: %s" % data[i:i+8] + # cached += 1 + # result.append(dict[data[i:i+8]]) + # i += 8 + # continue + + block = self.__String_to_BitList(data[i:i+8]) + + # Xor with IV if using CBC mode + if self.getMode() == CBC: + if crypt_type == des.ENCRYPT: + block = map(lambda x, y: x ^ y, block, iv) + #j = 0 + #while j < len(block): + # block[j] = block[j] ^ iv[j] + # j += 1 + + processed_block = self.__des_crypt(block, crypt_type) + + if crypt_type == des.DECRYPT: + processed_block = map(lambda x, y: x ^ y, processed_block, iv) + #j = 0 + #while j < len(processed_block): + # processed_block[j] = processed_block[j] ^ iv[j] + # j += 1 + iv = block + else: + iv = processed_block + else: + processed_block = self.__des_crypt(block, crypt_type) + + + # Add the resulting crypted block to our list + #d = self.__BitList_to_String(processed_block) + #result.append(d) + result.append(self.__BitList_to_String(processed_block)) + #dict[data[i:i+8]] = d + i += 8 + + # print "Lines: %d, cached: %d" % (lines, cached) + + # Remove the padding from the last block + if crypt_type == des.DECRYPT and self.getPadding(): + #print "Removing decrypt pad" + s = result[-1] + while s[-1] == self.getPadding(): + s = s[:-1] + result[-1] = s + + # Return the full crypted string + return ''.join(result) + + def encrypt(self, data, pad=''): + """encrypt(data, [pad]) -> string + + data : String to be encrypted + pad : Optional argument for encryption padding. Must only be one byte + + The data must be a multiple of 8 bytes and will be encrypted + with the already specified key. Data does not have to be a + multiple of 8 bytes if the padding character is supplied, the + data will then be padded to a multiple of 8 bytes with this + pad character. + """ + self.__padding = pad + return self.crypt(data, des.ENCRYPT) + + def decrypt(self, data, pad=''): + """decrypt(data, [pad]) -> string + + data : String to be encrypted + pad : Optional argument for decryption padding. Must only be one byte + + The data must be a multiple of 8 bytes and will be decrypted + with the already specified key. If the optional padding character + is supplied, then the un-encypted data will have the padding characters + removed from the end of the string. This pad removal only occurs on the + last 8 bytes of the data (last data block). + """ + self.__padding = pad + return self.crypt(data, des.DECRYPT) + + +############################################################################# +# Triple DES # +############################################################################# +class triple_des: + """Triple DES encryption/decrytpion class + + This algorithm uses the DES-EDE3 (when a 24 byte key is supplied) or + the DES-EDE2 (when a 16 byte key is supplied) encryption methods. + Supports ECB (Electronic Code Book) and CBC (Cypher Block Chaining) modes. + + pyDes.des(key, [mode], [IV]) + + key -> The encryption key string, must be either 16 or 24 bytes long + mode -> Optional argument for encryption type, can be either pyDes.ECB + (Electronic Code Book), pyDes.CBC (Cypher Block Chaining) + IV -> Optional string argument, must be supplied if using CBC mode. + Must be 8 bytes in length. + """ + def __init__(self, key, mode=ECB, IV=None): + self.block_size = 8 + self.setMode(mode) + self.__padding = '' + self.__iv = IV + self.setKey(key) + + def getKey(self): + """getKey() -> string""" + return self.__key + + def setKey(self, key): + """Will set the crypting key for this object. Either 16 or 24 bytes long.""" + self.key_size = 24 # Use DES-EDE3 mode + if len(key) != self.key_size: + if len(key) == 16: # Use DES-EDE2 mode + self.key_size = 16 + else: + raise ValueError("Invalid triple DES key size. Key must be either 16 or 24 bytes long") + if self.getMode() == CBC and (not self.getIV() or len(self.getIV()) != self.block_size): + raise ValueError("Invalid IV, must be 16 bytes in length") ## TODO: Check this + self.__key1 = des(key[:8], self.getMode(), self.getIV()) + self.__key2 = des(key[8:16], self.getMode(), self.getIV()) + if self.key_size == 16: + self.__key3 = self.__key1 + else: + self.__key3 = des(key[16:], self.getMode(), self.getIV()) + self.__key = key + + def getMode(self): + """getMode() -> pyDes.ECB or pyDes.CBC""" + return self.__mode + + def setMode(self, mode): + """Sets the type of crypting mode, pyDes.ECB or pyDes.CBC""" + self.__mode = mode + + def getIV(self): + """getIV() -> string""" + self.__iv + + def setIV(self, IV): + """Will set the Initial Value, used in conjunction with CBC mode""" + self.__iv = IV + + def encrypt(self, data, pad=''): + """encrypt(data, [pad]) -> string + + data : String to be encrypted + pad : Optional argument for encryption padding. Must only be one byte + + The data must be a multiple of 8 bytes and will be encrypted + with the already specified key. Data does not have to be a + multiple of 8 bytes if the padding character is supplied, the + data will then be padded to a multiple of 8 bytes with this + pad character. + """ + data = self.__key1.encrypt(data, pad) + data = self.__key2.decrypt(data) + return self.__key3.encrypt(data) + + def decrypt(self, data, pad=''): + """decrypt(data, [pad]) -> string + + data : String to be encrypted + pad : Optional argument for decryption padding. Must only be one byte + + The data must be a multiple of 8 bytes and will be decrypted + with the already specified key. If the optional padding character + is supplied, then the un-encypted data will have the padding characters + removed from the end of the string. This pad removal only occurs on the + last 8 bytes of the data (last data block). + """ + data = self.__key3.decrypt(data) + data = self.__key2.encrypt(data) + return self.__key1.decrypt(data, pad) + + +############################################################################# +# Examples # +############################################################################# +def example_triple_des(): + from time import time + + # Utility module + from binascii import unhexlify as unhex + + # example shows triple-des encryption using the des class + print "Example of triple DES encryption in default ECB mode (DES-EDE3)\n" + + print "Triple des using the des class (3 times)" + t = time() + k1 = des(unhex("133457799BBCDFF1")) + k2 = des(unhex("1122334455667788")) + k3 = des(unhex("77661100DD223311")) + d = "Triple DES test string, to be encrypted and decrypted..." + print "Key1: %s" % k1.getKey() + print "Key2: %s" % k2.getKey() + print "Key3: %s" % k3.getKey() + print "Data: %s" % d + + e1 = k1.encrypt(d) + e2 = k2.decrypt(e1) + e3 = k3.encrypt(e2) + print "Encrypted: " + e3 + + d3 = k3.decrypt(e3) + d2 = k2.encrypt(d3) + d1 = k1.decrypt(d2) + print "Decrypted: " + d1 + print "DES time taken: %f (%d crypt operations)" % (time() - t, 6 * (len(d) / 8)) + print "" + + # Example below uses the triple-des class to achieve the same as above + print "Now using triple des class" + t = time() + t1 = triple_des(unhex("133457799BBCDFF1112233445566778877661100DD223311")) + print "Key: %s" % t1.getKey() + print "Data: %s" % d + + td1 = t1.encrypt(d) + print "Encrypted: " + td1 + + td2 = t1.decrypt(td1) + print "Decrypted: " + td2 + + print "Triple DES time taken: %f (%d crypt operations)" % (time() - t, 6 * (len(d) / 8)) + +def example_des(): + from time import time + + # example of DES encrypting in CBC mode with the IV of "\0\0\0\0\0\0\0\0" + print "Example of DES encryption using CBC mode\n" + t = time() + k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0") + data = "DES encryption algorithm" + print "Key : " + k.getKey() + print "Data : " + data + + d = k.encrypt(data) + print "Encrypted: " + d + + d = k.decrypt(d) + print "Decrypted: " + d + print "DES time taken: %f (6 crypt operations)" % (time() - t) + print "" + +def __test__(): + example_des() + example_triple_des() + + +def __fulltest__(): + # This should not produce any unexpected errors or exceptions + from binascii import unhexlify as unhex + from binascii import hexlify as dohex + + __test__() + print "" + + k = des("\0\0\0\0\0\0\0\0", CBC, "\0\0\0\0\0\0\0\0") + d = k.encrypt("DES encryption algorithm") + if k.decrypt(d) != "DES encryption algorithm": + print "Test 1 Error: Unencypted data block does not match start data" + + k = des("\0\0\0\0\0\0\0\0", CBC, "\0\0\0\0\0\0\0\0") + d = k.encrypt("Default string of text", '*') + if k.decrypt(d, "*") != "Default string of text": + print "Test 2 Error: Unencypted data block does not match start data" + + k = des("\r\n\tABC\r\n") + d = k.encrypt("String to Pad", '*') + if k.decrypt(d) != "String to Pad***": + print "'%s'" % k.decrypt(d) + print "Test 3 Error: Unencypted data block does not match start data" + + k = des("\r\n\tABC\r\n") + d = k.encrypt(unhex("000102030405060708FF8FDCB04080"), unhex("44")) + if k.decrypt(d, unhex("44")) != unhex("000102030405060708FF8FDCB04080"): + print "Test 4a Error: Unencypted data block does not match start data" + if k.decrypt(d) != unhex("000102030405060708FF8FDCB0408044"): + print "Test 4b Error: Unencypted data block does not match start data" + + k = triple_des("MyDesKey\r\n\tABC\r\n0987*543") + d = k.encrypt(unhex("000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080")) + if k.decrypt(d) != unhex("000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080"): + print "Test 5 Error: Unencypted data block does not match start data" + + k = triple_des("\r\n\tABC\r\n0987*543") + d = k.encrypt(unhex("000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080")) + if k.decrypt(d) != unhex("000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080000102030405060708FF8FDCB04080"): + print "Test 6 Error: Unencypted data block does not match start data" + +def __filetest__(): + from time import time + + f = open("pyDes.py", "rb+") + d = f.read() + f.close() + + t = time() + k = des("MyDESKey") + + d = k.encrypt(d, " ") + f = open("pyDes.py.enc", "wb+") + f.write(d) + f.close() + + d = k.decrypt(d, " ") + f = open("pyDes.py.dec", "wb+") + f.write(d) + f.close() + print "DES file test time: %f" % (time() - t) + +def __profile__(): + import profile + profile.run('__fulltest__()') + #profile.run('__filetest__()') + +if __name__ == '__main__': + __test__() + #__fulltest__() + #__filetest__() + #__profile__()