commit 204b655b0f692f2e9a35851b0a44fba0a9b0bf51
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 28 16:15:35 2019 +0000
https://gitweb.torproject.org/translation.git/commit/?h=donatepages-message…
---
locale/de/LC_MESSAGES/messages.po | 58 +++++++++++++++++++++++++++++++--------
1 file changed, 47 insertions(+), 11 deletions(-)
diff --git a/locale/de/LC_MESSAGES/messages.po b/locale/de/LC_MESSAGES/messages.po
index fdbb71e560..aa5512abf0 100644
--- a/locale/de/LC_MESSAGES/messages.po
+++ b/locale/de/LC_MESSAGES/messages.po
@@ -2098,6 +2098,9 @@ msgid ""
"Discover or American Express) or via PayPal, please visit our <a "
"class=\"hyperlinks links\" href=\"/%langcode%\">donate page</a>."
msgstr ""
+"Um mit einer gängigen Kredit- oder Debitkarte (VISA, MasterCard, Discover "
+"oder American Express) oder über PayPal zu spenden, besuche bitte unsere <a "
+"class=\"hyperlinks links\" href=\"/%langcode%\">Spendenseite</a>."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:467
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:324
@@ -2153,6 +2156,9 @@ msgid ""
"These people typically use a very small amount for their testing, and we've "
"found that setting a $2 minimum donation seems to deter them."
msgstr ""
+"Diese Leute verwenden normalerweise einen sehr kleinen Betrag für ihre "
+"Tests, und wir haben festgestellt, dass die Festlegung einer Mindestspende "
+"von 2 Dollar sie abzuschrecken scheint."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:493
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:350
@@ -2169,6 +2175,10 @@ msgid ""
" hire a person to monitor the Tor network full time, or research, test, and "
"implement ideas we have for making the Tor network even stronger."
msgstr ""
+"Mehr Finanzierung von dir bedeutet, dass wir mehr Dinge tun können, die wir "
+"gerne tun würden, wie zum Beispiel eine Person einzustellen, die das Tor-"
+"Netzwerk in Vollzeit überwacht, oder Ideen, die wir haben, zu erforschen, zu"
+" testen und umzusetzen, um das Tor-Netzwerk noch stärker zu machen."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:505
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:370
@@ -2181,13 +2191,15 @@ msgstr ""
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:509
msgid "You can donate by sending us a postal money order."
-msgstr ""
+msgstr "Du kannst spenden, indem du uns eine Postanweisung schickst."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:511
msgid ""
"You can donate via bitcoin or another cryptocurrency if you have it set up "
"in a way that preserves your anonymity."
msgstr ""
+"Du kannst über Bitcoin oder eine andere Kryptowährung spenden, wenn du diese"
+" so eingerichtet hast, dass deine Anonymität gewahrt bleibt."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:513
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:378
@@ -2199,6 +2211,8 @@ msgid ""
"There are probably other ways to donate anonymously that we haven't thought "
"of -- maybe you will."
msgstr ""
+"Es gibt wahrscheinlich andere Möglichkeiten, anonym zu spenden, an die wir "
+"noch nicht gedacht haben - vielleicht fällt dir noch was ein."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:521
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:474
@@ -2218,6 +2232,8 @@ msgid ""
"Our mailing address is <b>The Tor Project, 217 First Avenue South #4903, "
"Seattle WA 98194, USA</b>."
msgstr ""
+"Unsere Postanschrift ist <b>The Tor Project, 217 First Avenue South #4903, "
+"Seattle WA 98194, USA</b>."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:533
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:486
@@ -2233,6 +2249,8 @@ msgid ""
"Amazon Smile is a website operated by Amazon with the same products, prices,"
" and shopping features as Amazon.com."
msgstr ""
+"Amazon Smile ist eine von Amazon betriebene Website mit den gleichen "
+"Produkten, Preisen und Einkaufsmöglichkeiten wie Amazon.com."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:549
#, php-format
@@ -2241,22 +2259,30 @@ msgid ""
"Foundation will donate 0.5% of the purchase price of eligible products to "
"the charitable organization of your choice."
msgstr ""
+"Der Unterschied besteht darin, dass die Amazon Smile Foundation beim Einkauf"
+" auf Amazon Smile 0,5% des Kaufpreises der berechtigten Produkte an eine "
+"gemeinnützige Organisation deiner Wahl spendet."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:553
msgid ""
"<a href=\"https://smile.amazon.com/ch/20-8096820\" target=\"_blank\" "
"class=\"hyperlinks links\">Set up the Tor Project on Amazon Smile</a>"
msgstr ""
+"<a href=\"https://smile.amazon.com/ch/20-8096820\" target=\"_blank\" "
+"class=\"hyperlinks links\">Richte auf Amazon Smile das Tor Project ein</a>"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:559
msgid "Can I donate via Giving Assistant?"
-msgstr ""
+msgstr "Kann ich über den Giving Assistant spenden?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:563
msgid ""
"Giving Assistant helps you donate a percentage of your cash back earnings to"
" us with every purchase you make at 3,000+ popular online retailers."
msgstr ""
+"Giving Assistant hilft dir dabei, einen Prozentsatz deiner Bargeld-Einnahmen"
+" bei jedem Einkauf bei mehr als 3.000 beliebten Online-Händlern an uns zu "
+"spenden."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:567
msgid ""
@@ -2264,40 +2290,46 @@ msgid ""
" class=\"hyperlinks links\">Use Giving Assistant to save money and support "
"the Tor Project</a>"
msgstr ""
+"<a href=\"https://givingassistant.org/np#tor-project-inc\" target=\"_blank\""
+" class=\"hyperlinks links\">Benutze den Giving Assistant, um Geld zu sparen "
+"und das Tor Project zu unterstützen</a>"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:573
msgid "Can I make a stock donation?"
-msgstr ""
+msgstr "Kann ich eine Aktienspende machen?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:577
msgid "You can donate stock to the Tor Project."
-msgstr ""
+msgstr "Du kannst dem Tor Project Aktien spenden."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:579
msgid ""
"Please let us know in advance if you are transmitting securities via DTC by "
"contacting us at <span class=\"email\">giving(at)torproject.org</span>."
msgstr ""
+"Bitte teile uns im Voraus mit, wenn du Wertpapiere über DTC übermittelst, "
+"indem du uns unter <span class=\"email\">giving(at)torproject.org</span> "
+"kontaktierst."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:583
msgid "Brokerage Firm: Merrill Lynch, Pierce, Fenner & Smith, Inc."
-msgstr ""
+msgstr "Maklerfirma: Merrill Lynch, Pierce, Fenner & Smith, Inc."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:587
msgid "Account Name: The Tor Project"
-msgstr ""
+msgstr "Kontoname: The Tor Project"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:591
msgid "Contact: Jeffrey K. Miller: 206.464.3564"
-msgstr ""
+msgstr "Kontakt: Jeffrey K. Miller: 206.464.3564"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:595
msgid "E-mail: <span class=\"email\">jeffrey.k.miller(at)ml.com</span>"
-msgstr ""
+msgstr "E-Mail: <span class=\"email\">jeffrey.k.miller(at)ml.com</span>"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:599
msgid "FAX: 206.388.4456"
-msgstr ""
+msgstr "Fax: 206.388.4456"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:603
msgid "The Tor Project Account #: ***-*3016"
@@ -2305,11 +2337,11 @@ msgstr "Der Tor Projekt Account #: ***-*3016"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:607
msgid "DTC #: 8862"
-msgstr ""
+msgstr "DTC #: 8862"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:611
msgid "Tax ID #: 20-8096820"
-msgstr ""
+msgstr "Steuer-ID #: 20-8096820"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:617
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:387
@@ -2326,6 +2358,10 @@ msgid ""
"required to report the donation amount and your name and address (if we have"
" it) to the IRS, on Schedule B of the Form 990, which is filed annually."
msgstr ""
+"Wenn du in einem einzigen Jahr 20.000$ oder mehr an das Tor Project "
+"spendest, sind wir verpflichtet, den Spendenbetrag sowie deinen Namen und "
+"deine Adresse (falls wir sie haben) der IRS zu melden, und zwar in der Liste"
+" B des Formulars 990, die jährlich eingereicht wird."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:623
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:393
commit 07fc9afbc6f8cc141eb7d389502ce223d88ec2b8
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 28 15:45:37 2019 +0000
https://gitweb.torproject.org/translation.git/commit/?h=donatepages-message…
---
locale/de/LC_MESSAGES/messages.po | 213 ++++++++++++++++++++++++++++++++++----
1 file changed, 195 insertions(+), 18 deletions(-)
diff --git a/locale/de/LC_MESSAGES/messages.po b/locale/de/LC_MESSAGES/messages.po
index eff6967a93..fdbb71e560 100644
--- a/locale/de/LC_MESSAGES/messages.po
+++ b/locale/de/LC_MESSAGES/messages.po
@@ -5,13 +5,13 @@
# RiseT, 2018
# Ettore Atalan <atalanttore(a)googlemail.com>, 2018
# cy Berta <cyberta(a)riseup.net>, 2018
-# Emma Peel, 2018
# Traumschule Riebau <traumschuleriebau(a)riseup.net>, 2019
-# c8faa9c4b9d81319c5c2fd62ae3a9956, 2019
-# John Weber, 2019
# Not AName <atzeje(a)web.de>, 2019
-# erinm, 2019
# Philipp . <Kuschat(a)gmx.de>, 2019
+# erinm, 2019
+# Emma Peel, 2019
+# c8faa9c4b9d81319c5c2fd62ae3a9956, 2019
+# John Weber, 2019
# Curtis Baltimore <curtisbaltimore(a)protonmail.com>, 2019
#
msgid ""
@@ -236,6 +236,8 @@ msgstr "Möchtest du mit Kreditkarte oder PayPal spenden?"
msgid ""
"Thanks for your interest in donating cryptocurrency to the Tor Project."
msgstr ""
+"Vielen Dank für dein Interesse mit Kryptowährung an das Tor Project zu "
+"spenden."
#: tmp/cache_locale/ef/ef5649de7f8cead2eb5ba30c5d2afbe4e1ea84df12773fd2513ca8f8823e3fbc.php:77
#: tmp/cache_locale/cc/cc2e1dd4edb96c59a6514d676ca3f562a2a9a2cd34e2c211c03fb08b3e664469.php:133
@@ -727,7 +729,7 @@ msgstr "T-Shirt"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:226
msgid "Get our limited edition Tor: Strength in Numbers shirt."
-msgstr ""
+msgstr "Hol dir unsere Limited Edition Tor: Stärke in Zahlen t-shirt."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:237
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:258
@@ -740,18 +742,21 @@ msgid ""
"the Digital Resistance, Open Observatory of Network Interference (OONI), or "
"Tor at the Heart of Internet Freedom t-shirts."
msgstr ""
+"Unser Tor: Anzahl T-Shirt, plus eines von entweder Unser Tor: Powering the "
+"Digital Resistance, Open Observatory of Network Interference (OONI), oder "
+"Tor at the Heart of Internet Freedom T-Shirts."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:253
msgid "Tor at the Heart of Internet Freedom"
-msgstr ""
+msgstr "Tor: Im Herzen der Internetfreiheit"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:257
msgid "Powering the Digital Resistance"
-msgstr ""
+msgstr "Digitalen Widerstand stärken"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:261
msgid "Open Observatory of Network Interference"
-msgstr ""
+msgstr "Open Observatory of Network Interference"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:272
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:277
@@ -767,7 +772,7 @@ msgstr ""
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:289
msgid "how do you want to <span class=\"green\">DONATE</span>?"
-msgstr ""
+msgstr "Wie willst du <span class=\"green\">SPENDEN</span>?"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:295
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:300
@@ -776,7 +781,7 @@ msgstr "Kreditkarte"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:304
msgid "Want to donate Bitcoin, Stock, or via snail mail?"
-msgstr ""
+msgstr "Wollen Sie Bitcoin oder Stock spenden oder mithilfe von snail mail?"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:315
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:314
@@ -873,7 +878,7 @@ msgstr "Spenden"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:453
msgid "Gift Selected"
-msgstr ""
+msgstr "Geschenk ausgewählt"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:457
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:464
@@ -972,11 +977,13 @@ msgid ""
"Stand up for the universal human rights to privacy and freedom and help keep"
" Tor robust and secure."
msgstr ""
+"Setze Dich für die universellen Menschenrechte auf Privatsphäre und Freiheit"
+" ein und hilf, Tor stabil und sicher zu halten."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:616
#: tmp/cache_locale/9f/9f870858aaf6c5a7c94ea6a959618fbe485cbfd16174993d34a8e370a4567526.php:84
msgid "Mozilla will match your gift and double your impact."
-msgstr ""
+msgstr "Mozilla trägt zu deinem Geschenk bei und verdoppelt deine Wirkung."
#: tmp/cache_locale/b5/b5f4f095d469d66a47aef1a351e119240dbf0291056fdb85b216534a25e91fef.php:40
#: tmp/cache_locale/08/08a9b06344a88c9ea01db4cdf9711c9cee305183a512ae0e8b7381dae8c6d798.php:22
@@ -1054,6 +1061,10 @@ msgid ""
"making it easier for third-party developers to integrate Tor into their "
"applications."
msgstr ""
+"Mit Deiner Unterstützung werden wir in der Lage sein, ehrgeizige Projekte zu"
+" realisieren, wie z.B. die Entwicklung eines sichereren, privateren Browsers"
+" für mobile Geräte und die Erleichterung der Integration von Tor in "
+"Anwendungen von Drittanbietern."
#: tmp/cache_locale/af/afda2fbd22ed389453e63ca9acc074a25ce820b5bc97120edfd975cf8f46634a.php:71
#: tmp/cache_locale/12/12677df2d2a5991edb775c6909b7be7ca718fd00abd6950a809cda5ab878d2ce.php:76
@@ -1069,6 +1080,8 @@ msgid ""
"Tell family, friends, and colleagues that you're supporting privacy and "
"security with Tor!"
msgstr ""
+"Sag Familie, Freunden und Kollegen, dass du mit Tor Privatsphäre und "
+"Sicherheit unterstützt."
#: tmp/cache_locale/a1/a1384b9a21e3d43e946972b01389567dff845ee982dcf05228aa3e5096a74210.php:59
#: tmp/cache_locale/84/843b15891cb1c4a052da0edfef1988434048191530bcfe390199ff0e33e802d4.php:41
@@ -1666,6 +1679,9 @@ msgid ""
"href=\"https://www.torproject.org/about/financials.html.en\">financial "
"statements and its Form 990</a>."
msgstr ""
+"Hier sind die <a class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/about/financials.html.en\">Finanzberichte "
+"des Tor Project und sein Formular 9901</a>."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:289
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:206
@@ -1689,6 +1705,9 @@ msgid ""
"href=\"https://www.torproject.org/about/sponsors\">Sponsors Page</a> for "
"more.)"
msgstr ""
+"(Siehe unsere <a class=\"hyperlinks links single-link\" target=\"_blank\" "
+"href=\"https://www.torproject.org/about/sponsors\">Sponsoren Seite</a> für "
+"mehr.)"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:297
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:214
@@ -1807,6 +1826,9 @@ msgid ""
"For European bank transfers, we have an arrangement with the Renewable "
"Freedom Foundation to provide tax-deductible donations for Europeans."
msgstr ""
+"Für europäische Banküberweisungen haben wir eine Vereinbarung mit der "
+"Renewable Freedom Foundation getroffen, um steuerlich absetzbare Spenden für"
+" Europäer zu ermöglichen."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:347
msgid ""
@@ -1814,6 +1836,9 @@ msgid ""
"href=\"https://renewablefreedom.org/contact/\" target=\"_blank\" "
"class=\"hyperlinks links\">upon request</a>."
msgstr ""
+"Sie stellen <a href=\"https://renewablefreedom.org/contact/\" "
+"target=\"_blank\" class=\"hyperlinks links\">auf Anforderung</a> eine "
+"Spendenbescheinigung aus."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:349
msgid "The account information is as follows:"
@@ -1828,6 +1853,12 @@ msgid ""
" Rathausplatz 6<br>\n"
" 85049 Ingolstadt"
msgstr ""
+"<b>Renewable Freedom Foundation</b><br>\n"
+" IBAN: DE17721500000053693701<br>\n"
+" BIC: BYLADEM1ING<br>\n"
+" Sparkasse Ingolstadt<br>\n"
+" Rathausplatz 6<br>\n"
+" 85049 Ingolstadt"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:365
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:264
@@ -1873,6 +1904,9 @@ msgid ""
"different country, let us know and we will try to offer tax-deductibility in"
" your country in the future."
msgstr ""
+"Wenn es für dich wichtig ist, dass deine Spenden in einem anderen Land "
+"steuerlich absetzbar sind, lass es uns wissen und wir werden versuchen, die "
+"Steuerabzugsfähigkeit in deinem Land in Zukunft anzubieten."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:385
msgid ""
@@ -1880,6 +1914,9 @@ msgid ""
"the Tor network and may be able to offer you tax-deductibility for your "
"donation."
msgstr ""
+"Oder, wenn du in Deutschland, Frankreich oder Schweden bist, unterstützen "
+"diese Organisationen das Tor-Netzwerk und können dir möglicherweise die "
+"steuerliche Absetzbarkeit deiner Spende anbieten."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:389
msgid ""
@@ -1887,6 +1924,9 @@ msgid ""
" links\">torservers.net</a> is a German charitable non-profit that runs a "
"wide variety of exit relays worldwide."
msgstr ""
+"<a href=\"https://www.torservers.net/\" target=\"_blank\" class=\"hyperlinks"
+" links\">torservers.net</a> ist eine deutsche gemeinnützige Organisation, "
+"die weltweit eine Vielzahl von Exit-Server betreibt."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:391
msgid "They also like donations of bandwidth from ISPs."
@@ -1900,6 +1940,10 @@ msgid ""
"501(c)(3) non-profit that collects donations and turns them into more US-"
"based exit relay capacity."
msgstr ""
+"<a href=\"https://www.noisebridge.net/wiki/Noisebridge_Tor\" "
+"target=\"_blank\" class=\"hyperlinks links\">Noisebridge</a> ist eine in den"
+" USA ansässige 501(c)(3) Non-Profit-Organisation, die Spenden sammelt und "
+"diese in mehr US-basierte Exit-Server-Kapazitäten umwandelt."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:399
msgid ""
@@ -1907,6 +1951,9 @@ msgid ""
"links\">Nos Oignons</a> is a French charitable non-profit that runs fast "
"exit relays in France."
msgstr ""
+"<a href=\"https://nos-oignons.net/\" target=\"_blank\" class=\"hyperlinks "
+"links\">Nos Oignons</a> ist eine französische gemeinnützige Organisation, "
+"die in Frankreich schnelle Exit-Server betreibt."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:403
msgid ""
@@ -1914,6 +1961,9 @@ msgid ""
"class=\"hyperlinks links\">DFRI</a> is a Swedish non-profit running exit "
"relays."
msgstr ""
+"<a href=\"https://www.dfri.se/donera/?lang=en\" target=\"_blank\" "
+"class=\"hyperlinks links\">DFRI</a> ist ein schwedischer gemeinnütziger "
+"Betreiber von schnellen Exit-Servern."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:407
msgid ""
@@ -1921,6 +1971,9 @@ msgid ""
"target=\"_blank\" class=\"hyperlinks links\">The Tor Project, Inc</a>, but "
"we consider that a good thing."
msgstr ""
+"Diese Organisationen sind nicht dasselbe wie <a href=\"/%langcode%\" "
+"target=\"_blank\" class=\"hyperlinks links\">The Tor Project, Inc</a>, aber "
+"wir halten das für eine gute Sache."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:409
msgid "They're run by nice people who are part of the Tor community."
@@ -2015,10 +2068,12 @@ msgid ""
"Some users experience issues because PayPal limits the number of times an IP"
" address can be used in a certain period of time."
msgstr ""
+"Bei einigen Benutzern treten Probleme auf, weil PayPal die Anzahl begrenzt, "
+"die eine IP-Adresse in einem bestimmten Zeitraum verwendet werden kann."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:447
msgid "This is to prevent fraud from card testers."
-msgstr ""
+msgstr "Dies soll Betrug durch Kartenprüfer verhindern."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:449
msgid "If you run into an issue, please try again."
@@ -2778,13 +2833,15 @@ msgstr "Spende jetzt"
#: tmp/cache_locale/2c/2c32942b896dd845bd6204d3104922983a843d726e231446ff21ddb2a33f6cda.php:52
msgid "Donate to the Tor Project and protect the privacy of millions."
msgstr ""
+"Spende für das Tor-Projekt und schütze die Privatsphäre von Millionen "
+"Menschen."
#: tmp/cache_locale/66/666e9197f427d70c0743bcdae2c3e34f41f9d7acf2b2dddb2c21c21723e73d10.php:54
#: tmp/cache_locale/66/666e9197f427d70c0743bcdae2c3e34f41f9d7acf2b2dddb2c21c21723e73d10.php:77
#: tmp/cache_locale/2c/2c32942b896dd845bd6204d3104922983a843d726e231446ff21ddb2a33f6cda.php:31
#: tmp/cache_locale/2c/2c32942b896dd845bd6204d3104922983a843d726e231446ff21ddb2a33f6cda.php:54
msgid "Anonymity loves company."
-msgstr ""
+msgstr "Anonymität liebt Gemeinschaft"
#: tmp/cache_locale/66/666e9197f427d70c0743bcdae2c3e34f41f9d7acf2b2dddb2c21c21723e73d10.php:109
msgid ""
@@ -2799,6 +2856,9 @@ msgid ""
"continue our mission to provide tools that protect peoples privacy and "
"identity online."
msgstr ""
+"Das Tor Project zählt auf die Unterstützung unserer Verteidiger der "
+"Privatsphäre, um unsere Mission fortzusetzen, Werkzeuge zum Schutz der "
+"Privatsphäre und der Identität der Menschen online bereitzustellen."
#: tmp/cache_locale/17/179dc1a0f488d5bbb8c128dc5c0fb35d6240d83414df10335a1cf4031139609a.php:53
msgid "Tor State Nonprofit Disclosures"
@@ -3010,6 +3070,10 @@ msgid ""
"supporting their unrestricted availability and use, and furthering their "
"scientific and popular understanding."
msgstr ""
+"Die Mission des Tor Projekts ist Menschenrechte und Freiheiten durch die "
+"Entwicklung und Verbreitung von Open Source Anonymitäts- und Privatsphäre-"
+"Technologien zu fördern, ihre ungehinderte Verfügbarkeit zu unterstützen und"
+" ihr Verständnis in Wissenschaft und der Allgemeinheit zu vergrößern."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:72
msgid ""
@@ -3017,12 +3081,17 @@ msgid ""
"href=\"https://www.torproject.org/download/download-easy.html.en\">Tor "
"Browser</a>, which enables people to browse the internet anonymously."
msgstr ""
+"Der zentrale Bestandteil des Tor Projekts ist der<a "
+"href=\"https://www.torproject.org/download/download-easy.html.en\">Tor "
+"Browser</a>, welcher es ermöglicht sich anonym im Internet zu bewegen."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:74
msgid ""
"The Tor Project is a 501(c)3 tax-exempt non-profit organization based in "
"Boston, Massachusetts."
msgstr ""
+"Das Tor-Projekt ist eine 501(c)3 steuerbefreite gemeinnützige Organisation "
+"mit Sitz in Boston, Massachusetts."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:113
msgid ""
@@ -3030,6 +3099,9 @@ msgid ""
"href=\"https://www.torproject.org/projects/torbrowser.html.en\"><span "
"class=\"links\">download Tor Browser</span></a>."
msgstr ""
+"Um zu beginnen, musst du den <a class=\"hyperlinks\" target=\"_blank\" "
+"href=\"https://www.torproject.org/projects/torbrowser.html.en\"><span "
+"class=\"links\">Tor Browser</span></a> herunterladen."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:115
msgid ""
@@ -3041,6 +3113,13 @@ msgid ""
"OS X</a> and <a class=\"hyperlinks links\" target=\"_blank\" "
"href=\"https://www.torproject.org/projects/torbrowser.html.en#linux\">Linux</a>."
msgstr ""
+"Wir bieten eine Anleitung zum Herunterladen von <a class=\"hyperlinks "
+"links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/projects/torbrowser.html.en#windows\">Windows</a>,"
+" <a class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/projects/torbrowser.html.en#macosx\">Mac "
+"OS X</a> und <a class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/projects/torbrowser.html.en#linux\">Linux</a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:127
msgid ""
@@ -3052,12 +3131,21 @@ msgid ""
"Federal Foreign Office of Germany, the U.S. Naval Research Laboratory, "
"Omidyar Network, SRI International, and Radio Free Asia."
msgstr ""
+"Tausende von Personen haben gespendet, um das Tor-Projekt zu unterstützen, "
+"und wir haben auch Mittel von einer Vielzahl von Organisationen erhalten, "
+"darunter Google, die Ford Foundation, die Knight Foundation, Reddit, die "
+"U.S. National Science Foundation, die Electronic Frontier Foundation, Human "
+"Rights Watch, die Swedish International Development Cooperation Agency, das "
+"Auswärtige Amt Deutschlands, das U.S. Naval Research Laboratory, Omidyar "
+"Network, SRI International und Radio Free Asia."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:129
msgid ""
"People also support Tor in non-financial ways, for example by running Tor "
"relays to help carry traffic for other users."
msgstr ""
+"Die Leute unterstützen Tor auch auf nicht-finanzielle Weise, z.B. durch den "
+"Einsatz von Tor-Relays, um den Traffic für andere Benutzer zu erhöhen."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:147
msgid ""
@@ -3065,6 +3153,9 @@ msgid ""
"target=\"_blank\" "
"href=\"https://www.torproject.org/about/overview.html.en\">overview page."
msgstr ""
+"Mehr darüber, wie Tor funktioniert, findest du auf unserer <a "
+"class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/about/overview.html.en\">Übersichtsseite."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:158
msgid ""
@@ -3072,6 +3163,9 @@ msgid ""
"href=\"https://www.torproject.org/docs/faq.html.en\">This Tor Project "
"FAQ</a> has answers to all those questions, and more."
msgstr ""
+"<a class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/docs/faq.html.en\">Dieses Tor Project "
+"FAQ</a> hat Antworten auf alle diese Fragen, und mehr."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:172
msgid ""
@@ -3082,6 +3176,13 @@ msgid ""
"book Data and Goliath, security expert Bruce Schneier wrote \"The current "
"best tool to protect your anonymity when browsing the web is Tor.\""
msgstr ""
+"Die Electronic Frontier Foundation sagt, dass Tor einige der <a "
+"class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.eff.org/deeplinks/2014/07/7-things-you-should-know-about-"
+"tor\">stärksten Anonymitätssoftwares anbietet, die es gibt, </a>, und in "
+"seinem Buch Data and Goliath schrieb der Sicherheitsexperte Bruce Schneier: "
+"\"Das derzeit beste Tool zum Schutz Ihrer Anonymität beim Surfen im Internet"
+" ist Tor\"."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:200
msgid ""
@@ -3089,6 +3190,9 @@ msgid ""
"href=\"https://www.torproject.org/about/financials.html.en\">financial "
"statements, and its Form 990</a>."
msgstr ""
+"Hier sind die <a class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/about/financials.html.en\">Jahresabschlüsse"
+" und das Form 990</a> des Tor-Projekts."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:212
msgid ""
@@ -3096,20 +3200,26 @@ msgid ""
"href=\"https://www.torproject.org/about/sponsors.html.en\">https://www.torproject.org/about/sponsors</a>"
" for more.)"
msgstr ""
+"(Siehe <a class=\"hyperlinks links single-link\" target=\"_blank\" "
+"href=\"https://www.torproject.org/about/sponsors.html.en\">https://www.torproject.org/about/sponsors</a>"
+" für mehr.)"
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:228
msgid "The Tor Project spends about $4 million annually."
-msgstr ""
+msgstr "Das Tor-Projekt gibt jährlich etwa 4 Millionen Dollar aus."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:306
msgid ""
"In past years, some people couldn't complete the donation process, and one "
"person had their PayPal account temporarily frozen."
msgstr ""
+"In den vergangenen Jahren konnten einige Personen den Spendenvorgang nicht "
+"abschließen, und eine Person ließ ihr PayPal-Konto vorübergehend sperren."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:308
msgid "If you run into any problems donating via PayPal, please let us know."
msgstr ""
+"Wenn du Probleme beim Spenden über PayPal hast, lass es uns bitte wissen."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:318
msgid ""
@@ -3117,12 +3227,18 @@ msgid ""
"Discover or American Express) or via PayPal, please visit our <a "
"href=\"https://donate.torproject.org\">donate page</a>."
msgstr ""
+"Um mit einer gängigen Kredit- oder Debitkarte (VISA, MasterCard, Discover "
+"oder American Express) oder per PayPal zu spenden, besuche bitte unsere <a "
+"href=\"https://donate.torproject.org\">Spendenseite</a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:344
msgid ""
"These people typically use a very small amount for their testing, and we've "
"found that setting a $1 minimum donation seems to deter them."
msgstr ""
+"Diese Leute verwenden normalerweise eine sehr kleine Menge für ihre Tests, "
+"und wir haben festgestellt, dass die Festlegung einer Mindestspende von $1 "
+"sie abzuschrecken scheint."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:354
msgid ""
@@ -3131,10 +3247,14 @@ msgid ""
"research, test, and implement ideas we have for making the Tor network even "
"stronger."
msgstr ""
+"Nein, nein, nein! Mehr Geld von dir bedeutet, dass wir mehr Dinge tun "
+"können, die wir gerne tun würden, wie z.B. eine Person einzustellen, die das"
+" Tor-Netzwerk Vollzeit überwacht, oder Ideen zu erforschen, zu testen und "
+"umzusetzen, die wir haben, um das Tor-Netzwerk noch stärker zu machen."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:360
msgid "Can I donate via bitcoin?"
-msgstr ""
+msgstr "Kann ich via Bitcoin spenden?"
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:364
msgid ""
@@ -3142,6 +3262,9 @@ msgid ""
"href=\"https://www.torproject.org/donate/donate-options.html.en\">bitcoin "
"via BitPay</a>."
msgstr ""
+"Ja! Wir akzeptieren <a class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/donate/donate-options.html.en\">Bitcoin "
+"via BitPay</a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:374
msgid ""
@@ -3149,18 +3272,25 @@ msgid ""
"href=\"https://www.torproject.org/donate/donate-"
"options.html.en#cash\">sending us a postal money order</a>."
msgstr ""
+"Du kannst spenden, indem du uns <a class=\"hyperlinks links\" "
+"target=\"_blank\" href=\"https://www.torproject.org/donate/donate-"
+"options.html.en#cash\">eine Postanweisung schickst</a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:376
msgid ""
"You can donate via bitcoin if you have bitcoin set up in a way that "
"preserves your anonymity."
msgstr ""
+"Du kannst über Bitcoin spenden, wenn du Bitcoin so eingerichtet hast, dass "
+"deine Anonymität gewahrt bleibt."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:380
msgid ""
"There are probably other ways to donate anonymously that we haven't thought "
"of-- maybe you will :)"
msgstr ""
+"Es gibt wahrscheinlich noch andere Möglichkeiten, anonym zu spenden, an die "
+"wir nicht gedacht haben - vielleicht wirst du es tun :)"
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:391
msgid ""
@@ -3168,12 +3298,18 @@ msgid ""
"required to report the donation amount and your name and address (if we have"
" it) to the IRS, on Schedule B of the Form 990, which is filed annually."
msgstr ""
+"Wenn du in einem einzigen Jahr $5.000 oder mehr für das Tor-Projekt "
+"spendest, müssen wir den Spendenbetrag sowie deinen Namen und deine Adresse "
+"(falls wir sie haben) dem IRS auf Anlage B des Formulars 990, das jährlich "
+"eingereicht wird, mitteilen."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:397
msgid ""
"(Also, if you wanted, you could give us $4,999 in late 2018 and $4,999 in "
"early 2019.)"
msgstr ""
+"(Wenn Du willst, könntest Du uns auch 4.999 Dollar Ende 2018 und 4.999 "
+"Dollar Anfang 2019 geben.)"
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:429
msgid ""
@@ -3181,6 +3317,9 @@ msgid ""
"different country, let us know and we will try to offer tax-deductibility in"
" your country in future."
msgstr ""
+"Wenn es dir wichtig ist, dass deine Spenden in einem anderen Land steuerlich"
+" absetzbar sind, lass es uns wissen, und wir werden versuchen, in Zukunft "
+"eine Steuerabzugsfähigkeit in deinem Land anzubieten."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:431
msgid ""
@@ -3190,12 +3329,19 @@ msgid ""
"organizations support the Tor network</a> and may be able to offer you tax-"
"deductibility for your donation."
msgstr ""
+"Oder, wenn Sie sich in Deutschland, Frankreich oder Schweden befinden, <a "
+"class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/docs/faq.html.en#RelayDonations\">diese "
+"Organisationen unterstützen das Tor-Netzwerk</a> und können Ihnen "
+"möglicherweise die Steuerabzugsfähigkeit für Ihre Spende anbieten."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:437
msgid ""
"What if I don't want to use credit card or PayPal? Is there another way I "
"can donate?"
msgstr ""
+"Was ist, wenn ich keine Kreditkarte oder PayPal verwenden möchte? Gibt es "
+"eine andere Möglichkeit, wie ich spenden kann?"
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:441
msgid ""
@@ -3203,16 +3349,21 @@ msgid ""
"options.html.en\" class=\"hyperlinks links\" target=\"_blank\">other ways "
"you can donate.</a>"
msgstr ""
+"Ja! Hier ist eine Liste von <a href=\"https://www.torproject.org/donate"
+"/donate-options.html.en\" class=\"hyperlinks links\" "
+"target=\"_blank\">anderen Möglichkeiten, wie du spenden kannst.</a>"
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:480
msgid ""
"Our mailing address is The Tor Project, 217 First Avenue South #4903, "
"Seattle WA 98194, USA"
msgstr ""
+"Unsere Postanschrift lautet The Tor Project, 217 First Avenue South #4903, "
+"Seattle WA 98194, USA."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:490
msgid "Yes"
-msgstr ""
+msgstr "Ja"
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:502
msgid ""
@@ -3221,12 +3372,20 @@ msgid ""
" <a class=\"hyperlinks links\" target=\"_blank\" "
"href=\"https://www.matchinggifts.com/rit/\">https://www.matchinggifts.com/rit/</a>."
msgstr ""
+"Der schnellste Weg, um herauszufinden, ob dein Unternehmen Spenden sammelt, "
+"in der Regel, indem du dich an deine Personalabteilung wendest, oder du "
+"kannst nach deinem Firmennamen suchen unter <a class=\"hyperlinks links\" "
+"target=\"_blank\" "
+"href=\"https://www.matchinggifts.com/rit/\">https://www.matchinggifts.com/rit/</a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:504
msgid ""
"If your company isn't currently set up to match donations to the Tor "
"Project, we would be happy to help with the paperwork."
msgstr ""
+"Wenn deine Firma derzeit nicht so eingerichtet ist, dass sie Spenden für das"
+" Tor-Projekt bereitstellt, würden wir uns freuen, dir bei den Formalitäten "
+"zu helfen."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:518
msgid ""
@@ -3235,6 +3394,10 @@ msgid ""
"href=\"https://www.torproject.org/getinvolved/volunteer.html.en\">this is a "
"good place to start</a>."
msgstr ""
+"Wenn du dich für das Tor-Projekt engagieren möchtest, ist <a "
+"class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/getinvolved/volunteer.html.en\">dies ein "
+"guter Anfang</a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:528
msgid ""
@@ -3242,14 +3405,18 @@ msgid ""
"stickers, are presented on our main <a "
"href=\"https://donate.torproject.org\">donation page</a>."
msgstr ""
+"Eine Vielzahl von Dankeschön-Geschenken für Spender, darunter T-Shirts, "
+"Kapuzenpullover und Aufkleber, finden Sie auf unserer <a "
+"href=\"https://donate.torproject.org\">Hauptspendenseite</a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:548
msgid "No, Tor doesn't currently participate in the CFC program."
-msgstr ""
+msgstr "Nein, Tor nimmt derzeit nicht am CFC-Programm teil."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:572
msgid "Typically no, we don't encourage people to donate hardware."
msgstr ""
+"Normalerweise nein, wir ermutigen die Leute nicht, Hardware zu spenden."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:574
msgid ""
@@ -3257,6 +3424,9 @@ msgid ""
"especially useful for us, please mail <span "
"class=\"email\">giving(at)torproject.org</span>."
msgstr ""
+"Wenn du jedoch eine Hardware-Spende machen möchtest, die deine Meinung nach "
+"besonders nützlich für uns sein könnte, sende bitte eine Mail an <span "
+"class=\"email\">giving(at)torproject.org</span>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:586
msgid ""
@@ -3264,6 +3434,9 @@ msgid ""
"href=\"https://www.torproject.org/getinvolved/volunteer.html.en\">list of "
"areas where we would love your help</a>."
msgstr ""
+"Hier ist <a class=\"hyperlinks links\" target=\"_blank\" "
+"href=\"https://www.torproject.org/getinvolved/volunteer.html.en\">eine Liste"
+" von Bereichen, in denen wir deine Hilfe benötigen </a>."
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:602
msgid ""
@@ -3272,6 +3445,10 @@ msgid ""
"href=\"https://www.torproject.org/docs/faq.html.en#HowDoIDecide\">operate a "
"Tor relay</a>."
msgstr ""
+"Vielleicht wäre dein Unternehmen bereit, <a class=\"hyperlinks links\" "
+"target=\"_blank\" "
+"href=\"https://www.torproject.org/docs/faq.html.en#HowDoIDecide\">einen Tor "
+"Relay zu betreiben</a>."
#: tmp/cache_locale/02/023cc9edfe6c60b72788b97f6a123fde6020d003845e03b26b572d864d6eb3de.php:83
msgid ""
commit ddf7fc13f2e4599039ed0b5a8244848f248121b6
Author: Translation commit bot <translation(a)torproject.org>
Date: Sat Dec 28 01:25:00 2019 +0000
https://gitweb.torproject.org/translation.git/commit/?h=support-portal
---
contents+fa.po | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/contents+fa.po b/contents+fa.po
index 7746cb3f40..6741fd9a07 100644
--- a/contents+fa.po
+++ b/contents+fa.po
@@ -1550,6 +1550,8 @@ msgstr "آیا من میتوانم در مرورگر تور از فلش (Flash P
msgid ""
"Flash is disabled in Tor Browser, and we recommend you to not enable it."
msgstr ""
+"فلش در مرورگر تور غیرفعال می باشد، ما به شما توصیه میکنیم تا آن را فعال "
+"نکنید."
#: https//support.torproject.org/tbb/tbb-12/
#: (content/tbb/tbb-12/contents+en.lrquestion.description)
@@ -1570,11 +1572,12 @@ msgstr ""
#: (content/tbb/tbb-13/contents+en.lrquestion.title)
msgid "Does using Tor Browser protect other applications on my computer?"
msgstr ""
+"آیا استفاده از مرورگر تور سایر برنامه های روی کامپیوتر من را محافظت می کند؟"
#: https//support.torproject.org/tbb/tbb-13/
#: (content/tbb/tbb-13/contents+en.lrquestion.description)
msgid "Only Tor Browser's traffic will be routed over the Tor network."
-msgstr ""
+msgstr "فقط ترافیک مرورگر تور از شبکهی تور مسیریابی خواهد شد."
#: https//support.torproject.org/tbb/tbb-13/
#: (content/tbb/tbb-13/contents+en.lrquestion.description)
commit f34212fb0c91715d7a9f3ab3764033e3c962682b
Author: Damian Johnson <atagar(a)torproject.org>
Date: Wed Dec 25 16:14:51 2019 -0800
Sync manual and update assertions
The manual has changed quite a bit, requiring small parser adjustments.
---
stem/cached_manual.sqlite | Bin 249856 -> 252928 bytes
stem/manual.py | 53 ++++++++++++++++++++++++++--------------------
stem/settings.cfg | 3 +++
test/integ/manual.py | 27 +++++++++++------------
test/unit/manual.py | 2 +-
5 files changed, 46 insertions(+), 39 deletions(-)
diff --git a/stem/cached_manual.sqlite b/stem/cached_manual.sqlite
index 515e894b..a2d9b02c 100644
Binary files a/stem/cached_manual.sqlite and b/stem/cached_manual.sqlite differ
diff --git a/stem/manual.py b/stem/manual.py
index 24596851..5b502a4d 100644
--- a/stem/manual.py
+++ b/stem/manual.py
@@ -730,7 +730,9 @@ def _get_indented_descriptions(lines):
options, last_arg = OrderedDict(), None
for line in lines:
- if line and not line.startswith(' '):
+ if line == ' Note':
+ last_arg = None # manual has several indented 'Note' blocks
+ elif line and not line.startswith(' '):
options[line], last_arg = [], line
elif last_arg and line.startswith(' '):
options[last_arg].append(line[4:])
@@ -756,43 +758,48 @@ def _add_config_options(config_options, category, lines):
since that platform lacks getrlimit(). (Default: 1000)
"""
- last_option, usage, description = None, None, []
+ def add_option(title, description):
+ if 'PER INSTANCE OPTIONS' in title:
+ return # skip, unfortunately amid the options
+
+ if ', ' in title:
+ # Line actually had multiple options with the same description. For
+ # example...
+ #
+ # AlternateBridgeAuthority [nickname], AlternateDirAuthority [nickname]
- # Drop the section description. Each ends with a paragraph saying 'The
- # following options...'.
+ for subtitle in title.split(', '):
+ add_option(subtitle, description)
+ else:
+ name, usage = title.split(' ', 1) if ' ' in title else (title, '')
+ summary = _config().get('manual.summary.%s' % name.lower(), '')
+ config_options[name] = ConfigOption(name, category, usage, summary, _join_lines(description).strip())
- desc_paragraph_index = None
+ # Remove the section's description by finding the sentence the section
+ # ends with.
- for i, line in enumerate(lines):
- if 'The following options' in line:
- desc_paragraph_index = i
- break
+ end_indices = [i for (i, line) in enumerate(lines) if ('The following options' in line or 'PER SERVICE OPTIONS' in line)]
- if desc_paragraph_index is not None:
- lines = lines[desc_paragraph_index:] # trim to the description paragrah
+ if end_indices:
+ lines = lines[max(end_indices):] # trim to the description paragrah
lines = lines[lines.index(''):] # drop the paragraph
+ last_title, description = None, []
+
for line in lines:
if line and not line.startswith(' '):
- if last_option:
- summary = _config().get('manual.summary.%s' % last_option.lower(), '')
- config_options[last_option] = ConfigOption(last_option, category, usage, summary, _join_lines(description).strip())
-
- if ' ' in line:
- last_option, usage = line.split(' ', 1)
- else:
- last_option, usage = line, ''
+ if last_title:
+ add_option(last_title, description)
- description = []
+ last_title, description = line, []
else:
if line.startswith(' '):
line = line[4:]
description.append(line)
- if last_option:
- summary = _config().get('manual.summary.%s' % last_option.lower(), '')
- config_options[last_option] = ConfigOption(last_option, category, usage, summary, _join_lines(description).strip())
+ if last_title:
+ add_option(last_title, description)
def _join_lines(lines):
diff --git a/stem/settings.cfg b/stem/settings.cfg
index b7be1ee1..c8cb29c9 100644
--- a/stem/settings.cfg
+++ b/stem/settings.cfg
@@ -331,6 +331,9 @@ manual.summary.HiddenServiceMaxStreamsCloseCircuit Closes rendezvous circuits th
manual.summary.RendPostPeriod Period at which the rendezvous service descriptors are refreshed
manual.summary.HiddenServiceDirGroupReadable Group read permissions for the hidden service directory
manual.summary.HiddenServiceNumIntroductionPoints Number of introduction points the hidden service will have
+manual.summary.HiddenServiceEnableIntroDoSDefense Introduction point DoS protection
+manual.summary.HiddenServiceEnableIntroDoSRatePerSec Request rate allowed for the introduction point
+manual.summary.HiddenServiceEnableIntroDoSBurstPerSec Burst rate allowed for the introduction point
manual.summary.HiddenServiceSingleHopMode Allow non-anonymous single hop hidden services
manual.summary.HiddenServiceNonAnonymousMode Enables HiddenServiceSingleHopMode to be set
diff --git a/test/integ/manual.py b/test/integ/manual.py
index de86f695..ae0b2b16 100644
--- a/test/integ/manual.py
+++ b/test/integ/manual.py
@@ -38,20 +38,21 @@ EXPECTED_CATEGORIES = set([
'AUTHORS',
])
-EXPECTED_CLI_OPTIONS = set(['-f FILE', '--hash-password PASSWORD', '--ignore-missing-torrc', '--defaults-torrc FILE', '--key-expiration [purpose]', '--list-fingerprint', '--list-deprecated-options', '--allow-missing-torrc', '--nt-service', '--verify-config', '--service remove|start|stop', '--passphrase-fd FILEDES', '--keygen [--newpass]', '--list-torrc-options', '--service install [--options command-line options]', '--list-modules', '--quiet|--hush', '--version', '-h, --help'])
+EXPECTED_CLI_OPTIONS = set(['-f FILE', '--hash-password PASSWORD', '--ignore-missing-torrc', '--defaults-torrc FILE', '--key-expiration [purpose]', '--list-fingerprint', '--list-deprecated-options', '--allow-missing-torrc', '--nt-service', '--verify-config', '--dump-config short|full|non-builtin', '--service remove|start|stop', '--passphrase-fd FILEDES', '--keygen [--newpass]', '--list-torrc-options', '--service install [--options command-line options]', '--list-modules', '--quiet|--hush', '--version', '-h, --help'])
EXPECTED_SIGNALS = set(['SIGTERM', 'SIGINT', 'SIGHUP', 'SIGUSR1', 'SIGUSR2', 'SIGCHLD', 'SIGPIPE', 'SIGXFSZ'])
EXPECTED_DESCRIPTION = """
-Tor is a connection-oriented anonymizing communication service. Users choose a source-routed path through a set of nodes, and negotiate a "virtual circuit" through the network, in which each node knows its predecessor and successor, but no others. Traffic flowing down the circuit is unwrapped by a symmetric key at each node, which reveals the downstream node.
+Tor is a connection-oriented anonymizing communication service. Users choose a source-routed path through a set of nodes, and negotiate a "virtual circuit" through the network. Each node in a virtual circuit knows its predecessor and successor nodes, but no other nodes. Traffic flowing down the circuit is unwrapped by a symmetric key at each node, which reveals the downstream node.
-Basically, Tor provides a distributed network of servers or relays ("onion routers"). Users bounce their TCP streams -- web traffic, ftp, ssh, etc. -- around the network, and recipients, observers, and even the relays themselves have difficulty tracking the source of the stream.
+Basically, Tor provides a distributed network of servers or relays ("onion routers"). Users bounce their TCP streams, including web traffic, ftp, ssh, etc., around the network, so that recipients, observers, and even the relays themselves have difficulty tracking the source of the stream.
-By default, tor will act as a client only. To help the network by providing bandwidth as a relay, change the ORPort configuration option -- see below. Please also consult the documentation on the Tor Project's website.
+ Note
+ By default, tor acts as a client only. To help the network by providing bandwidth as a relay, change the ORPort configuration option as mentioned below. Please also consult the documentation on the Tor Project's website.
""".strip()
-EXPECTED_FILE_DESCRIPTION = 'Specify a new configuration file to contain further Tor configuration options OR pass - to make Tor read its configuration from standard input. (Default: @CONFDIR@/torrc, or $HOME/.torrc if that file is not found)'
+EXPECTED_FILE_DESCRIPTION = 'Specify a new configuration file to contain further Tor configuration options, or pass - to make Tor read its configuration from standard input. (Default: @CONFDIR@/torrc, or $HOME/.torrc if that file is not found)'
-EXPECTED_BANDWIDTH_RATE_DESCRIPTION = 'A token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value. If you want to run a relay in the public network, this needs to be at the very least 75 KBytes for a relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) -- but of course, more is better; we recommend at least 250 KBytes (2 mbits) if possible. (Default: 1 GByte)\n\nNote that this option, and other bandwidth-limiting options, apply to TCP data only: They do not count TCP headers or DNS traffic.\n\nWith this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as "megabytes" or "MB"; "kbits" can be written as "kilobits"; and so forth. Tor also accepts "byte" and "bit" in the singular. The prefixes "tera" and "T" are a
lso recognized. If no units are given, we default to bytes. To avoid confusion, we recommend writing "bytes" or "bits" explicitly, since it\'s easy to forget that "B" means bytes, not bits.'
+EXPECTED_BANDWIDTH_RATE_DESCRIPTION = 'A token bucket limits the average incoming bandwidth usage on this node to the specified number of bytes per second, and the average outgoing bandwidth usage to that same value. If you want to run a relay in the public network, this needs to be at the very least 75 KBytes for a relay (that is, 600 kbits) or 50 KBytes for a bridge (400 kbits) -- but of course, more is better; we recommend at least 250 KBytes (2 mbits) if possible. (Default: 1 GByte)\n\nNote that this option, and other bandwidth-limiting options, apply to TCP data only: They do not count TCP headers or DNS traffic.\n\nTor uses powers of two, not powers of ten, so 1 GByte is 1024*1024*1024 bytes as opposed to 1 billion bytes.\n\nWith this option, and in other options that take arguments in bytes, KBytes, and so on, other formats are also supported. Notably, "KBytes" can also be written as "kilobytes" or "kb"; "MBytes" can be written as "megabytes" or "MB"; "kbits" can be written a
s "kilobits"; and so forth. Case doesn\'t matter. Tor also accepts "byte" and "bit" in the singular. The prefixes "tera" and "T" are also recognized. If no units are given, we default to bytes. To avoid confusion, we recommend writing "bytes" or "bits" explicitly, since it\'s easy to forget that "B" means bytes, not bits.'
EXPECTED_EXIT_POLICY_DESCRIPTION_START = 'Set an exit policy for this server. Each policy'
EXPECTED_EXIT_POLICY_DESCRIPTION_END = 'it applies to both IPv4 and IPv6 addresses.'
@@ -162,7 +163,11 @@ class TestManual(unittest.TestCase):
def assert_equal(category, expected, actual):
if expected != actual:
- self.fail("Changed tor's man page? The %s changed as follows...\n\nexpected: %s\n\nactual: %s" % (category, sorted(expected), sorted(actual)))
+ if isinstance(expected, (set, tuple, list)):
+ expected = sorted(expected)
+ actual = sorted(actual)
+
+ self.fail("Changed tor's man page? The %s changed as follows...\n\nexpected: %s\n\nactual: %s" % (category, expected, actual))
manual = stem.manual.Manual.from_man(self.man_path)
@@ -237,14 +242,6 @@ class TestManual(unittest.TestCase):
if name.startswith('_'):
config_options_in_tor.remove(name)
- # TODO: Looks like options we should remove from tor...
- #
- # https://trac.torproject.org/projects/tor/ticket/17665
-
- for option in ('SchedulerMaxFlushCells__', 'SchedulerLowWaterMark__', 'SchedulerHighWaterMark__'):
- if option in config_options_in_tor:
- config_options_in_tor.remove(option)
-
manual = stem.manual.Manual.from_man(self.man_path)
config_options_in_manual = set(manual.config_options.keys())
diff --git a/test/unit/manual.py b/test/unit/manual.py
index cd2fce94..72f847e5 100644
--- a/test/unit/manual.py
+++ b/test/unit/manual.py
@@ -234,7 +234,7 @@ class TestManual(unittest.TestCase):
self.assertEqual('tor - The second-generation onion router', manual.name)
self.assertEqual('tor [OPTION value]...', manual.synopsis)
- self.assertTrue(manual.description.startswith(EXPECTED_DESCRIPTION))
+ self.assertTrue(manual.description.startswith('Tor is a connection-oriented anonymizing communication service.'))
self.assertTrue(len(manual.commandline_options) > 10)
self.assertTrue(len(manual.signals) > 5)
self.assertTrue(len(manual.files) > 20)
commit 6c07fe554ef6a7d40b196d314101153eacfb41af
Author: Damian Johnson <atagar(a)torproject.org>
Date: Fri Dec 27 15:13:44 2019 -0800
CollecTor publication time filtering
When I first wrote this module I played fast and lose with the 'start' and
'end' parameters, guessing relevance purely based on filenames.
When Karsten added timestamps to the index he better defined the relevant
timestamp to be a descriptor's publication, which everything except
microdescriptors contains.
Interestingly, archives can contain publications both before and after its
filename date. For example...
recent/relay-descriptors/server-descriptors/2019-12-27-22-04-59-server-descriptors
Old filename derived timestamps:
start: 2019-12-27 22:04:59
end: 2019-12-27 23:04:59
Index's publication timpestamps:
start: 2019-12-27 20:30:00
end: 2019-12-27 22:45:00
If the file was created at 22:04 how does it contain something published at
22:45?
Regardless, now that the index contains publication times for our purposes
filenames dates are moot. Our 'start' and 'end' arguments provide the subset
of archives that reside within the given publication range.
For example, the following downloads descriptors that were published up to two
hours ago...
recent = datetime.datetime.utcnow() - datetime.timedelta(minutes = 120)
descriptors = stem.descriptor.collector.get_server_descriptors(start = recent)
If we make this more sophisticated we can demonstrate how many
descriptors we pull from each archive...
import datetime
import stem.descriptor.collector
collector = stem.descriptor.collector.get_instance()
recent = datetime.datetime.utcnow() - datetime.timedelta(minutes = 120)
# This effectively does the same thing as get_server_descriptors(),
# but in a way we can also determine the full counts.
for f in collector.files('server-descriptor', start = recent):
all_desc = list(f.read())
recent_desc = list(f.read(start = recent))
print('%s (%s => %s)' % (f.path, f.start, f.end))
print(' %i of %i descriptors were published recently' % (len(recent_desc), len(all_desc)))
# Download them again, but through our more prevalently used
# get_server_descriptors() method.
print('\nIn total there are %i server descriptors published recently' % len(list(collector.get_server_descriptors(start = recent))))
----------------------------------------------------------------------
% python demo.py
recent/relay-descriptors/server-descriptors/2019-12-27-21-04-59-server-descriptors (2019-12-27 17:59:00 => 2019-12-27 22:13:00)
3 of 817 descriptors were published recently
recent/relay-descriptors/server-descriptors/2019-12-27-22-04-59-server-descriptors (2019-12-27 20:30:00 => 2019-12-27 22:45:00)
297 of 776 descriptors were published recently
recent/relay-descriptors/server-descriptors/2019-12-27-23-04-59-server-descriptors (2019-12-27 21:49:00 => 2019-12-27 23:01:00)
800 of 800 descriptors were published recently
In total there are 1100 server descriptors published recently
---
stem/descriptor/collector.py | 86 ++++++++++++++++++++++----------------
test/integ/descriptor/collector.py | 32 +++++++-------
test/unit/descriptor/collector.py | 1 +
3 files changed, 69 insertions(+), 50 deletions(-)
diff --git a/stem/descriptor/collector.py b/stem/descriptor/collector.py
index 05826c49..3ee0e1aa 100644
--- a/stem/descriptor/collector.py
+++ b/stem/descriptor/collector.py
@@ -181,10 +181,10 @@ class File(object):
:var int size: size of the file
:var str sha256: file's sha256 checksum
- :var datetime start: beginning of the time range descriptors are for,
- **None** if this cannot be determined
- :var datetime end: ending of the time range descriptors are for,
- **None** if this cannot be determined
+ :var datetime start: first publication within the file, **None** if this
+ cannot be determined
+ :var datetime end: last publication within the file, **None** if this cannot
+ be determined
:var datetime last_modified: when the file was last modified
"""
@@ -206,7 +206,7 @@ class File(object):
else:
self.start, self.end = File._guess_time_range(path)
- def read(self, directory = None, descriptor_type = None, document_handler = DocumentHandler.ENTRIES, timeout = None, retries = 3):
+ def read(self, directory = None, descriptor_type = None, start = None, end = None, document_handler = DocumentHandler.ENTRIES, timeout = None, retries = 3):
"""
Provides descriptors from this archive. Descriptors are downloaded or read
from disk as follows...
@@ -229,6 +229,8 @@ class File(object):
:param str descriptor_type: `descriptor type
<https://metrics.torproject.org/collector.html#data-formats>`_, this is
guessed if not provided
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param stem.descriptor.__init__.DocumentHandler document_handler: method in
which to parse a :class:`~stem.descriptor.networkstatus.NetworkStatusDocument`
:param int timeout: timeout when connection becomes idle, no timeout
@@ -267,7 +269,7 @@ class File(object):
tmp_directory = tempfile.mkdtemp()
- for desc in self.read(tmp_directory, descriptor_type, document_handler, timeout, retries):
+ for desc in self.read(tmp_directory, descriptor_type, start, end, document_handler, timeout, retries):
yield desc
shutil.rmtree(tmp_directory)
@@ -281,6 +283,17 @@ class File(object):
for desc in stem.descriptor.parse_file(path, document_handler = document_handler):
if descriptor_type is None or descriptor_type.startswith(desc.type_annotation().name):
+ # TODO: This can filter server and extrainfo times, but other
+ # descriptor types may use other attribute names.
+
+ published = getattr(desc, 'published', None)
+
+ if published:
+ if start and published < start:
+ continue
+ elif end and published > end:
+ continue
+
yield desc
def download(self, directory, decompress = True, timeout = None, retries = 3, overwrite = False):
@@ -405,8 +418,8 @@ class CollecTor(object):
Provides server descriptors published during the given time range, sorted
oldest to newest.
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
:param bool bridge: standard descriptors if **False**, bridge if **True**
@@ -424,7 +437,7 @@ class CollecTor(object):
desc_type = 'server-descriptor' if not bridge else 'bridge-server-descriptor'
for f in self.files(desc_type, start, end):
- for desc in f.read(cache_to, desc_type, timeout = timeout, retries = retries):
+ for desc in f.read(cache_to, desc_type, start, end, timeout = timeout, retries = retries):
yield desc
def get_extrainfo_descriptors(self, start = None, end = None, cache_to = None, bridge = False, timeout = None, retries = 3):
@@ -432,8 +445,8 @@ class CollecTor(object):
Provides extrainfo descriptors published during the given time range,
sorted oldest to newest.
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
:param bool bridge: standard descriptors if **False**, bridge if **True**
@@ -451,13 +464,13 @@ class CollecTor(object):
desc_type = 'extra-info' if not bridge else 'bridge-extra-info'
for f in self.files(desc_type, start, end):
- for desc in f.read(cache_to, desc_type, timeout = timeout, retries = retries):
+ for desc in f.read(cache_to, desc_type, start, end, timeout = timeout, retries = retries):
yield desc
def get_microdescriptors(self, start = None, end = None, cache_to = None, timeout = None, retries = 3):
"""
- Provides microdescriptors published during the given time range,
- sorted oldest to newest. Unlike server/extrainfo descriptors,
+ Provides microdescriptors estimated to be published during the given time
+ range, sorted oldest to newest. Unlike server/extrainfo descriptors,
microdescriptors change very infrequently...
::
@@ -466,10 +479,11 @@ class CollecTor(object):
about once per week." -dir-spec section 3.3
CollecTor archives only contain microdescriptors that *change*, so hourly
- tarballs often contain very few.
+ tarballs often contain very few. Microdescriptors also do not contain
+ their publication timestamp, so this is estimated.
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
:param int timeout: timeout for downloading each individual archive when
@@ -484,7 +498,7 @@ class CollecTor(object):
"""
for f in self.files('microdescriptor', start, end):
- for desc in f.read(cache_to, 'microdescriptor', timeout = timeout, retries = retries):
+ for desc in f.read(cache_to, 'microdescriptor', start, end, timeout = timeout, retries = retries):
yield desc
def get_consensus(self, start = None, end = None, cache_to = None, document_handler = DocumentHandler.ENTRIES, version = 3, microdescriptor = False, bridge = False, timeout = None, retries = 3):
@@ -492,8 +506,8 @@ class CollecTor(object):
Provides consensus router status entries published during the given time
range, sorted oldest to newest.
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
:param stem.descriptor.__init__.DocumentHandler document_handler: method in
@@ -528,7 +542,7 @@ class CollecTor(object):
raise ValueError('Only v2 and v3 router status entries are available (not version %s)' % version)
for f in self.files(desc_type, start, end):
- for desc in f.read(cache_to, desc_type, document_handler, timeout = timeout, retries = retries):
+ for desc in f.read(cache_to, desc_type, start, end, document_handler, timeout = timeout, retries = retries):
yield desc
def get_key_certificates(self, start = None, end = None, cache_to = None, timeout = None, retries = 3):
@@ -536,8 +550,8 @@ class CollecTor(object):
Directory authority key certificates for the given time range,
sorted oldest to newest.
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
:param int timeout: timeout for downloading each individual archive when
@@ -552,7 +566,7 @@ class CollecTor(object):
"""
for f in self.files('dir-key-certificate-3', start, end):
- for desc in f.read(cache_to, 'dir-key-certificate-3', timeout = timeout, retries = retries):
+ for desc in f.read(cache_to, 'dir-key-certificate-3', start, end, timeout = timeout, retries = retries):
yield desc
def get_bandwidth_files(self, start = None, end = None, cache_to = None, timeout = None, retries = 3):
@@ -560,8 +574,8 @@ class CollecTor(object):
Bandwidth authority heuristics for the given time range, sorted oldest to
newest.
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
:param int timeout: timeout for downloading each individual archive when
@@ -576,7 +590,7 @@ class CollecTor(object):
"""
for f in self.files('bandwidth-file', start, end):
- for desc in f.read(cache_to, 'bandwidth-file', timeout = timeout, retries = retries):
+ for desc in f.read(cache_to, 'bandwidth-file', start, end, timeout = timeout, retries = retries):
yield desc
def get_exit_lists(self, start = None, end = None, cache_to = None, timeout = None, retries = 3):
@@ -584,8 +598,8 @@ class CollecTor(object):
`TorDNSEL exit lists <https://www.torproject.org/projects/tordnsel.html.en>`_
for the given time range, sorted oldest to newest.
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:param str cache_to: directory to cache archives into, if an archive is
available here it is not downloaded
:param int timeout: timeout for downloading each individual archive when
@@ -600,7 +614,7 @@ class CollecTor(object):
"""
for f in self.files('tordnsel', start, end):
- for desc in f.read(cache_to, 'tordnsel', timeout = timeout, retries = retries):
+ for desc in f.read(cache_to, 'tordnsel', start, end, timeout = timeout, retries = retries):
yield desc
def index(self, compression = 'best'):
@@ -643,8 +657,8 @@ class CollecTor(object):
Provides files CollecTor presently has, sorted oldest to newest.
:param str descriptor_type: descriptor type or prefix to retrieve
- :param datetime.datetime start: time range to begin with
- :param datetime.datetime end: time range to end with
+ :param datetime.datetime start: publication time to begin with
+ :param datetime.datetime end: publication time to end with
:returns: **list** of :class:`~stem.descriptor.collector.File`
@@ -662,10 +676,10 @@ class CollecTor(object):
matches = []
for f in self._cached_files:
- if start and (f.start is None or f.start < start):
- continue
- elif end and (f.end is None or f.end > end):
- continue
+ if start and (f.end is None or f.end < start):
+ continue # only contains descriptors before time range
+ elif end and (f.start is None or f.start > end):
+ continue # only contains descriptors after time range
if descriptor_type is None or any([desc_type.startswith(descriptor_type) for desc_type in f.types]):
matches.append(f)
diff --git a/test/integ/descriptor/collector.py b/test/integ/descriptor/collector.py
index ac33490d..3af25c29 100644
--- a/test/integ/descriptor/collector.py
+++ b/test/integ/descriptor/collector.py
@@ -12,7 +12,11 @@ import stem.descriptor.collector
from stem.descriptor import Compression
-RECENT = datetime.datetime.utcnow() - datetime.timedelta(minutes = 60)
+# The latest hour may or may not be published, so testing against a time range
+# a little back.
+
+START = datetime.datetime.utcnow() - datetime.timedelta(minutes = 180)
+END = datetime.datetime.utcnow() - datetime.timedelta(minutes = 120)
class TestCollector(unittest.TestCase):
@@ -39,23 +43,23 @@ class TestCollector(unittest.TestCase):
@test.require.only_run_once
@test.require.online
def test_downloading_server_descriptors(self):
- recent_descriptors = list(stem.descriptor.collector.get_server_descriptors(start = RECENT))
+ recent_descriptors = list(stem.descriptor.collector.get_server_descriptors(start = START, end = END))
- if not (300 < len(recent_descriptors) < 800):
- self.fail('Downloaded %i descriptors, expected 300-800' % len(recent_descriptors)) # 584 on 8/5/19
+ if not (400 < len(recent_descriptors) < 1200):
+ self.fail('Downloaded %i descriptors, expected 400-1200' % len(recent_descriptors)) # 803 on 12/27/19
@test.require.only_run_once
@test.require.online
def test_downloading_extrainfo_descriptors(self):
- recent_descriptors = list(stem.descriptor.collector.get_extrainfo_descriptors(start = RECENT))
+ recent_descriptors = list(stem.descriptor.collector.get_extrainfo_descriptors(start = START, end = END))
- if not (300 < len(recent_descriptors) < 800):
- self.fail('Downloaded %i descriptors, expected 300-800' % len(recent_descriptors)) # 583 on 8/7/19
+ if not (400 < len(recent_descriptors) < 1200):
+ self.fail('Downloaded %i descriptors, expected 400-1200' % len(recent_descriptors)) # 803 on 12/27/19
@test.require.only_run_once
@test.require.online
def test_downloading_microdescriptors(self):
- recent_descriptors = list(stem.descriptor.collector.get_microdescriptors(start = RECENT))
+ recent_descriptors = list(stem.descriptor.collector.get_microdescriptors(start = START, end = END))
if not (10 < len(recent_descriptors) < 100):
self.fail('Downloaded %i descriptors, expected 10-100' % len(recent_descriptors)) # 23 on 8/7/19
@@ -63,18 +67,18 @@ class TestCollector(unittest.TestCase):
@test.require.only_run_once
@test.require.online
def test_downloading_consensus_v3(self):
- recent_descriptors = list(stem.descriptor.collector.get_consensus(start = RECENT))
+ recent_descriptors = list(stem.descriptor.collector.get_consensus(start = START, end = END))
- if not (3000 < len(recent_descriptors) < 10000):
- self.fail('Downloaded %i descriptors, expected 3000-10000' % len(recent_descriptors)) # 6554 on 8/10/19
+ if not (100 < len(recent_descriptors) < 500):
+ self.fail('Downloaded %i descriptors, expected 100-500' % len(recent_descriptors)) # 316 on 12/27/19
@test.require.only_run_once
@test.require.online
def test_downloading_consensus_micro(self):
- recent_descriptors = list(stem.descriptor.collector.get_consensus(start = RECENT, microdescriptor = True))
+ recent_descriptors = list(stem.descriptor.collector.get_consensus(start = START, end = END, microdescriptor = True))
- if not (3000 < len(recent_descriptors) < 10000):
- self.fail('Downloaded %i descriptors, expected 3000-10000' % len(recent_descriptors))
+ if not (100 < len(recent_descriptors) < 500):
+ self.fail('Downloaded %i descriptors, expected 100-500' % len(recent_descriptors)) # 316 on 12/27/19
def test_downloading_consensus_invalid_type(self):
test_values = (
diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py
index 7d80d572..b4ff7636 100644
--- a/test/unit/descriptor/collector.py
+++ b/test/unit/descriptor/collector.py
@@ -181,6 +181,7 @@ class TestCollector(unittest.TestCase):
], [f.path for f in collector.files(descriptor_type = 'server-descriptor', end = datetime.datetime(2007, 1, 1))])
self.assertEqual([
+ 'archive/relay-descriptors/server-descriptors/server-descriptors-2006-02.tar.xz',
'archive/relay-descriptors/server-descriptors/server-descriptors-2006-03.tar.xz',
], [f.path for f in collector.files(descriptor_type = 'server-descriptor', start = datetime.datetime(2006, 2, 10), end = datetime.datetime(2007, 1, 1))])