tor-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2015
- 18 participants
- 1250 discussions

25 Jul '15
commit aaf1b5e7491eb618030cdc13bfea470a3fa08b9a
Author: Isis Lovecruft <isis(a)torproject.org>
Date: Sat Jul 25 02:43:24 2015 +0000
Update Norwegian Bokmål (nb) translations.
* THANKS TO Erik Matson and Kristian Andre Henriksen.
However, whichever one of you changed the translation of "Uh oh,
spaghettios!" from "På tryne i myra!" to "Oisann!" just lost serious
points for lack appreciation for other people's creativity. :(
---
bridgedb/i18n/nb/LC_MESSAGES/bridgedb.po | 39 ++++++++++++++++--------------
1 file changed, 21 insertions(+), 18 deletions(-)
diff --git a/bridgedb/i18n/nb/LC_MESSAGES/bridgedb.po b/bridgedb/i18n/nb/LC_MESSAGES/bridgedb.po
index 1d5603e..a51b70e 100644
--- a/bridgedb/i18n/nb/LC_MESSAGES/bridgedb.po
+++ b/bridgedb/i18n/nb/LC_MESSAGES/bridgedb.po
@@ -3,8 +3,10 @@
# This file is distributed under the same license as the BridgeDB project.
#
# Translators:
-# Allan Nordhøy <comradekingu(a)gmail.com>, 2014
+# Allan Nordhøy <epost(a)anotheragency.no>, 2014
+# Erik Matson <erik(a)norwenglish.net>, 2015
# Harald <haarektrans(a)gmail.com>, 2014
+# Kristian Andre Henriksen <kris.andre.h(a)gmail.com>, 2015
# lateralus, 2013
# Per Thorsheim <transifex(a)thorsheim.net>, 2015
# thor574 <thor.hovden(a)gmail.com>, 2014
@@ -12,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: 'https://trac.torproject.org/projects/tor/newticket?component=BridgeDB&keywo…'\n"
-"POT-Creation-Date: 2015-02-03 03:24+0000\n"
-"PO-Revision-Date: 2015-02-24 13:06+0000\n"
-"Last-Translator: Per Thorsheim <transifex(a)thorsheim.net>\n"
+"POT-Creation-Date: 2015-03-19 22:13+0000\n"
+"PO-Revision-Date: 2015-06-23 12:17+0000\n"
+"Last-Translator: Erik Matson <erik(a)norwenglish.net>\n"
"Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/torproject/language/nb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -34,7 +36,7 @@ msgstr ""
#. "fteproxy"
#. "Tor"
#. "Tor Browser"
-#: lib/bridgedb/HTTPServer.py:122
+#: lib/bridgedb/HTTPServer.py:107
msgid "Sorry! Something went wrong with your request."
msgstr "Dette var leit! Noe gikk galt med forespørselen din."
@@ -205,26 +207,27 @@ msgstr "Hvordan starte med bruk av dine broer"
#: lib/bridgedb/strings.py:121
#, python-format
msgid ""
-"To enter bridges into Tor Browser, follow the instructions on the %s Tor\n"
-"Browser download page %s to start Tor Browser."
-msgstr "For å oppføre broer i Tor-nettleseren, følg instruksjonene på %s Tor\nnettleser nedlastingsside %s for å starte Tor-nettleser."
+"To enter bridges into Tor Browser, first go to the %s Tor Browser download\n"
+"page %s and then follow the instructions there for downloading and starting\n"
+"Tor Browser."
+msgstr "For å sette opp broer i Tor Browser, først gå til %s Tor Browser download\nsiden %s følg så instruksene for nedlasting og start av Tor Browser."
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:125
+#: lib/bridgedb/strings.py:126
msgid ""
"When the 'Tor Network Settings' dialogue pops up, click 'Configure' and follow\n"
"the wizard until it asks:"
msgstr "Når 'Tor nettverks-innstillinger' dialogboksen spretter opp, trykk på 'oppsett' og følg\nveiviseren til den forespør:"
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:129
+#: lib/bridgedb/strings.py:130
msgid ""
"Does your Internet Service Provider (ISP) block or otherwise censor connections\n"
"to the Tor network?"
msgstr "Sensurerer, eller blokkerer på annen måte, din internetttilbyder (ISP) tilkoblinger\ntil Tor-nettverket?"
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:133
+#: lib/bridgedb/strings.py:134
msgid ""
"Select 'Yes' and then click 'Next'. To configure your new bridges, copy and\n"
"paste the bridge lines into the text input box. Finally, click 'Connect', and\n"
@@ -232,29 +235,29 @@ msgid ""
"button in the 'Tor Network Settings' wizard for further assistance."
msgstr "Velg 'Ja' og klikk så 'Neste'. For å sette opp nye broer, kopier og\nlim inn brolinjene i tekstboksen. Til slutt, trykk 'Koble til', og\ndu burde være klar til kamp! Hvis du får problemer, trykk 'Hjelp'\n-knappen i \"Tor-nettverksinnstillinger'-veiviseren for ytterligere hjelp."
-#: lib/bridgedb/strings.py:141
+#: lib/bridgedb/strings.py:142
msgid "Displays this message."
msgstr "Vis denne meldingen."
#. TRANSLATORS: Please try to make it clear that "vanilla" here refers to the
#. same non-Pluggable Transport bridges described above as being
#. "plain-ol'-vanilla" bridges.
-#: lib/bridgedb/strings.py:145
+#: lib/bridgedb/strings.py:146
msgid "Request vanilla bridges."
-msgstr "Forespørr broer med fabrikkoppsett."
+msgstr "Be om broer med \"vanilla\" fabrikkoppsett."
-#: lib/bridgedb/strings.py:146
+#: lib/bridgedb/strings.py:147
msgid "Request IPv6 bridges."
msgstr "Etterspør IPv6-broer."
#. TRANSLATORS: Please DO NOT translate the word the word "TYPE".
-#: lib/bridgedb/strings.py:148
+#: lib/bridgedb/strings.py:149
msgid "Request a Pluggable Transport by TYPE."
-msgstr "Etterspørr pluggbar transport etter TYPE."
+msgstr "Be om en pluggbar transport etter TYPE."
#. TRANSLATORS: Please DO NOT translate "BridgeDB".
#. TRANSLATORS: Please DO NOT translate "GnuPG".
-#: lib/bridgedb/strings.py:151
+#: lib/bridgedb/strings.py:152
msgid "Get a copy of BridgeDB's public GnuPG key."
msgstr "Få kopi av BridgeDBs offentlige GnuPG-nøkkel."
1
0
commit b947daa0719229258e61a6c9863d61a4b58721f3
Author: Isis Lovecruft <isis(a)torproject.org>
Date: Sat Jul 25 02:10:43 2015 +0000
Update Swedish (sv) translations.
* THANKS TO Peter Michanek.
---
bridgedb/i18n/sv/LC_MESSAGES/bridgedb.po | 32 ++++++++++++++++--------------
1 file changed, 17 insertions(+), 15 deletions(-)
diff --git a/bridgedb/i18n/sv/LC_MESSAGES/bridgedb.po b/bridgedb/i18n/sv/LC_MESSAGES/bridgedb.po
index ce8b18a..3c3e4d4 100644
--- a/bridgedb/i18n/sv/LC_MESSAGES/bridgedb.po
+++ b/bridgedb/i18n/sv/LC_MESSAGES/bridgedb.po
@@ -6,6 +6,7 @@
# Anders Jensen-Urstad <anders(a)unix.se>, 2014
# Emil Johansson <emil.a.johansson(a)gmail.com>, 2015
# GabSeb, 2014
+# Peter Michanek <peter(a)michanek.se>, 2015
# Petomatick <petomatick(a)hotmail.com>, 2011
# ph AA, 2015
# phst <transifex(a)sturman.se>, 2014
@@ -15,9 +16,9 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: 'https://trac.torproject.org/projects/tor/newticket?component=BridgeDB&keywo…'\n"
-"POT-Creation-Date: 2015-02-03 03:24+0000\n"
-"PO-Revision-Date: 2015-02-23 19:22+0000\n"
-"Last-Translator: ph AA\n"
+"POT-Creation-Date: 2015-03-19 22:13+0000\n"
+"PO-Revision-Date: 2015-04-30 21:24+0000\n"
+"Last-Translator: Peter Michanek <peter(a)michanek.se>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/torproject/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -37,7 +38,7 @@ msgstr ""
#. "fteproxy"
#. "Tor"
#. "Tor Browser"
-#: lib/bridgedb/HTTPServer.py:122
+#: lib/bridgedb/HTTPServer.py:107
msgid "Sorry! Something went wrong with your request."
msgstr "Något gick tyvärr fel med din förfrågan."
@@ -208,26 +209,27 @@ msgstr "Hur du börjar använda dina bryggor"
#: lib/bridgedb/strings.py:121
#, python-format
msgid ""
-"To enter bridges into Tor Browser, follow the instructions on the %s Tor\n"
-"Browser download page %s to start Tor Browser."
-msgstr "För att ange bryggor i Tor Browser, följ instruktionerna på nedladdningssidan %s Tor Browser %s för att starta Tor Browser."
+"To enter bridges into Tor Browser, first go to the %s Tor Browser download\n"
+"page %s and then follow the instructions there for downloading and starting\n"
+"Tor Browser."
+msgstr "För att ange bryggor i Tor Borwser, gå till nedladdningssidan %s Tor Browser %s och följ instruktionerna för att ladda ner och starta Tor Browser."
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:125
+#: lib/bridgedb/strings.py:126
msgid ""
"When the 'Tor Network Settings' dialogue pops up, click 'Configure' and follow\n"
"the wizard until it asks:"
msgstr "När dialogen \"Nätverksinställningar för Tor\" visas, välj \"Konfigurera\" och följ\nstegen tills du kommer till frågan:"
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:129
+#: lib/bridgedb/strings.py:130
msgid ""
"Does your Internet Service Provider (ISP) block or otherwise censor connections\n"
"to the Tor network?"
msgstr "Blockerar eller filtrerar din Internetleverantör (ISP) anslutningar till Tor network?"
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:133
+#: lib/bridgedb/strings.py:134
msgid ""
"Select 'Yes' and then click 'Next'. To configure your new bridges, copy and\n"
"paste the bridge lines into the text input box. Finally, click 'Connect', and\n"
@@ -235,29 +237,29 @@ msgid ""
"button in the 'Tor Network Settings' wizard for further assistance."
msgstr "Välj 'Ja' och klicka sedan på 'Nästa'. För att konfigurera nya bryggor, kopiera och klistra in bryggraderna i textrutan. Klicka slutligen på 'Anslut' och det borde vara klart för användning! Om du får problem, prova att klicka på 'Hjälp'-knappen i 'Tor Network Settings' för vidare hjälp."
-#: lib/bridgedb/strings.py:141
+#: lib/bridgedb/strings.py:142
msgid "Displays this message."
msgstr "Visa detta meddelande."
#. TRANSLATORS: Please try to make it clear that "vanilla" here refers to the
#. same non-Pluggable Transport bridges described above as being
#. "plain-ol'-vanilla" bridges.
-#: lib/bridgedb/strings.py:145
+#: lib/bridgedb/strings.py:146
msgid "Request vanilla bridges."
msgstr "Leta efter vanliga bryggor."
-#: lib/bridgedb/strings.py:146
+#: lib/bridgedb/strings.py:147
msgid "Request IPv6 bridges."
msgstr "Begär IPv6-bryggor"
#. TRANSLATORS: Please DO NOT translate the word the word "TYPE".
-#: lib/bridgedb/strings.py:148
+#: lib/bridgedb/strings.py:149
msgid "Request a Pluggable Transport by TYPE."
msgstr "Leta efter en Pluggable Transport av en viss TYPE"
#. TRANSLATORS: Please DO NOT translate "BridgeDB".
#. TRANSLATORS: Please DO NOT translate "GnuPG".
-#: lib/bridgedb/strings.py:151
+#: lib/bridgedb/strings.py:152
msgid "Get a copy of BridgeDB's public GnuPG key."
msgstr "Hämta en kopia av BridgeDB:s publika GnuPG-nyckel."
1
0
commit f37ecec4234f812fa777bb24ea6f003453f69488
Author: Isis Lovecruft <isis(a)torproject.org>
Date: Sat Jul 25 02:47:04 2015 +0000
Update Latvian (lv) translations.
* THANKS TO Ojārs Balcers.
---
bridgedb/i18n/lv/LC_MESSAGES/bridgedb.po | 78 +++++++++++++++++++-----------
1 file changed, 51 insertions(+), 27 deletions(-)
diff --git a/bridgedb/i18n/lv/LC_MESSAGES/bridgedb.po b/bridgedb/i18n/lv/LC_MESSAGES/bridgedb.po
index 0f70c18..1e1366b 100644
--- a/bridgedb/i18n/lv/LC_MESSAGES/bridgedb.po
+++ b/bridgedb/i18n/lv/LC_MESSAGES/bridgedb.po
@@ -1,18 +1,18 @@
# Translations template for BridgeDB.
-# Copyright (C) 2014 'The Tor Project, Inc.'
+# Copyright (C) 2015 'The Tor Project, Inc.'
# This file is distributed under the same license as the BridgeDB project.
#
# Translators:
# Ojārs Balcers <ojars.balcers(a)gmail.com>, 2012
-# Ojārs Balcers <ojars.balcers(a)gmail.com>, 2013-2014
+# Ojārs Balcers <ojars.balcers(a)gmail.com>, 2013-2015
# ThePirateDuck <thepirateduck.w(a)gmail.com>, 2014
msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: 'https://trac.torproject.org/projects/tor/newticket?component=BridgeDB&keywo…'\n"
-"POT-Creation-Date: 2014-07-26 02:11+0000\n"
-"PO-Revision-Date: 2014-10-15 17:11+0000\n"
-"Last-Translator: ThePirateDuck <thepirateduck.w(a)gmail.com>\n"
+"POT-Creation-Date: 2015-03-19 22:13+0000\n"
+"PO-Revision-Date: 2015-07-20 10:46+0000\n"
+"Last-Translator: Ojārs Balcers <ojars.balcers(a)gmail.com>\n"
"Language-Team: Latvian (http://www.transifex.com/projects/p/torproject/language/lv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,7 +32,7 @@ msgstr ""
#. "fteproxy"
#. "Tor"
#. "Tor Browser"
-#: lib/bridgedb/HTTPServer.py:121
+#: lib/bridgedb/HTTPServer.py:107
msgid "Sorry! Something went wrong with your request."
msgstr "Atvainojiet! Notikusi ar Jūsu pieprasījumu saistīta kļūme."
@@ -75,7 +75,7 @@ msgstr "Hei, %s!"
msgid "Hello, friend!"
msgstr "Sveiks, draug!"
-#: lib/bridgedb/strings.py:33 lib/bridgedb/templates/base.html:101
+#: lib/bridgedb/strings.py:33 lib/bridgedb/templates/base.html:100
msgid "Public Keys"
msgstr "Publiskās atslēgas"
@@ -203,26 +203,27 @@ msgstr "Kā sākt izmantot Jūsu tiltus"
#: lib/bridgedb/strings.py:121
#, python-format
msgid ""
-"To enter bridges into Tor Browser, follow the instructions on the %s Tor\n"
-"Browser download page %s to start Tor Browser."
-msgstr "Sekojiet instrukcijām Tor %s, lai ievadītu tiltus Tor Broswer\nPārlūka lejuplādes lapa %s , lai startētu Tor Browser. "
+"To enter bridges into Tor Browser, first go to the %s Tor Browser download\n"
+"page %s and then follow the instructions there for downloading and starting\n"
+"Tor Browser."
+msgstr "Lai pārlūkā Tor ievadītu tiltus, vispirms dodieties uz %s pārlūka Tor lejuplādes \nlapu %s un tad sekojiet pārlūka Tor lejupielādes un sākšanas norādēm."
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:125
+#: lib/bridgedb/strings.py:126
msgid ""
"When the 'Tor Network Settings' dialogue pops up, click 'Configure' and follow\n"
"the wizard until it asks:"
msgstr "Kad uznirst dialogs \"Tor tīkla iestatījumi\", noklikšķiniet \"Konfigurēt\" un sēkojiet\nvednim līdz tas jautā:"
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:129
+#: lib/bridgedb/strings.py:130
msgid ""
"Does your Internet Service Provider (ISP) block or otherwise censor connections\n"
"to the Tor network?"
msgstr "Vai Jūsu Interneta pakalpojumu sniedzējs (ISP) bloķē vai citādā veidā cenzē savienojumus\nar tīklu Tor?"
#. TRANSLATORS: Please DO NOT translate "Tor".
-#: lib/bridgedb/strings.py:133
+#: lib/bridgedb/strings.py:134
msgid ""
"Select 'Yes' and then click 'Next'. To configure your new bridges, copy and\n"
"paste the bridge lines into the text input box. Finally, click 'Connect', and\n"
@@ -230,61 +231,84 @@ msgid ""
"button in the 'Tor Network Settings' wizard for further assistance."
msgstr "Atlasiet \"Jā\" un tad noklikšķiniet \"Tālāk\". Lai konfigurētu savus jaunos tiltus, kopējiet un\nielīmējiet tiltu līnijas teksta ievades lodziņā. Beigās noklišķiniet \"Izveidot savienojumu\" un\nvisam vajadzētu notikt! Ja ir problēmas, turpmākai palīdzībai pamēģiniet noklišķināt vednī \"Tor tīkla iestatījumi\" pogu \"Palīdzība\"."
-#: lib/bridgedb/strings.py:141
+#: lib/bridgedb/strings.py:142
msgid "Displays this message."
msgstr "Rāda ziņojumu."
#. TRANSLATORS: Please try to make it clear that "vanilla" here refers to the
#. same non-Pluggable Transport bridges described above as being
#. "plain-ol'-vanilla" bridges.
-#: lib/bridgedb/strings.py:145
+#: lib/bridgedb/strings.py:146
msgid "Request vanilla bridges."
msgstr "Pieprasīt parastos tiltus."
-#: lib/bridgedb/strings.py:146
+#: lib/bridgedb/strings.py:147
msgid "Request IPv6 bridges."
msgstr "Pieprasīt IPv6 tiltus."
#. TRANSLATORS: Please DO NOT translate the word the word "TYPE".
-#: lib/bridgedb/strings.py:148
+#: lib/bridgedb/strings.py:149
msgid "Request a Pluggable Transport by TYPE."
msgstr "Pieprasīt Pluggable Transport pēc TYPE."
#. TRANSLATORS: Please DO NOT translate "BridgeDB".
#. TRANSLATORS: Please DO NOT translate "GnuPG".
-#: lib/bridgedb/strings.py:151
+#: lib/bridgedb/strings.py:152
msgid "Get a copy of BridgeDB's public GnuPG key."
msgstr "Saņemt BridgeDB publiskās GnuPG atslēgas kopiju."
-#: lib/bridgedb/templates/base.html:92
+#: lib/bridgedb/templates/base.html:89
msgid "Report a Bug"
msgstr "Ziņot par kļūdu"
-#: lib/bridgedb/templates/base.html:94
+#: lib/bridgedb/templates/base.html:92
msgid "Source Code"
msgstr "Pirmkods"
-#: lib/bridgedb/templates/base.html:97
+#: lib/bridgedb/templates/base.html:95
msgid "Changelog"
msgstr "Izmaiņu žurnāls"
-#: lib/bridgedb/templates/base.html:99
+#: lib/bridgedb/templates/base.html:98
msgid "Contact"
msgstr "Sazināties"
+#: lib/bridgedb/templates/bridges.html:81
+msgid "Select All"
+msgstr "Atlasīt visu"
+
+#: lib/bridgedb/templates/bridges.html:87
+msgid "Show QRCode"
+msgstr "Parādīt QRCode"
+
+#: lib/bridgedb/templates/bridges.html:100
+msgid "QRCode for your bridge lines"
+msgstr "QRCode Jūsu tiltu rindām"
+
#. TRANSLATORS: Please translate this into some silly way to say
#. "There was a problem!" in your language. For example,
#. for Italian, you might translate this into "Mama mia!",
#. or for French: "Sacrebleu!". :)
-#: lib/bridgedb/templates/bridges.html:66
+#: lib/bridgedb/templates/bridges.html:115
+#: lib/bridgedb/templates/bridges.html:175
msgid "Uh oh, spaghettios!"
msgstr "Ak, man' dieniņ!"
-#: lib/bridgedb/templates/bridges.html:72
+#: lib/bridgedb/templates/bridges.html:116
+msgid "It seems there was an error getting your QRCode."
+msgstr "Sķiet, ka, saņemot Jūsu QRCode, notika kļūda."
+
+#: lib/bridgedb/templates/bridges.html:121
+msgid ""
+"This QRCode contains your bridge lines. Scan it with a QRCode reader to copy"
+" your bridge lines onto mobile and other devices."
+msgstr "Jūsu tiltu rindas ir QRCode. Skenējiet to ar QRCode lasītāju, lai iekopētu Jūsu tiltu rindas mobilajā tālrunī un citās iekārtās."
+
+#: lib/bridgedb/templates/bridges.html:181
msgid "There currently aren't any bridges available..."
msgstr "Šobrīd nav pieejamu tiltu..."
-#: lib/bridgedb/templates/bridges.html:73
+#: lib/bridgedb/templates/bridges.html:182
#, python-format
msgid ""
" Perhaps you should try %s going back %s and choosing a different bridge "
@@ -345,7 +369,7 @@ msgstr "nekas"
#. TRANSLATORS: Please make sure the '%s' surrounding single letters at the
#. beginning of words are present in your final translation. Thanks!
#. TRANSLATORS: Translate "Yes!" as in "Yes! I do need IPv6 addresses."
-#: lib/bridgedb/templates/options.html:130
+#: lib/bridgedb/templates/options.html:127
#, python-format
msgid "%sY%ses!"
msgstr "%sJ%sā!"
@@ -353,7 +377,7 @@ msgstr "%sJ%sā!"
#. TRANSLATORS: Please make sure the '%s' surrounding single letters at the
#. beginning of words are present in your final translation. Thanks!
#. TRANSLATORS: Please do NOT translate the word "bridge"!
-#: lib/bridgedb/templates/options.html:154
+#: lib/bridgedb/templates/options.html:151
#, python-format
msgid "%sG%set Bridges"
msgstr "%sS%saņemt tiltus"
1
0

[bridgedb/develop] Add a Content-Security-Policy header to all webserver pages.
by isis@torproject.org 25 Jul '15
by isis@torproject.org 25 Jul '15
25 Jul '15
commit 002104d3773344fbeda94f071f9e50312e7e4223
Author: Isis Lovecruft <isis(a)torproject.org>
Date: Mon Jul 20 19:46:34 2015 +0000
Add a Content-Security-Policy header to all webserver pages.
In addition, there were numerous elements of inline CSS styling and
various onclick handlers which had to be rewritten. While I was at it,
I rewrote the stylesheets to fix serious usability/readability problems,
particularly when using mobile devices like tablets and phones. Other
problems, like the onion logo in the background sometime overwriting or
blending with text on some pages, are now fixed as well.
* ADDS a new class, `bridgedb.https.server.CSPResource`, which handles
adding an appropriate CSP header to all pages which inherit from it.
* FIXES #15968: https://bugs.torproject.org/15968
* CHANGES the CSS styling for some pages, for some window sizes and
devices, to be more responsive, readable, and usable.
* ADD @media CSS queries in order to improve readability and usability on
small devices.
* CHANGES the captcha.html page with various visual (i.e. the functionality
hasn't been altered) improvements.
* CHANGES the behaviour for loading additional CSS when rendered in a
left-to-right charset.
* CHANGE javascript functions to update the "aria-hidden" attribute for
the QRCode modal properly, in order to improve accessibility
(particularly for screen reader devices).
* ADD use of "aria-disabled" attribute, for the "Select All" button
when JS is disabled, for the accessibility reasons ibid.
* FIXES #16649: https://bugs.torproject.org/16649
---
bridgedb.conf | 44 ++-
bridgedb/configure.py | 3 +-
bridgedb/https/server.py | 183 ++++++++++-
bridgedb/https/templates/assets/css/custom.css | 158 ---------
bridgedb/https/templates/assets/css/main.css | 419 +++++++++++++++++++++++-
bridgedb/https/templates/assets/css/rtl.css | 7 +
bridgedb/https/templates/assets/js/bridges.js | 83 +++++
bridgedb/https/templates/base.html | 142 ++++----
bridgedb/https/templates/bridges.html | 102 ++----
bridgedb/https/templates/captcha.html | 92 +++---
bridgedb/https/templates/howto.html | 11 +-
bridgedb/https/templates/index.html | 12 +-
bridgedb/https/templates/options.html | 124 ++++---
scripts/setup-tests | 1 +
setup.py | 3 +-
test/https_helpers.py | 32 +-
test/test_https.py | 22 ++
test/test_https_server.py | 130 +++++++-
18 files changed, 1105 insertions(+), 463 deletions(-)
diff --git a/bridgedb.conf b/bridgedb.conf
index 2c83582..bc79b86 100644
--- a/bridgedb.conf
+++ b/bridgedb.conf
@@ -15,11 +15,16 @@
# for details.
# :copyright: (c) 2007-2015 The Tor Project, Inc.
# (c) 2007-2015, all sentient entities within the AUTHORS file
-# :version: 0.3.2
+# :version: 0.3.3
#===============================================================================
#
# CHANGELOG:
# ~~~~~~~~~~
+# Changed in version 0.3.3 - 2015-07-22
+# * ADD new options, CSP_ENABLED, CSP_REPORT_ONLY, and CSP_INCLUDE_SELF for
+# setting options related to HTTP(S) Distributor Content Security Policy
+# settings.
+#
# Changed in version 0.3.2 - 2015-04-30
# * CHANGE to using BridgeDB release versions for bridgedb.conf file versions.
# * ADD support for specifying bridge rotation periods via the
@@ -366,6 +371,43 @@ GIMP_CAPTCHA_DIR = 'captchas'
GIMP_CAPTCHA_HMAC_KEYFILE = 'captcha_hmac_key'
GIMP_CAPTCHA_RSA_KEYFILE = 'captcha_rsa_key'
+# Content Security Policy Settings
+# --------------------------------
+
+# (boolean) If True, enable use of CSP headers. This must be True for any
+# other CSP-related options to have any effect.
+#
+# If enabled, the default Content Security Policy (CSP) is:
+#
+# default-src 'none' ;
+# base-uri FQDN ;
+# script-src FQDN ;
+# style-src FQDN ;
+# img-src FQDN data: ;
+# font-src FQDN ;
+#
+# where "FQDN" is the value of the SERVER_PUBLIC_FQDN config setting.
+#
+# If CSP_INCLUDE_SELF is enabled, then "'self'" (literally, the word self
+# surrounded by single-quotes) will be appended to the value of the
+# SERVER_PUBLIC_FQDN config setting to create the "FQDN".
+
+CSP_ENABLED = True
+
+# (boolean) If True (and CSP_ENABLED is also True), then set a "report-only"
+# Content Security Policy. This means that client agents which run into
+# problems with or cause violations of our CSP settings will report data
+# regarding the problems/violations. This report data is then logged (at the
+# DEBUG level), along with the client's IP address (only if SAFELOGGING is
+# disabled, otherwise the client's IP address is not reported).
+
+CSP_REPORT_ONLY = False
+
+# (boolean) If True, then append "'self'" to the "FQDN" in the default CSP
+# header described above.
+
+CSP_INCLUDE_SELF = True
+
#-------------------------------
# Email Distribution Options \
#------------------------------------------------------------------------------
diff --git a/bridgedb/configure.py b/bridgedb/configure.py
index 0056107..c406582 100644
--- a/bridgedb/configure.py
+++ b/bridgedb/configure.py
@@ -120,7 +120,8 @@ def loadConfig(configFile=None, configCls=None):
setting = getattr(config, attr, None) # Default to None
setattr(config, attr, setting)
- for attr in ["IGNORE_NETWORKSTATUS"]:
+ for attr in ["IGNORE_NETWORKSTATUS", "CSP_ENABLED", "CSP_REPORT_ONLY",
+ "CSP_INCLUDE_SELF"]:
setting = getattr(config, attr, True) # Default to True
setattr(config, attr, setting)
diff --git a/bridgedb/https/server.py b/bridgedb/https/server.py
index 2106dbf..ef40377 100644
--- a/bridgedb/https/server.py
+++ b/bridgedb/https/server.py
@@ -73,6 +73,36 @@ lookup = TemplateLookup(directories=[TEMPLATE_DIR],
collection_size=500)
logging.debug("Set template root to %s" % TEMPLATE_DIR)
+#: This server's public, fully-qualified domain name.
+SERVER_PUBLIC_FQDN = None
+
+
+def setFQDN(fqdn, https=True):
+ """Set the global :data:`SERVER_PUBLIC FQDN` variable.
+
+ :param str fqdn: The public, fully-qualified domain name of the HTTP
+ server that will serve this resource.
+ :param bool https: If ``True``, then ``'https://'`` will be prepended to
+ the FQDN. This is primarily used to create a
+ ``Content-Security-Policy`` header that will only allow resources to
+ be sourced via HTTPS, otherwise, if ``False``, it allow resources to
+ be sourced via any transport protocol.
+ """
+ if https:
+ fqdn = 'https://' + fqdn
+
+ logging.info("Setting HTTP server public FQDN to %r" % fqdn)
+
+ global SERVER_PUBLIC_FQDN
+ SERVER_PUBLIC_FQDN = fqdn
+
+def getFQDN():
+ """Get the setting for the HTTP server's public FQDN from the global
+ :data:`SERVER_PUBLIC_FQDN variable.
+
+ :rtype: str or None
+ """
+ return SERVER_PUBLIC_FQDN
def getClientIP(request, useForwardedHeader=False):
"""Get the client's IP address from the :header:`X-Forwarded-For`
@@ -146,7 +176,128 @@ def replaceErrorPage(error, template_name=None):
return rendered
-class TranslatedTemplateResource(resource.Resource):
+class CSPResource(resource.Resource):
+ """A resource which adds a ``'Content-Security-Policy:'`` header.
+
+ :vartype reportViolations: bool
+ :var reportViolations: Use the Content Security Policy in `report-only`_
+ mode, causing CSP violations to be reported back to the server (at
+ :attr:`reportURI`, where the details of the violation will be logged).
+ (default: ``False``)
+ :vartype reportURI: str
+ :var reportURI: If :attr:`reportViolations` is ``True``, Content Security
+ Policy violations will be sent as JSON-encoded POST request to this
+ URI. (default: ``'csp-violation'``)
+
+ .. _report-only:
+ https://w3c.github.io/webappsec/specs/content-security-policy/#content-secu…
+ """
+ reportViolations = False
+ reportURI = 'csp-violation'
+
+ def __init__(self, includeSelf=False, enabled=True, reportViolations=False,
+ useForwardedHeader=False):
+ """Create a new :api:`twisted.web.resource.Resource` which adds a
+ ``'Content-Security-Policy:'`` header.
+
+ If enabled, the default Content Security Policy is::
+
+ default-src 'none' ;
+ base-uri FQDN ;
+ script-src FQDN ;
+ style-src FQDN ;
+ img-src FQDN data: ;
+ font-src FQDN ;
+
+ where ``FQDN`` the value returned from the :func:`getFQDN` function
+ (which uses the ``SERVER_PUBLIC_FQDN`` config file option).
+
+ If the **includeSelf** parameter is enabled, then ``"'self'"``
+ (literally, a string containing the word ``self``, surrounded by
+ single-quotes) will be appended to the ``FQDN``.
+
+ :param str fqdn: The public, fully-qualified domain name
+ of the HTTP server that will serve this resource.
+ :param bool includeSelf: Append ``'self'`` after the **fqdn** in the
+ Content Security Policy.
+ :param bool enabled: If ``False``, all Content Security Policy
+ headers, including those used in report-only mode, will not be
+ sent. If ``True``, Content Security Policy headers (regardless of
+ whether report-only mode is dis-/en-abled) will be sent.
+ (default: ``True``)
+ :param bool reportViolations: Use the Content Security Policy in
+ report-only mode, causing CSP violations to be reported back to
+ the server (at :attr:`reportURI`, where the details of the
+ violation will be logged). (default: ``False``)
+ :param bool useForwardedHeader: If ``True``, then we will attempt to
+ obtain the client's IP address from the ``X-Forwarded-For`` HTTP
+ header. This *only* has an effect if **reportViolations** is also
+ set to ``True`` — the client's IP address is logged along with any
+ CSP violation reports which the client sent via HTTP POST requests
+ to our :attr:`reportURI`. (default: ``False``)
+ """
+ resource.Resource.__init__(self)
+
+ self.fqdn = getFQDN()
+ self.enabled = enabled
+ self.useForwardedHeader = useForwardedHeader
+ self.csp = ("default-src 'none'; "
+ "base-uri {0}; "
+ "script-src {0}; "
+ "style-src {0}; "
+ "img-src {0} data:; "
+ "font-src {0}; ")
+
+ if includeSelf:
+ self.fqdn = " ".join([self.fqdn, "'self'"])
+
+ if reportViolations:
+ self.reportViolations = reportViolations
+
+ def setCSPHeader(self, request):
+ """Set the CSP header for a **request**.
+
+ If this :class:`CSPResource` is :attr:`enabled`, then use
+ :api:`twisted.web.http.Request.setHeader` to send an HTTP
+ ``'Content-Security-Policy:'`` header for any response made to the
+ **request** (or a ``'Content-Security-Policy-Report-Only:'`` header,
+ if :attr:`reportViolations` is enabled).
+
+ :type request: :api:`twisted.web.http.Request`
+ :param request: A ``Request`` object for :attr:`reportViolationURI`.
+ """
+ self.fqdn = self.fqdn or getFQDN() # Update the FQDN if it changed.
+
+ if self.enabled and self.fqdn:
+ if not self.reportViolations:
+ request.setHeader("Content-Security-Policy",
+ self.csp.format(self.fqdn))
+ else:
+ logging.debug("Sending report-only CSP header...")
+ request.setHeader("Content-Security-Policy-Report-Only",
+ self.csp.format(self.fqdn) +
+ "report-uri /%s" % self.reportURI)
+
+ def render_POST(self, request):
+ """If we're in debug mode, log a Content Security Policy violation.
+
+ :type request: :api:`twisted.web.http.Request`
+ :param request: A ``Request`` object for :attr:`reportViolationURI`.
+ """
+ try:
+ client = getClientIP(request, self.useForwardedHeader)
+ report = request.content.read(2048)
+
+ logging.warning("Content-Security-Policy violation report from %s: %r"
+ % (client or "UNKNOWN CLIENT", report))
+ except Exception as err:
+ logging.error("Error while attempting to log CSP report: %s" % err)
+
+ # Redirect back to the original resource after the report was logged:
+ return redirectTo(request.uri, request)
+
+
+class TranslatedTemplateResource(CSPResource):
"""A generalised resource which uses gettext translations and Mako
templates.
"""
@@ -157,10 +308,11 @@ class TranslatedTemplateResource(resource.Resource):
Mako-templated webpage.
"""
gettext.install("bridgedb", unicode=True)
- resource.Resource.__init__(self)
+ CSPResource.__init__(self)
self.template = template
def render_GET(self, request):
+ self.setCSPHeader(request)
rtl = False
try:
langs = translations.getLocaleFromHTTPRequest(request)
@@ -200,14 +352,14 @@ class HowtoResource(TranslatedTemplateResource):
TranslatedTemplateResource.__init__(self, 'howto.html')
-class CaptchaProtectedResource(resource.Resource):
+class CaptchaProtectedResource(CSPResource):
"""A general resource protected by some form of CAPTCHA."""
isLeaf = True
def __init__(self, publicKey=None, secretKey=None,
useForwardedHeader=False, protectedResource=None):
- resource.Resource.__init__(self)
+ CSPResource.__init__(self)
self.publicKey = publicKey
self.secretKey = secretKey
self.useForwardedHeader = useForwardedHeader
@@ -275,6 +427,8 @@ class CaptchaProtectedResource(resource.Resource):
:returns: A rendered HTML page containing a ReCaptcha challenge image
for the client to solve.
"""
+ self.setCSPHeader(request)
+
rtl = False
image, challenge = self.getCaptchaImage(request)
@@ -312,6 +466,7 @@ class CaptchaProtectedResource(resource.Resource):
:returns: A rendered HTML page containing a ReCaptcha challenge image
for the client to solve.
"""
+ self.setCSPHeader(request)
request.setHeader("Content-Type", "text/html; charset=utf-8")
if self.checkSolution(request) is True:
@@ -354,6 +509,8 @@ class GimpCaptchaProtectedResource(CaptchaProtectedResource):
:type protectedResource: :api:`twisted.web.resource.Resource`
:param protectedResource: The resource to serve if the client
successfully passes the CAPTCHA challenge.
+ :param str serverPublicFQDN: The public, fully-qualified domain name
+ of the HTTP server that will serve this resource.
"""
CaptchaProtectedResource.__init__(self, **kwargs)
self.hmacKey = hmacKey
@@ -614,12 +771,13 @@ class ReCaptchaProtectedResource(CaptchaProtectedResource):
:meth:`_renderDeferred` will handle rendering and displaying the
HTML to the client.
"""
+ self.setCSPHeader(request)
d = self.checkSolution(request)
d.addCallback(self._renderDeferred)
return NOT_DONE_YET
-class BridgesResource(resource.Resource):
+class BridgesResource(CSPResource):
"""This resource displays bridge lines in response to a request."""
isLeaf = True
@@ -641,7 +799,7 @@ class BridgesResource(resource.Resource):
fingerprint in the response?
"""
gettext.install("bridgedb", unicode=True)
- resource.Resource.__init__(self)
+ CSPResource.__init__(self)
self.distributor = distributor
self.schedule = schedule
self.nBridgesToGive = N
@@ -663,6 +821,8 @@ class BridgesResource(resource.Resource):
:rtype: str
:returns: A plaintext or HTML response to serve.
"""
+ self.setCSPHeader(request)
+
try:
response = self.getBridgeRequestAnswer(request)
except Exception as err:
@@ -815,6 +975,10 @@ def addWebServer(config, distributor):
GIMP_CAPTCHA_DIR
GIMP_CAPTCHA_HMAC_KEYFILE
GIMP_CAPTCHA_RSA_KEYFILE
+ SERVER_PUBLIC_FQDN
+ CSP_ENABLED
+ CSP_REPORT_ONLY
+ CSP_INCLUDE_SELF
:type distributor: :class:`bridgedb.https.distributor.HTTPSDistributor`
:param distributor: A bridge distributor.
:raises SystemExit: if the servers cannot be started.
@@ -828,12 +992,18 @@ def addWebServer(config, distributor):
logging.info("Starting web servers...")
+ setFQDN(config.SERVER_PUBLIC_FQDN)
+
index = IndexResource()
options = OptionsResource()
howto = HowtoResource()
robots = static.File(os.path.join(TEMPLATE_DIR, 'robots.txt'))
assets = static.File(os.path.join(TEMPLATE_DIR, 'assets/'))
keys = static.Data(bytes(strings.BRIDGEDB_OPENPGP_KEY), 'text/plain')
+ csp = CSPResource(enabled=config.CSP_ENABLED,
+ includeSelf=config.CSP_INCLUDE_SELF,
+ reportViolations=config.CSP_REPORT_ONLY,
+ useForwardedHeader=fwdHeaders)
root = resource.Resource()
root.putChild('', index)
@@ -842,6 +1012,7 @@ def addWebServer(config, distributor):
root.putChild('assets', assets)
root.putChild('options', options)
root.putChild('howto', howto)
+ root.putChild(CSPResource.reportURI, csp)
if config.RECAPTCHA_ENABLED:
publicKey = config.RECAPTCHA_PUB_KEY
diff --git a/bridgedb/https/templates/assets/css/custom.css b/bridgedb/https/templates/assets/css/custom.css
deleted file mode 100644
index f0bde6f..0000000
--- a/bridgedb/https/templates/assets/css/custom.css
+++ /dev/null
@@ -1,158 +0,0 @@
-body {
- padding-top: 20px;
- padding-bottom: 40px;
-}
-
-/* Custom container */
-.container-narrow {
- margin: 0 auto;
- max-width: 675px;
-}
-.container-narrow > hr {
- margin: 30px 0;
-}
-
-/* Main marketing message and sign up button */
-.jumbotron {
- margin: 60px 0;
- text-align: center;
-}
-.jumbotron h1 {
- font-size: 72px;
- line-height: 1;
-}
-.jumbotron .btn {
- font-size: 21px;
- padding: 14px 24px;
-}
-
-/* Supporting marketing content */
-.marketing {
- margin: 60px 0;
-}
-.marketing p + h4 {
- margin-top: 28px;
-}
-
-.captcha {
- margin: auto;
- display: block;
- width: 250px;
-}
-
-.captcha .btn {
- margin: auto;
- width: 100px;
- display: block;
-}
-
-.fixed-size-btn {
- margin: 10px;
- width: 200px;
-}
-
-.main-steps {
- margin: 50px;
-}
-
-
-.main-btns {
- margin: auto;
- width: 450px;
- display: block;
-}
-
-.step{
-border: 1px solid #ccc;
-border: 1px solid rgba(0, 0, 0, 0.2);
--webkit-border-radius: 6px;
--moz-border-radius: 6px;
-border-radius: 6px;
--webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
--moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
--webkit-background-clip: padding-box;
--moz-background-clip: padding;
-background-clip: padding-box;
-padding: 10px 20px 0px;
-margin-bottom: 10px;
-}
-
-.step-title {
-color: #808080;
-font-size: 18px;
-font-weight: 100;
-}
-
-.step-text {
- font-size: 18px;
-line-height: 30px;
-margin-top: 2px;
-}
-.lead_right {
- margin-bottom: 20px;
- font-size: 21px;
- font-weight: 200;
- line-height: 30px
-}
-[class*="bdb_span"] {
- min-height: 1px;
- margin: 0 20px 16px 20px;
-}
-.bdb_span7 {
- width: 560px
-}
-
-div.bridge-lines {
- padding: 20px;
- margin: 0px 0px 20px;
- min-height: 20px;
- font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
- font-size: 95%;
- line-height: 175%;
- color: rgb(44, 62, 80);
- word-break: break-all;
- word-wrap: normal;
- white-space: nowrap;
- overflow-x: auto;
- z-index: 1000;
- background-color: rgb(236, 240, 241);
- border: 0px solid transparent;
- border-radius: 6px 6px 6px 6px;
- border-color: #2C3E50;
- box-shadow: none;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- cursor: copy;
-}
-
-div.bridge-lines.-webkit-scrollbar {
- width: 9px;
- height: 9px;
-}
-div.bridge-lines.-webkit-scrollbar-button.start.decrement {
- display: block;
- height: 0;
- background-color: transparent;
-}
-div.bridge-lines.-webkit-scrollbar-button.end.increment {
- display: block;
- height: 0;
- background-color: transparent;
-}
-div.bridge-lines.-webkit-scrollbar-track-piece {
- background-color: #FAFAFA;
- -webkit-border-radius: 0;
- -webkit-border-bottom-right-radius: 6px;
- -webkit-border-bottom-left-radius: 6px;
-}
-div.bridge-lines.-webkit-scrollbar-thumb.vertical {
- height: 50px;
- background-color: #999;
- -webkit-border-radius: 6px;
-}
-div.bridge-lines.-webkit-scrollbar-thumb.horizontal{
- width: 50px;
- background-color: #999;
- -webkit-border-radius: 6px;
-}
diff --git a/bridgedb/https/templates/assets/css/main.css b/bridgedb/https/templates/assets/css/main.css
index df34981..2b06a40 100644
--- a/bridgedb/https/templates/assets/css/main.css
+++ b/bridgedb/https/templates/assets/css/main.css
@@ -1,7 +1,6 @@
/* Imports */
@import url("bootstrap.min.css");
@import url("font-awesome.min.css");
-@import url("custom.css");
/* Fonts */
@font-face {
@@ -22,3 +21,421 @@
font-weight: 400;
src: local('Lato Italic'), local('Lato-Italic'), url('../font/lato-italic.woff') format('woff');
}
+
+body {
+ padding-bottom: 40px;
+}
+.background-1 {
+ background: url(/assets/tor-roots-blue.svg);
+ background-repeat: no-repeat;
+ background-attachment: scroll;
+ background-position: center 10%;
+ background-size: containx;
+}
+.background-2 {
+ background: rgba(255, 255, 255, 0.9875);
+ background-repeat: repeat;
+ background-attachment: fixed;
+ background-position: center top;
+ background-size: cover;
+}
+.masthead {
+ background: rgba(255, 255, 255, 1.0);
+}
+.footer {
+ background: rgba(255, 255, 255, 1.0);
+}
+
+/* The following is made responsive by the */
+/* media queries at the end of this file. */
+.footer-small p,
+.footer-small a,
+.footer-small i {
+ font-size: 90%;
+}
+
+/* Custom container */
+.container-narrow {
+ margin: 0 auto;
+ max-width: 675px;
+}
+.container-narrow > hr {
+ margin: 30px 0;
+}
+.container-fluid-outer,
+.container-fluid-outer-98,
+.container-fluid-outer-96,
+.container-fluid-outer-96-lr {
+ align: center;
+ margin: 2%;
+}
+.container-fluid-outer-98 {
+ width: 98%;
+}
+.container-fluid-outer-96,
+.container-fluid-outer-96-lr {
+ width: 96%;
+}
+.container-fluid-outer-96-lr {
+ margin-top: 0%;
+ margin-bottom: 0%;
+ margin-left: 2%;
+ margin-right: 2%;
+}
+.container-fluid-outer-60-lr {
+ margin-top: 0%;
+ margin-bottom: 0%;
+ margin-left: 20%;
+ margin-right: 20%;
+}
+.container-fluid-outer-100 {
+ width: 100%;
+}
+.container-fluid-inner,
+.container-fluid-inner-2 {
+ padding: 2%;
+}
+.container-fluid-inner-5 {
+ padding: 5%;
+}
+.container-fluid-inner-10 {
+ padding: 10%;
+}
+
+/* Main marketing message and sign up button */
+.jumbotron {
+ margin: 60px 0;
+ text-align: center;
+}
+.jumbotron h1 {
+ font-size: 72px;
+ line-height: 1;
+}
+.jumbotron .btn {
+ font-size: 21px;
+ padding: 14px 24px;
+}
+
+/* Supporting marketing content */
+.marketing {
+ margin: 60px 0;
+}
+.marketing p + h4 {
+ margin-top: 28px;
+}
+
+.captcha {
+ margin: auto;
+ display: block;
+ width: 250px;
+}
+.captcha .btn {
+ margin: auto;
+ width: 100px;
+ display: block;
+}
+.fixed-size-btn {
+ margin: 10px;
+ width: 200px;
+}
+
+.main-steps {
+ margin: 50px;
+ z-index: 1000
+}
+.main-btns {
+ margin: auto;
+ width: 450px;
+ display: block;
+}
+
+.step,
+.step-semi-transparent
+{
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+ padding: 10px 20px 0px;
+ margin-bottom: 10px;
+ background-color: rgba(255, 255, 255, 1.0);
+}
+.step-semi-transparent {
+ background-color: rgba(255, 255, 255, 0.85);
+}
+.step-title {
+ color: #808080;
+ font-size: 18px;
+ font-weight: 100;
+}
+.step-text {
+ font-size: 18px;
+ line-height: 30px;
+ margin-top: 2px;
+ margin-left: 20px;
+ margin-right: 20px;
+}
+.lead_right {
+ margin-bottom: 20px;
+ font-size: 21px;
+ font-weight: 200;
+ line-height: 30px
+}
+[class*="bdb_span"] {
+ min-height: 1px;
+ margin: 0 20px 16px 20px;
+}
+.bdb_span7 {
+ width: 560px
+}
+
+#instructions {
+ align-content: left;
+}
+#advanced-options-legend {
+ font-size: 112%
+}
+#options-row-1,
+#options-row-2 {
+ width: 98%;
+ height: inherit;
+ margin: auto;
+}
+#options-row-2 {
+ margin-right: auto;
+ padding: 4%;
+}
+#options-row-1-col-1,
+#options-row-1-col-2,
+#options-row-2-col1 {
+ width: 50%;
+ height: inherit;
+}
+#options-row-2-col-1 {
+ content-align: center;
+ text-align: center;
+ width: 50%;
+ padding-right: 25%;
+}
+#options-row-1-col-1 {
+ float: left;
+}
+#options-row-1-col-2 {
+ float: right;
+}
+#options-row-1-col-1-step,
+#options-row-1-col-2-step {
+ height: inherit;
+}
+#options-row-1-col-2-step {
+ margin-right: 1%;
+}
+#options-transport-label,
+#options-ipv6-label {
+ text-align: inherit;
+ font-size: 13px;
+ padding-top: 0%;
+ padding-left: 2%;
+ padding-bottom: 5%;
+ padding-right: 2%;
+}
+#options-transport-btn-group,
+#options-ipv6-input-group {
+ float: left;
+}
+#options-ipv6-checkbox {
+ float: left;
+}
+
+#captcha-submission-container {
+ width: 90%;
+ align: center;
+ margin: auto;
+}
+#captcha-box {
+ padding: 5% 15% 5% 15%;
+}
+#captcha-box p {
+ align: center;
+}
+#captcha-box img {
+ /*width: 400px;*/
+ /*height: 125px;*/
+ width: 100%;
+ min-width: 200px;
+}
+#captcha-form-box {
+ align: center;
+ width: 50%;
+ margin: auto;
+}
+#captcha_response_field {
+ height: 47px;
+ margin-top: 0px;
+}
+#captcha-submit-button {
+ height: 47px;
+}
+
+div.bridge-lines {
+ padding: 20px;
+ margin: 0px 0px 20px;
+ min-height: 20px;
+ font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
+ font-size: 95%;
+ line-height: 175%;
+ color: rgb(44, 62, 80);
+ word-break: break-all;
+ word-wrap: normal;
+ white-space: nowrap;
+ overflow-x: auto;
+ z-index: 1000;
+ background-color: rgb(236, 240, 241);
+ border: 0px solid transparent;
+ border-radius: 6px 6px 6px 6px;
+ border-color: #2C3E50;
+ box-shadow: none;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+div.bridge-lines .cursor-copy {
+ cursor: copy;
+}
+div.bridge-lines.-webkit-scrollbar {
+ width: 9px;
+ height: 9px;
+}
+div.bridge-lines.-webkit-scrollbar-button.start.decrement {
+ display: block;
+ height: 0;
+ background-color: transparent;
+}
+div.bridge-lines.-webkit-scrollbar-button.end.increment {
+ display: block;
+ height: 0;
+ background-color: transparent;
+}
+div.bridge-lines.-webkit-scrollbar-track-piece {
+ background-color: #FAFAFA;
+ -webkit-border-radius: 0;
+ -webkit-border-bottom-right-radius: 6px;
+ -webkit-border-bottom-left-radius: 6px;
+}
+div.bridge-lines.-webkit-scrollbar-thumb.vertical {
+ height: 50px;
+ background-color: #999;
+ -webkit-border-radius: 6px;
+}
+div.bridge-lines.-webkit-scrollbar-thumb.horizontal{
+ width: 50px;
+ background-color: #999;
+ -webkit-border-radius: 6px;
+}
+#container-bridges {
+ width: auto;
+ align: center;
+ margin: auto;
+ position: relative;
+ left: 0%;
+}
+#bridgesrow2 {
+ text-align: right;
+ padding-right: 7%;
+}
+#bridgesrow2 .btn {
+ margin-bottom: 1%;
+}
+.hidden {
+ display: none;
+}
+.visible {
+ display: block;
+}
+#qrcode .modal-dialog,
+#qrcode .modal-sm {
+ width: 400px;
+}
+#qrcode img {
+ width: 350px;
+ height: 350px;
+}
+#qrcode-para {
+ text-align: center;
+}
+#howto {
+ align-content: left;
+}
+
+#uh-oh-spaghettios {
+ width: 80%;
+ margin: auto;
+}
+.uh-oh-spaghettios~p {
+ text-align: center;
+ font-size: 115%;
+}
+
+@media (min-width: 640px) and (max-width: 980px) {
+ .footer-small p,
+ .footer-small a,
+ .footer-small i {
+ font-size: 80%;
+ }
+}
+@media (min-width: 1px) and (max-width: 768px), handheld {
+ .navbar-nav {
+ display: none;
+ }
+}
+@media (min-width: 1px) and (max-width: 640px), handheld {
+ body {
+ font-size: 14px;
+ }
+ .background-1,
+ .background-2 {
+ background: none;
+ }
+ .main-steps {
+ margin: 25px;
+ }
+ .step {
+ padding: 10px 0px 0px 0px;
+ }
+ .step-title,
+ .step-text {
+ font-size: 16px;
+ }
+ .step-text {
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+ .footer-small p {
+ font-size: 75%;
+ text-align: center;
+ }
+ .footer-small a,
+ .footer-small i {
+ font-size: 125%;
+ }
+ #footer-bugs,
+ #footer-code,
+ #footer-changelog,
+ #footer-contact,
+ #footer-keys {
+ font-size: 0px;
+ }
+ #just-give-me-bridges-btn,
+ #get-bridges-btn,
+ .control-label {
+ font-size: 14px;
+ }
+}
+@media (min-width: 1px) and (max-width: 480px), handheld {
+}
diff --git a/bridgedb/https/templates/assets/css/rtl.css b/bridgedb/https/templates/assets/css/rtl.css
new file mode 100644
index 0000000..3e51aa5
--- /dev/null
+++ b/bridgedb/https/templates/assets/css/rtl.css
@@ -0,0 +1,7 @@
+span,p,h3,h4 {
+ text-align: right;
+ direction: rtl;
+}
+span {
+ float: right;
+}
diff --git a/bridgedb/https/templates/assets/js/bridges.js b/bridgedb/https/templates/assets/js/bridges.js
new file mode 100644
index 0000000..6d37ce7
--- /dev/null
+++ b/bridgedb/https/templates/assets/js/bridges.js
@@ -0,0 +1,83 @@
+// Takes one argument, `element`, which should be a string specifying the id
+// of the element whose text should be selected.
+function selectText(element) {
+ try {
+ var range;
+ var selection;
+ text = document.getElementById(element);
+
+ if (document.body.createTextRange) {
+ range = document.body.createTextRange();
+ range.moveToElementText(text);
+ range.select();
+ } else if (window.getSelection) {
+ selection = window.getSelection();
+ range = document.createRange();
+ range.selectNodeContents(text);
+ selection.removeAllRanges();
+ selection.addRange(range);
+ }
+ } catch (e) {
+ console.log(e);
+ }
+}
+
+function displayOrHide(element) {
+ try {
+ e = document.getElementById(element);
+ if (e.classList.contains('hidden')) {
+ // Don't use classList.toggle() because vendors seem to handle the
+ // secondary, optional "force" parameter in different ways.
+ document.getElementById(element).classList.remove('hidden');
+ document.getElementById(element).classList.add('visible');
+ document.getElementById(element).setAttribute('aria-hidden', 'false');
+ } else if (e.classList.contains('visible')) {
+ document.getElementById(element).classList.remove('visible');
+ document.getElementById(element).classList.add('hidden');
+ document.getElementById(element).setAttribute('aria-hidden', 'true');
+ }
+ } catch (err) {
+ console.log(err);
+ }
+}
+
+window.onload = function() {
+ var selectBtn = document.getElementById('selectbtn');
+ if (selectBtn) {
+ document.getElementById('selectbtn').addEventListener('click',
+ function() {
+ selectText('bridgelines');
+ }, false);
+ // Make the 'Select All' button clickable:
+ selectBtn.classList.remove('disabled');
+ selectBtn.setAttribute('aria-disabled', 'false');
+ }
+
+ var bridgesContainer = document.getElementById('container-bridges');
+ if (bridgesContainer) {
+ document.getElementById('bridgelines').classList.add('cursor-copy');
+ document.getElementById('bridgelines').addEventListener('click',
+ function() {
+ selectText('bridgelines');
+ }, false);
+ }
+
+ var qrcodeBtn = document.getElementById('qrcodebtn');
+ if (qrcodeBtn) {
+ document.getElementById('qrcodebtn').addEventListener('click',
+ function() {
+ displayOrHide('qrcode');
+ }, false);
+ // Remove the href attribute that opens the QRCode image as a data: URL if
+ // JS is disabled:
+ document.getElementById('qrcodebtn').removeAttribute('href');
+ }
+
+ var qrModalBtn = document.getElementById('qrcode-modal-btn');
+ if (qrModalBtn) {
+ document.getElementById('qrcode-modal-btn').addEventListener('click',
+ function() {
+ displayOrHide('qrcode');
+ }, false);
+ }
+};
diff --git a/bridgedb/https/templates/base.html b/bridgedb/https/templates/base.html
index 4a0b92d..8097c60 100644
--- a/bridgedb/https/templates/base.html
+++ b/bridgedb/https/templates/base.html
@@ -5,104 +5,96 @@
<!DOCTYPE html>
<html lang="${lang}">
-<head>
-<meta charset="utf-8">
-<title>BridgeDB</title>
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<meta name="description" content="Bridge IP database">
-<meta name="author" content="The Tor Project">
+ <head>
+ <meta charset="utf-8">
+ <title>BridgeDB</title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="Tor Bridges">
+ <meta name="author" content="The Tor Project">
-<!-- Le styles -->
-<link rel="stylesheet" href="/assets/css/main.css">
-<!--[if IE 7]>
- <link rel="stylesheet" href="/assets/css/font-awesome-ie7.min.css">
-<![endif]-->
+ <link rel="stylesheet" href="/assets/css/bootstrap.min.css">
+ <link rel="stylesheet" href="/assets/css/font-awesome.min.css">
+ <link rel="stylesheet" href="/assets/css/main.css">
+ <!--[if IE 7]>
+ <link rel="stylesheet" href="/assets/css/font-awesome-ie7.min.css">
+ <![endif]-->
+ % if rtl:
+ <link rel="stylesheet" href="/assets/css/rtl.css">
+ % endif
-% if rtl:
-<style>
-span,p,h3,h4 {
- text-align: right;
- direction: rtl;
-}
-span {
- float: right;
-}
-</style>
-% endif
+ <script type="text/javascript" src="/assets/js/bridges.js"></script>
+ </head>
-</head>
-<body style="background: url(/assets/tor-roots-blue.svg);
- background-repeat: no-repeat;
- background-attachment: scroll;
- background-position: 2% 100px;
- background-size: 23%;">
- <div class="container-narrow">
- <div class="masthead">
- <div class="nav nav-tabs">
- <div class="nav navbar-header">
- <a class="navbar-brand" href="../">BridgeDB</a>
- </div>
- <ul class="nav navbar-nav pull-right">
- <li>
- <a href="https://www.torproject.org">The Tor Project</a>
- </li>
- </ul>
- </div>
- </div>
+<body>
+ <div class="background-1">
+ <div class="background-2">
+ <div class="container-narrow">
+ <div class="masthead">
+ <div class="nav nav-tabs">
+ <div class="nav navbar-header">
+ <a class="navbar-brand" href="../">BridgeDB</a>
+ </div>
+ <ul class="nav navbar-nav pull-right">
+ <li>
+ <a href="https://www.torproject.org">The Tor Project</a>
+ </li>
+ </ul>
+ </div>
+ </div>
${next.body(strings, rtl=rtl, lang=lang, **kwargs)}
+ <div class="faq">
+ <div class="row-fluid marketing">
-<div class="faq">
- <div class="row-fluid marketing">
-
- <h4>${_(strings.FAQ[0])}</h4>
- <p>
- ${_(strings.FAQ[1]) % \
- ("""<a href="https://www.torproject.org/docs/bridges">""", "</a>")}
- </p>
+ <h4>${_(strings.FAQ[0])}</h4>
+ <p>
+ ${_(strings.FAQ[1]) % \
+ ("""<a href="https://www.torproject.org/docs/bridges">""", "</a>")}
+ </p>
- <h4>${_(strings.OTHER_DISTRIBUTORS[0])}</h4>
- <p>
- ${_(strings.OTHER_DISTRIBUTORS[1]) % \
- ("""<a href="mailto:bridges@torproject.org">bridges(a)torproject.org</a>""",
- """<a href="https://riseup.net/">Riseup</a>""",
- """<a href="https://mail.google.com/">Gmail</a>""",
- """<a href="https://mail.yahoo.com/">Yahoo</a>""")}
- </p>
+ <h4>${_(strings.OTHER_DISTRIBUTORS[0])}</h4>
+ <p>
+ ${_(strings.OTHER_DISTRIBUTORS[1]) % \
+ ("""<a href="mailto:bridges@torproject.org">bridges(a)torproject.org</a>""",
+ """<a href="https://riseup.net/">Riseup</a>""",
+ """<a href="https://mail.google.com/">Gmail</a>""",
+ """<a href="https://mail.yahoo.com/">Yahoo</a>""")}
+ </p>
- <h4>${_(strings.HELP[0])}</h4>
- <p>
- ${_(strings.HELP[1]) % \
- ("""<a href="mailto:help@rt.torproject.org">help(a)rt.torproject.org</a>""")}
- ${_(strings.HELP[2])}
- </p>
+ <h4>${_(strings.HELP[0])}</h4>
+ <p>
+ ${_(strings.HELP[1]) % \
+ ("""<a href="mailto:help@rt.torproject.org">help(a)rt.torproject.org</a>""")}
+ ${_(strings.HELP[2])}
+ </p>
+ </div>
+ </div> <!-- end faq -->
- </div>
-</div>
-<hr>
-
-<div class="footer">
+ <div class="footer footer-small">
+ <hr>
<p>
<a href="https://trac.torproject.org/projects/tor/newticket?component=BridgeDB&keywo…">
- <i class="icon icon-large icon-bug"> ${_("Report a Bug")}</i></a>
+ <i class="icon icon-large icon-bug"><span id="footer-bugs"> ${_("Report a Bug")}</span></i></a>
·
<a href="https://gitweb.torproject.org/bridgedb.git">
- <i class="icon icon-large icon-code"> ${_("Source Code")}</i></a>
+ <i class="icon icon-large icon-code"><span id="footer-code"> ${_("Source Code")}</span></i></a>
·
<a href="https://gitweb.torproject.org/bridgedb.git/tree/CHANGELOG">
- <i class="icon icon-large icon-rocket"> ${_("Changelog")}</i></a>
+ <i class="icon icon-large icon-rocket"><span id="footer-changelog"> ${_("Changelog")}</span></i></a>
·
<a href="mailto:help@rt.torproject.org">
- <i class="icon icon-large icon-envelope"> ${_("Contact")}</i></a>
+ <i class="icon icon-large icon-envelope"><span id="footer-contact"> ${_("Contact")}</span></i></a>
·
- <a href="../keys"><i class="icon icon-large icon-key"> ${_("Public Keys")}</i></a>
+ <a href="../keys"><i class="icon icon-large icon-key"><span id="footer-keys"> ${_("Public Keys")}</span></i></a>
</p>
<br />
<p>© The Tor Project</p>
-</div>
-</div> <!-- /container -->
+ </div> <!-- end footer -->
+ </div> <!-- /container -->
+ </div>
+ </div>
</body>
</html>
diff --git a/bridgedb/https/templates/bridges.html b/bridgedb/https/templates/bridges.html
index b5ac544..076f930 100644
--- a/bridgedb/https/templates/bridges.html
+++ b/bridgedb/https/templates/bridges.html
@@ -3,66 +3,19 @@
<%inherit file="base.html"/>
<%page args="strings, rtl=False, lang='en', answer=0, qrcode=0, **kwargs"/>
- </div>
</div>
-<script type="text/javascript">
- // Takes one argument, `element`, which should be a string specifying the id
- // of the element whose text should be selected.
- function selectText(element) {
- try {
- var doc = document;
- text = doc.getElementById(element);
- var range;
- var selection;
-
- if (doc.body.createTextRange) {
- range = document.body.createTextRange();
- range.moveToElementText(text);
- range.select();
- } else if (window.getSelection) {
- selection = window.getSelection();
- range = document.createRange();
- range.selectNodeContents(text);
- selection.removeAllRanges();
- selection.addRange(range);
- }
- } catch (e) {
- window.alert(e);
- }
- }
-
- function displayOrHide(element) {
- try {
- e = document.getElementById(element);
-
- if (e.style.display === 'none') {
- document.getElementById(element).style.display = 'block';
- } else if (e.style.display === 'block') {
- document.getElementById(element).style.display = 'none';
- }
- } catch (e) {
- window.alert(e);
- }
- }
-</script>
-
<div class="container-narrow">
<div class="container-fluid">
% if answer:
- <div class="container-fluid"
- style="width: 98%; align: center; margin: auto;">
- <div class="container-fluid"
- style="padding: 2%">
+ <div class="container-fluid container-fluid-outer-98">
+ <div class="container-fluid container-fluid-inner-2">
<h2>${_(strings.BRIDGES[0])}</h2>
</div>
</div>
- <div class="container-fluid"
- style="width: auto; align: center; margin: auto;
- position: relative; left: 0%;"
- onclick="selectText('bridgelines')">
+ <div class="container-fluid" id="container-bridges">
<div class="row" id="bridgesrow1">
<div class="col col-lg-12">
<div class="bridge-lines" id="bridgelines">
@@ -75,39 +28,35 @@ ${bridgeline | h,trim}<br />
</div>
</div>
- <div class="container-fluid"
- style="width: 100%; align: center; margin: auto;">
- <div class="row" id="bridgesrow2" style="text-align: right; padding-right: 7%;">
+ <div class="container-fluid container-fluid-outer">
+ <div class="row" id="bridgesrow2">
<button class="btn btn-primary disabled" id="selectbtn"
- onclick="selectText('bridgelines')"
- title="Select all bridge lines">
+ title="Select all bridge lines" aria-disabled="true">
<i class="icon icon-2x icon-paste"></i> ${_("""Select All""")}
</button>
% if qrcode:
<a class="btn btn-primary" type="button" id="qrcodebtn"
- href="${qrcode}" title="Show QRCode for bridge lines"
- onclick="displayOrHide('qrcode')">
+ href="${qrcode}" title="Show QRCode for bridge lines">
<i class="icon icon-2x icon-qrcode"></i> ${_("""Show QRCode""")}
</a>
% endif
</div>
- <div class="modal" id="qrcode" style="display: none;">
- <div class="modal-dialog modal-sm" style="width: 400px;">
+ <div class="modal hidden" id="qrcode" aria-hidden="true">
+ <div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
- <button type="button" class="close" aria-hidden="true"
- onclick="displayOrHide('qrcode')">
+ <button type="button" class="close" id="qrcode-modal-btn">
×
</button>
<h4 class="modal-title">${_("""QRCode for your bridge lines""")}</h4>
</div>
<div class="modal-body">
% if qrcode:
- <p style="text-align: center;">
- <img width="350" height="350"
- title="QRCode for your bridge lines from BridgeDB"
- src="${qrcode}" />
+ <p id="qrcode-para">
+ <img title="QRCode for your bridge lines from BridgeDB"
+ src="${qrcode}"
+ alt="" />
</p>
% else:
<p class="text-danger">
@@ -131,17 +80,15 @@ ${_("""This QRCode contains your bridge lines. Scan it with a QRCode """ \
</div>
<br />
- <br />
-<div class="container-fluid"
- style="width: 100%; align: center; margin: auto;">
+<div class="container-fluid container-fluid-outer-96">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">${_(strings.HOWTO_TBB[0])}</h3>
</div>
<br />
- <div class="container-fluid" id="howto" style="align-content: left;">
+ <div class="container-fluid" id="howto">
<p>
${_(strings.HOWTO_TBB[1]) % \
("""<a href="https://www.torproject.org/projects/torbrowser.html"
@@ -165,9 +112,9 @@ ${_("""This QRCode contains your bridge lines. Scan it with a QRCode """ \
</div>
% else:
-<div class="bs-component" style="width: 80%; margin: auto;">
+<div class="bs-component" id="uh-oh-spaghettios">
<div class="alert alert-dismissable alert-danger">
- <p style="text-align: center; font-size: 115%;">
+ <p>
<br />
<strong>
<em class="primary">
@@ -180,7 +127,7 @@ ${_("""Uh oh, spaghettios!""")}
</strong>
<br />
</p>
- <p style="text-align: center;">
+ <p>
${_("""There currently aren't any bridges available...""")}
${_(""" Perhaps you should try %s going back %s and choosing a""" \
""" different bridge type!""") % \
@@ -190,14 +137,3 @@ ${_("""Uh oh, spaghettios!""")}
</div>
<br />
% endif
-
-<script type="text/javascript">
- // Make the 'Select All' button clickable:
- document.getElementById('selectbtn').className = "btn btn-primary";
-
- // Remove the href attribute which opens the QRCode image as a data URL if
- // JS is disabled:
- document.getElementById('qrcodebtn').removeAttribute('href');
-</script>
-
-<hr />
diff --git a/bridgedb/https/templates/captcha.html b/bridgedb/https/templates/captcha.html
index ab605e9..33c1d45 100644
--- a/bridgedb/https/templates/captcha.html
+++ b/bridgedb/https/templates/captcha.html
@@ -3,61 +3,47 @@
<%inherit file="base.html"/>
<%page args="strings, rtl=False, lang='en', imgstr=0, captcha_challenge=0, **kwargs"/>
-<div class="container-narrow"
- id="captchaSubmissionContainer"
- style="width: 90%; align: center; margin: auto;">
- <div class="container-fluid"
- style="width: 100%; align: center; padding: 5%">
- <div class="box" style="padding: 5% 15% 5% 15%;">
- <p style="align: center;">
- <img width="400" height="125"
- alt="${_(strings.CAPTCHA[0])}"
- src="${imgstr}" />
- </p>
+<div class="container-narrow" id="captcha-submission-container">
+ <div class="container-fluid container-fluid-inner-5">
+ <div class="box" id="captcha-box">
+ <img alt="${_(strings.CAPTCHA[0])}" src="${imgstr}" />
- <div class="box"
- style="align: center; width: 50% margin: auto;">
- <div class="container-fluid"
- style="width: 98%; align: center; padding: 1%;">
- <form class="bs-component"
- id="captchaSubmission"
- action=""
- method="POST">
- <fieldset>
- <div class="form-group">
- <!--style="width: 100%; align: center;">-->
- <div class="input-group" style="height: 60%;">
- <input type="hidden"
- form="captchaSubmission"
- name="captcha_challenge_field"
- id="captcha_challenge_field"
- value="${challenge_field}"></input>
- <input class="form-control"
- form="captchaSubmission"
- name="captcha_response_field"
- id="captcha_response_field"
- value=""
- autocomplete="off"
- type="text"
- placeholder="${_(strings.CAPTCHA[1])}"
- accesskey="t" autofocus ></input>
- <span class="input-group-btn">
- <button class="btn btn-primary"
- form="captchaSubmission"
- type="submit"
- name="submit"
- value="submit"
- accesskey="s">
- <i class="icon-level-down icon-rotate-90"></i>
- </button>
- </span>
- </div>
+ <form class="bs-component"
+ id="captchaSubmission"
+ action=""
+ method="POST">
+ <fieldset>
+ <div class="form-group">
+ <div class="input-group" id="captcha-submission-group">
+ <input type="hidden"
+ form="captchaSubmission"
+ name="captcha_challenge_field"
+ id="captcha_challenge_field"
+ value="${challenge_field}"></input>
+ <input class="form-control"
+ form="captchaSubmission"
+ name="captcha_response_field"
+ id="captcha_response_field"
+ value=""
+ autocomplete="off"
+ type="text"
+ placeholder="${_(strings.CAPTCHA[1])}"
+ accesskey="t" autofocus ></input>
+ <span class="input-group-btn">
+ <button class="btn btn-primary"
+ form="captchaSubmission"
+ type="submit"
+ name="submit"
+ id="captcha-submit-button"
+ value="submit"
+ accesskey="s">
+ <i class="icon-level-down icon-rotate-90"></i>
+ </button>
+ </span>
</div>
- </fieldset>
- </form>
- </div>
- </div>
+ </div>
+ </fieldset>
+ </form>
</div>
</div>
</div>
-<hr />
diff --git a/bridgedb/https/templates/howto.html b/bridgedb/https/templates/howto.html
index b10f1b2..24e4980 100644
--- a/bridgedb/https/templates/howto.html
+++ b/bridgedb/https/templates/howto.html
@@ -3,18 +3,16 @@
<%inherit file="base.html"/>
<%page args="strings, rtl=False, lang='en', **kwargs"/>
-<div class="container-fluid"
- style="width: 98%; align: center; margin: auto;">
-<div class="container-fluid"
- style="width: 95%; align: center;
- padding-top: 10%; padding-left: 5%; padding-right: 5%;">
+<br />
+
+<div class="container-fluid container-fluid-outer-96">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">${_(strings.HOWTO_TBB[0])}</h3>
</div>
<br />
- <div class="container-fluid" id="howto" style="align-content: left;">
+ <div class="container-fluid" id="howto">
<p>
${_(strings.HOWTO_TBB[1]) % \
("""<a href="https://www.torproject.org/projects/torbrowser.html"
@@ -36,4 +34,3 @@
</div>
</div>
</div>
-</div>
diff --git a/bridgedb/https/templates/index.html b/bridgedb/https/templates/index.html
index 469b27a..269b2ae 100644
--- a/bridgedb/https/templates/index.html
+++ b/bridgedb/https/templates/index.html
@@ -4,12 +4,12 @@
<%page args="strings, rtl=False, lang='en', **kwargs"/>
<div class="main-steps">
-<div class="step row">
+<div class="step row" id="step-1">
<div class="bdb_span7 step-text">
<span class="lead">
<span class="step-title">
${_("Step %s1%s") % ("""<u>""", """</u>""")}</span>
- <span style="margin-left: 20px; margin-right: 20px;">
+ <span class="step-text">
${_("Download %s Tor Browser %s") % \
("""<a href="https://www.torproject.org/projects/torbrowser.html"
target="_blank" accesskey="1">""",
@@ -18,23 +18,23 @@
</div>
</div>
-<div class="step row">
+<div class="step row" id="step-2">
<div class="bdb_span7 step-text">
<span class="lead">
<span class="step-title">
${_("Step %s2%s") % ("""<u>""", """</u>""")}</span>
- <span style="margin-left: 20px; margin-right: 20px;">
+ <span class="step-text">
${_("Get %s bridges %s") % ("""<a href="/options" accesskey="2">""", "</a>")}</span>
</span>
</div>
</div>
-<div class="step row">
+<div class="step row" id="step-3">
<div class="bdb_span7 step-text">
<span class="lead">
<span class="step-title">
${_("Step %s3%s") % ("""<u>""", """</u>""")}</span>
- <span style="margin-left: 20px; margin-right: 20px;">
+ <span class="step-text">
${_("""Now %s add the bridges to Tor Browser %s""") % \
("""<a href="/howto" accesskey="3">""",
"""</a>""")}</span>
diff --git a/bridgedb/https/templates/options.html b/bridgedb/https/templates/options.html
index 9486199..040d523 100644
--- a/bridgedb/https/templates/options.html
+++ b/bridgedb/https/templates/options.html
@@ -3,50 +3,49 @@
<%inherit file="base.html"/>
<%page args="strings, rtl=False, lang='en', **kwargs"/>
-<div class="container-fluid"
- style="width: 96%; align: center; margin: 2%">
- <div class="container-fluid" style="padding: 2%">
- <p>
- <h2>${_(strings.BRIDGES[1])}</h2>
- </p>
- </div>
- <div class="container-fluid"
- style="width: 100%; align: center; padding: 2%;">
- <p>
- ${_(strings.WELCOME[0]) % \
- ("""<a href="https://www.torproject.org/docs/pluggable-transports.html">""",
- """</a>""")}
- </p>
- <p>
- ${_(strings.WELCOME[1])}
- </p>
+<div class="container-fluid container-fluid-outer-96">
+ <!--<div class="container-fluid step-semi-transparent">-->
+ <div class="container-fluid container-fluid-inner">
+ <p>
+ <h3>${_(strings.BRIDGES[1])}</h3>
+ </p>
+ <!--</div>-->
+ <!--<div class="container-fluid container-fluid-outer-100 container-fluid-inner">-->
+ <p>
+ ${_(strings.WELCOME[0]) % \
+ ("""<a href="https://www.torproject.org/docs/pluggable-transports.html">""",
+ """</a>""")}
+ </p>
+ <p>
+ ${_(strings.WELCOME[1])}
+ </p>
## The '—' char is a literal emdash ('―'), but it's also XML parseable.
- <p>
- ${_(strings.WELCOME[2]) % ("—", "—")}
- </p>
- <div class="container-fluid" style="align: center: margin: 2%;">
- <div style="align: center; padding: 5%;">
- <p class="bs-component">
- <a href="./bridges">
- <button class="btn btn-success btn-lg btn-block"
- type="button"
- accesskey="j">
+ <p>
+ ${_(strings.WELCOME[2]) % ("—", "—")}
+ </p>
+ <div class="container-fluid container-fluid-outer">
+ <div class="container-fluid-inner-5">
+ <p class="bs-component">
+ <a href="./bridges">
+ <button class="btn btn-success btn-lg btn-block"
+ id="just-give-me-bridges-btn"
+ type="button"
+ accesskey="j">
## TRANSLATORS: Please make sure the '%s' surrounding single letters at the
## beginning of words are present in your final translation. Thanks!
## (These are used to insert HTML5 underlining tags, to mark accesskeys
## for disabled users.)
- ${_("""%sJ%sust give me bridges!""") % ("""<u>""", """</u>""")}
- </button>
- </a>
- </p>
+ ${_("""%sJ%sust give me bridges!""") % ("""<u>""", """</u>""")}
+ </button>
+ </a>
+ </p>
+ </div>
</div>
</div>
- </div>
-</div>
+ <!--</div>-->
<!-- BEGIN "Advanced Options" panel for bridge type -->
-<div class="container-fluid"
- style="width: 96%; align: center; margin-left: 2%; margin-right: 2%;">
+<div class="container-fluid container-fluid-outer-96-lr">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">${_("""Advanced Options""")}</h3>
@@ -55,8 +54,8 @@
<!-- BEGIN bridge options selection form -->
<form class="form-horizontal" id="advancedOptions" action="bridges" method="GET">
<fieldset>
- <div class="container-fluid" id="instructions" style="align-content: left;">
- <legend style="font-size: 112%">
+ <div class="container-fluid" id="instructions">
+ <legend id="advanced-options-legend">
<br />
<p>${_(strings.OPTIONS[0])}</p>
</legend>
@@ -64,20 +63,19 @@
<div class="container-fluid">
<!-- BEGIN first options row -->
- <div class="row" style="width: 98%; height: inherit; margin: auto;">
+ <div class="row" id="options-row-1">
<!-- BEGIN left column, first row -->
- <div class="container-fluid col-lg-2"
- style="float: left; width: 50%; height: inherit;">
- <div class="step" style="height: inherit;">
+ <div class="container-fluid col-lg-2" id="options-row-1-col-1">
+ <div class="step" id="options-row-1-col-1-step">
<div class="form-group">
<label class="control-label"
- for="transport"
- style="text-align: inherit;">
+ id="options-transport-label"
+ for="transport">
${_(strings.OPTIONS[2]) % ("Pluggable <u>T</u>ransport")}
</label>
<div class="container-fluid col-lg-4">
- <div class="btn-group" style="float: left; padding: 2%;">
+ <div class="btn-group" id="options-transport-btn-group">
<select class="btn btn-primary btn-sm dropdown"
form="advancedOptions"
id="transport"
@@ -103,21 +101,17 @@
</div> <!-- END left column, first row -->
<!-- BEGIN right column, first row -->
- <div class="container-fluid col-lg-2"
- style="float: right; width: 50%; height: inherit;">
- <div class="step"
- style="height: inherit; margin-right: 1%;">
+ <div class="container-fluid col-lg-2" id="options-row-1-col-2">
+ <div class="step" id="options-row-1-col-2-step">
<div class="form-group">
<label class="control-label"
- for="ipv6"
- style="text-align: inherit;">
+ id="options-ipv6-label"
+ for="ipv6">
${_(strings.OPTIONS[1])}
</label>
<div class="container-fluid col-lg-4">
- <div class="checkbox"
- style="float: left;">
- <div class="input-group"
- style="float: left; padding: 2%;">
+ <div class="checkbox" id="options-ipv6-checkbox">
+ <div class="input-group" id="options-ipv6-input-group">
<input name="ipv6"
id="ipv6"
form="advancedOptions"
@@ -140,25 +134,21 @@
</fieldset>
<!-- BEGIN second options row -->
- <div class="row"
- style="width: 98%; height: inherit;
- margin-left: auto; margin-right: auto; padding: 2%;">
- <div class="container-fluid col-lg-2"
- style="width: 50%; text-align: center;">
- <p>
- <button class="btn btn-primary btn-lg btn-block"
- accesskey="g">
+ <!--<div class="row" id="options-row-2">
+ <div class="container-fluid col-lg-2" id="options-row-2-col-1">-->
+ <div class="container-fluid container-fluid-outer-60-lr">
+ <div class="container-fluid container-fluid-inner-5">
+ <button class="btn btn-primary btn-lg btn-block"
+ id="get-bridges-btn"
+ accesskey="g">
## TRANSLATORS: Please make sure the '%s' surrounding single letters at the
## beginning of words are present in your final translation. Thanks!
## TRANSLATORS: Please do NOT translate the word "bridge"!
- ${_("""%sG%set Bridges""") % ("<u>", "</u>")}
- </button>
- </p>
+ ${_("""%sG%set Bridges""") % ("<u>", "</u>")}
+ </button>
</div>
</div>
</form> <!-- END bridge options selection form -->
</div> <!-- END advanced options panel (a.k.a. the lined boxy thing --
-- surrounding the options) -->
</div>
-<br />
-<hr>
diff --git a/scripts/setup-tests b/scripts/setup-tests
index e82576f..ec915d8 100755
--- a/scripts/setup-tests
+++ b/scripts/setup-tests
@@ -23,6 +23,7 @@ sed -r -i -e "s/(EMAIL_SMTP_PORT = )([1-9]{2,5})/\12525/" run/bridgedb.conf
# won't recognize our self-signed certificate:
sed -r -i -e "s/(HTTP_UNENCRYPTED_BIND_IP = )(None)/\1'127.0.0.1'/" run/bridgedb.conf
sed -r -i -e "s/(HTTP_UNENCRYPTED_PORT = )(None)/\16788/" run/bridgedb.conf
+sed -r -i -e "s/(SERVER_PUBLIC_FQDN = )(.*)/\1'127.0.0.1:6788'/" run/bridgedb.conf
leekspin -n 100
cp -t run networkstatus-bridges cached-extrainfo* bridge-descriptors
./scripts/make-ssl-cert
diff --git a/setup.py b/setup.py
index dee9534..0402391 100644
--- a/setup.py
+++ b/setup.py
@@ -173,7 +173,8 @@ def get_template_files():
'assets/font/*.woff',
'assets/font/*.ttf',
'assets/font/*.svg',
- 'assets/font/*.eot']
+ 'assets/font/*.eot',
+ 'assets/js/*.js']
template_files = []
for include_pattern in include_patterns:
diff --git a/test/https_helpers.py b/test/https_helpers.py
index 3fb4887..cc1ddfa 100644
--- a/test/https_helpers.py
+++ b/test/https_helpers.py
@@ -42,6 +42,9 @@ GIMP_CAPTCHA_ENABLED = True
GIMP_CAPTCHA_DIR = 'captchas'
GIMP_CAPTCHA_HMAC_KEYFILE = 'captcha_hmac_key'
GIMP_CAPTCHA_RSA_KEYFILE = 'captcha_rsa_key'
+CSP_ENABLED = True
+CSP_REPORT_ONLY = True
+CSP_INCLUDE_SELF = True
TEST_CONFIG_FILE = io.StringIO(unicode("""\
SERVER_PUBLIC_FQDN = %r
@@ -66,6 +69,9 @@ GIMP_CAPTCHA_ENABLED = %r
GIMP_CAPTCHA_DIR = %r
GIMP_CAPTCHA_HMAC_KEYFILE = %r
GIMP_CAPTCHA_RSA_KEYFILE = %r
+CSP_ENABLED = %r
+CSP_REPORT_ONLY = %r
+CSP_INCLUDE_SELF = %r
""" % (SERVER_PUBLIC_FQDN,
SERVER_PUBLIC_EXTERNAL_IP,
HTTPS_DIST,
@@ -87,7 +93,10 @@ GIMP_CAPTCHA_RSA_KEYFILE = %r
GIMP_CAPTCHA_ENABLED,
GIMP_CAPTCHA_DIR,
GIMP_CAPTCHA_HMAC_KEYFILE,
- GIMP_CAPTCHA_RSA_KEYFILE)))
+ GIMP_CAPTCHA_RSA_KEYFILE,
+ CSP_ENABLED,
+ CSP_REPORT_ONLY,
+ CSP_INCLUDE_SELF)))
def _createConfig(configFile=TEST_CONFIG_FILE):
@@ -119,6 +128,27 @@ class DummyRequest(requesthelper.DummyRequest):
def __init__(self, *args, **kwargs):
requesthelper.DummyRequest.__init__(self, *args, **kwargs)
self.redirect = self._redirect(self)
+ self.content = io.StringIO()
+
+ def writeContent(self, data):
+ """Add some **data** to the faked body of this request.
+
+ This is useful when testing how servers handle content from POST
+ requests.
+
+ .. warn: Calling this method multiple times will overwrite any data
+ previously written.
+
+ :param str data: Some data to put in the "body" (i.e. the
+ :attr:`content`) of this request.
+ """
+ try:
+ self.content.write(type(u'')(data))
+ except UnicodeDecodeError:
+ self.content.write(type(u'')(data, 'utf-8'))
+ finally:
+ self.content.flush()
+ self.content.seek(0)
def URLPath(self):
"""Fake the missing Request.URLPath too."""
diff --git a/test/test_https.py b/test/test_https.py
index 8a5754f..2a12eee 100644
--- a/test/test_https.py
+++ b/test/test_https.py
@@ -150,6 +150,28 @@ class HTTPTests(unittest.TestCase):
% (fieldsPerBridge, bridge))
return bridges
+ def test_content_security_policy(self):
+ """Check that the HTTP Content-Security-Policy header is set."""
+ if os.environ.get("CI"):
+ if not self.pid or not processExists(self.pid):
+ raise FailTest("Could not start BridgeDB process on CI server!")
+ else:
+ raise SkipTest(("The mechanize tests cannot handle self-signed "
+ "TLS certificates, and thus require opening "
+ "another port for running a plaintext HTTP-only "
+ "BridgeDB webserver. Because of this, these tests "
+ "are only run on CI servers."))
+
+ self.br = mechanize.Browser()
+ self.br.set_handle_robots(False)
+ self.br.set_debug_http(True)
+ self.br.open(HTTP_ROOT)
+
+ headers = ''.join(self.br.response().info().headers)
+
+ self.assertIn("Content-Security-Policy", headers)
+ self.assertIn("default-src 'none';", headers)
+
def test_get_obfs2_ipv4(self):
if os.environ.get("CI"):
if not self.pid or not processExists(self.pid):
diff --git a/test/test_https_server.py b/test/test_https_server.py
index 708f7e3..020b050 100644
--- a/test/test_https_server.py
+++ b/test/test_https_server.py
@@ -43,6 +43,34 @@ logging.disable(50)
#server.logging.getLogger().setLevel(10)
+class SetFQDNTests(unittest.TestCase):
+ """Tests for :func:`bridgedb.https.server.setFQDN` and
+ :func:`bridgedb.https.server.setFQDN`.
+ """
+
+ def setUp(self):
+ self.originalFQDN = server.SERVER_PUBLIC_FQDN
+
+ def tearDown(self):
+ server.SERVER_PUBLIC_FQDN = self.originalFQDN
+
+ def test_setFQDN_https(self):
+ """Calling ``server.setFQDN([…], https=True)`` should prepend
+ ``"https://"`` to the module :data:`server.SERVER_PUBLIC_FQDN`
+ variable.
+ """
+ server.setFQDN('example.com', https=True)
+ self.assertEqual(server.SERVER_PUBLIC_FQDN, "https://example.com")
+
+ def test_setFQDN_http(self):
+ """Calling ``server.setFQDN([…], https=False)`` should not prepend
+ anything at all to the module :data:`server.SERVER_PUBLIC_FQDN`
+ variable.
+ """
+ server.setFQDN('example.com', https=False)
+ self.assertEqual(server.SERVER_PUBLIC_FQDN, "example.com")
+
+
class GetClientIPTests(unittest.TestCase):
"""Tests for :func:`bridgedb.https.server.getClientIP`."""
@@ -96,6 +124,78 @@ class ReplaceErrorPageTests(unittest.TestCase):
self.assertNotSubstring("vegan gümmibären", errorPage)
+class CSPResourceTests(unittest.TestCase):
+ """Tests for :class:`bridgedb.HTTPServer.CSPResource`."""
+
+ def setUp(self):
+ self.pagename = b'foo.html'
+ self.request = DummyRequest([self.pagename])
+ self.request.method = b'GET'
+
+ server.setFQDN('bridges.torproject.org')
+
+ def test_CSPResource_setCSPHeader(self):
+ """Setting the CSP header on a request should work out just peachy,
+ like no errors or other bad stuff happening.
+ """
+ resource = server.CSPResource()
+ resource.setCSPHeader(self.request)
+
+ def test_render_POST_ascii(self):
+ """Calling ``CSPResource.render_POST()`` should log whatever stuff was
+ sent in the body of the POST request.
+ """
+ self.request.method = b'POST'
+ self.request.writeContent('lah dee dah')
+ self.request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443)
+
+ resource = server.CSPResource()
+ page = resource.render_POST(self.request)
+
+ self.assertIn('<html>', str(page))
+
+ def test_render_POST_no_client_IP(self):
+ """Calling ``CSPResource.render_POST()`` should log whatever stuff was
+ sent in the body of the POST request, regardless of whether we were
+ able to determine the client's IP address.
+ """
+ self.request.method = b'POST'
+ self.request.writeContent('lah dee dah')
+
+ resource = server.CSPResource()
+ page = resource.render_POST(self.request)
+
+ self.assertIn('<html>', str(page))
+
+ def test_render_POST_unicode(self):
+ """Calling ``CSPResource.render_POST()`` should log whatever stuff was
+ sent in the body of the POST request, even if it's unicode.
+ """
+ self.request.method = b'POST'
+ self.request.writeContent(
+ ('南京大屠杀是中国抗日战争初期侵华日军在中华民国首都南京犯下的'
+ '大規模屠殺、強姦以及纵火、抢劫等战争罪行与反人类罪行。'))
+ self.request.client = requesthelper.IPv4Address('TCP', '3.3.3.3', 443)
+
+ resource = server.CSPResource()
+ page = resource.render_POST(self.request)
+
+ self.assertIn('<html>', str(page))
+
+ def test_render_POST_weird_request(self):
+ """Calling ``CSPResource.render_POST()`` without a strange content
+ object which doesn't have a ``content`` attribute should trigger the
+ ``except Exception`` clause.
+ """
+ self.request.method = b'GET'
+ del self.request.content
+
+ resource = server.CSPResource()
+ page = resource.render_POST(self.request)
+
+ self.assertIn('<html>', str(page))
+
+
class IndexResourceTests(unittest.TestCase):
"""Test for :class:`bridgedb.https.server.IndexResource`."""
@@ -687,7 +787,7 @@ class BridgesResourceTests(unittest.TestCase):
request.headers.update({'accept-language': 'ar,en,en_US,'})
page = self.bridgesResource.render(request)
- self.assertSubstring("direction: rtl", page)
+ self.assertSubstring("rtl.css", page)
self.assertSubstring(
# "I need an alternative way to get bridges!"
"أحتاج إلى وسيلة بديلة للحصول على bridges", page)
@@ -710,7 +810,7 @@ class BridgesResourceTests(unittest.TestCase):
request.args.update({'transport': ['obfs3']})
page = self.bridgesResource.render(request)
- self.assertSubstring("direction: rtl", page)
+ self.assertSubstring("rtl.css", page)
self.assertSubstring(
# "How to use the above bridge lines" (since there should be
# bridges in this response, we don't tell them about alternative
@@ -787,7 +887,7 @@ class OptionsResourceTests(unittest.TestCase):
request.args.update({'transport': ['obfs2']})
page = self.optionsResource.render(request)
- self.assertSubstring("direction: rtl", page)
+ self.assertSubstring("rtl.css", page)
self.assertSubstring("מהם גשרים?", page)
@@ -837,3 +937,27 @@ class HTTPSServerServiceTests(unittest.TestCase):
config = self.config
config.HTTPS_ROTATION_PERIOD = None
server.addWebServer(config, self.distributor)
+
+ def test_addWebServer_CSP_ENABLED_False(self):
+ """Call :func:`bridgedb.https.server.addWebServer` with
+ ``CSP_ENABLED=False`` to test startup.
+ """
+ config = self.config
+ config.CSP_ENABLED = False
+ server.addWebServer(config, self.distributor)
+
+ def test_addWebServer_CSP_REPORT_ONLY_False(self):
+ """Call :func:`bridgedb.https.server.addWebServer` with
+ ``CSP_REPORT_ONLY=False`` to test startup.
+ """
+ config = self.config
+ config.CSP_REPORT_ONLY = False
+ server.addWebServer(config, self.distributor)
+
+ def test_addWebServer_CSP_INCLUDE_SELF_False(self):
+ """Call :func:`bridgedb.https.server.addWebServer` with
+ ``CSP_INCLUDE_SELF=False`` to test startup.
+ """
+ config = self.config
+ config.CSP_INCLUDE_SELF = False
+ server.addWebServer(config, self.distributor)
1
0

[bridgedb/develop] Merge branch 'fix/15968-16649-csp-and-mobile' into develop
by isis@torproject.org 25 Jul '15
by isis@torproject.org 25 Jul '15
25 Jul '15
commit 343583dd3a15b36258bace06debe6f8d9d7bd9b7
Merge: 5e97d68 002104d
Author: Isis Lovecruft <isis(a)torproject.org>
Date: Fri Jul 24 06:47:25 2015 +0000
Merge branch 'fix/15968-16649-csp-and-mobile' into develop
bridgedb.conf | 44 ++-
bridgedb/configure.py | 3 +-
bridgedb/https/server.py | 183 ++++++++++-
bridgedb/https/templates/assets/css/custom.css | 158 ---------
bridgedb/https/templates/assets/css/main.css | 419 +++++++++++++++++++++++-
bridgedb/https/templates/assets/css/rtl.css | 7 +
bridgedb/https/templates/assets/js/bridges.js | 83 +++++
bridgedb/https/templates/base.html | 142 ++++----
bridgedb/https/templates/bridges.html | 102 ++----
bridgedb/https/templates/captcha.html | 92 +++---
bridgedb/https/templates/howto.html | 11 +-
bridgedb/https/templates/index.html | 12 +-
bridgedb/https/templates/options.html | 124 ++++---
scripts/setup-tests | 1 +
setup.py | 3 +-
test/https_helpers.py | 32 +-
test/test_https.py | 22 ++
test/test_https_server.py | 130 +++++++-
18 files changed, 1105 insertions(+), 463 deletions(-)
diff --cc bridgedb/https/server.py
index 81ce09f,ef40377..2f5ed83
--- a/bridgedb/https/server.py
+++ b/bridgedb/https/server.py
@@@ -76,9 -73,39 +76,39 @@@ lookup = TemplateLookup(directories=[TE
collection_size=500)
logging.debug("Set template root to %s" % TEMPLATE_DIR)
+ #: This server's public, fully-qualified domain name.
+ SERVER_PUBLIC_FQDN = None
+
+
+ def setFQDN(fqdn, https=True):
+ """Set the global :data:`SERVER_PUBLIC FQDN` variable.
+
+ :param str fqdn: The public, fully-qualified domain name of the HTTP
+ server that will serve this resource.
+ :param bool https: If ``True``, then ``'https://'`` will be prepended to
+ the FQDN. This is primarily used to create a
+ ``Content-Security-Policy`` header that will only allow resources to
+ be sourced via HTTPS, otherwise, if ``False``, it allow resources to
+ be sourced via any transport protocol.
+ """
+ if https:
+ fqdn = 'https://' + fqdn
+
+ logging.info("Setting HTTP server public FQDN to %r" % fqdn)
+
+ global SERVER_PUBLIC_FQDN
+ SERVER_PUBLIC_FQDN = fqdn
+
+ def getFQDN():
+ """Get the setting for the HTTP server's public FQDN from the global
+ :data:`SERVER_PUBLIC_FQDN variable.
+
+ :rtype: str or None
+ """
+ return SERVER_PUBLIC_FQDN
def getClientIP(request, useForwardedHeader=False):
- """Get the client's IP address from the :header:`X-Forwarded-For`
+ """Get the client's IP address from the ``'X-Forwarded-For:'``
header, or from the :api:`request <twisted.web.server.Request>`.
:type request: :api:`twisted.web.http.Request`
1
0

25 Jul '15
commit d05744c4b87be8f3d625c56c45b15eab47df2a35
Author: Isis Lovecruft <isis(a)torproject.org>
Date: Sat Jul 25 01:11:04 2015 +0000
Update CHANGELOG for BridgeDB 0.3.3.
---
CHANGELOG | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 101 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 4dc04f0..d99f3f7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,104 @@
+Changes in version 0.3.3 - 2015-07-25
+
+ * FIXES #12029 https://bugs.torproject.org/12029
+ BridgeDB now has an API for creating Bridge Distributors.
+ See the bridgedb.distribute module, or its developer documentation
+ at https://pythonhosted.org/bridgedb/bridgedb.distribute.html.
+
+ * FIXES PART OF #12506 https://bugs.torproject.org/12506
+ BridgeDB's two Distributors (HTTPS and Email) are now entirely
+ modularised and self-contained within separate subdirectories in
+ the source code. This is the first step to redesigning these
+ Distributors into their own separate processes, which will allow
+ the Distributors to remain functional while BridgeDB is reparsing
+ bridge descriptors.
+
+ * FIXES #15968 https://bugs.torproject.org/15968
+ BridgeDB now sends a Content-Security-Policy header which
+ explicitly allows Javascript, images, CSS, and fonts, from
+ https://bridges.torproject.org. All other types of content are
+ forbidden, including:
+ - embedding https://bridges.torproject.org within
+ <iframe>, <embed>, or <object>, and attempting to source
+ additional resources into its embedded context
+ - inline Javascript, including Javascript within SVG files
+ - inline CSS
+ - externally hosted fonts
+ - inline SVG, e.g. via the HTML5 <svg> tag
+ - any and all connections made via Javascript XMLHttpRequests,
+ WebSockets, sendBeacon(), and Web Workers
+ - plugins
+ - applets
+ BridgeDB's Content-Security-Policy does not yet make use of
+ certain newer, lesser supported, Content-Security-Policy v2.0
+ directives, such as "reflected-xss" and "frame-ancestors", but may
+ someday.
+
+ * FIXES #16273 https://bugs.torproject.org/16273
+ Several links to Tor Project gitweb URLs within the developer
+ documentation were outdated in that they still used the old gitweb
+ URL format. These are now updated.
+ Thanks to David Fifield for the bug report and patches.
+
+ * FIXES #16330 https://bugs.torproject.org/16330
+ BridgeDB can now handle bridge-server-descriptors with
+ extra-info-digest fields which have two values, as well as both
+ bridge-server-descriptors and bridge-extrainfo descriptors which
+ contain Ed25519 key material and signatures. See Tor proposals
+ #220 and #228 for more information on the changes to these
+ descriptors. Note that BridgeDB can now parse this information,
+ but does not yet make use of any Ed25519 cryptographic material
+ within bridge descriptors.
+ https://gitweb.torproject.org/torspec.git/tree/proposals/220-ecc-id-keys.txt
+ https://gitweb.torproject.org/torspec.git/tree/proposals/228-cross-certific…
+ Thanks to Atagar for patching Stem.
+
+ * FIXES #16616 https://bugs.torproject.org/16616
+ The HSDir flag can now be included within bridge-networkstatus
+ documents. BridgeDB now has unittests which guarantee that its
+ parsers safely ignore this flag, as well as any flags unknown to
+ BridgeDB which may appear in the future.
+ Thanks to Roger Dingledine for alerting me about the change.
+
+ * FIXES #16649 https://bugs.torproject.org/16649
+ Mobile users, and other users with small screen pixel ratios, will
+ find that the UI of BridgeDB's HTTPS Distributor has greatly
+ increased in usability and readability.
+
+
+And includes the following general changes:
+
+ * FIXES an error when requesting the non-HTML version of the
+ bridges page (e.g. https://bridges.torproject.org/bridges?format=plain)
+
+ * REMOVES the `bridgedb test` commandline option.
+ BridgeDB's tests can be run via `python setup.py test` or `make
+ test` (or `make coverage` for generating HTML test coverage
+ statistics).
+
+ * CHANGES the HTTPS Distributor to HTML-encode Bridge Lines.
+ Previously, a malicious Pluggable Transport Bridge could include
+ in its PT arguments something like "evil=<script>[…]</script>" and
+ if such a Bridge were to be distributed to a user, that user's web
+ browser would execute the script (if Javacript was enabled).
+ Other characters, including non-ASCII, control characters, double
+ quotes, and backslashes, are also sanitised from Bridge Lines.
+ Thanks to Robert Ransom for the patches.
+
+ * CHANGES BridgeDB's module/package version numbers to be
+ compliant with PEP440.
+
+ * CHANGES the layout of BridgeDB's source code directories.
+ Rather than storing BridgeDB's source in "lib/bridgedb/", it is
+ now kept in "bridgedb/". Similarly, the directory containing
+ BridgeDB's tests has been moved from "lib/bridgedb/test/" to
+ "test/", which means that the tests are no longer installed when
+ running `python setup.py install` or `make install`.
+
+ * ADDS several improvements to the developer documentation at
+ https://pythonhosted.org/bridgedb.
+
+
Changes in version 0.3.2 - 2015-05-01
* FIXES a problem with the calculation of Levenshtein distances
1
0

[translation/tor-messenger-privdtd_completed] pulling translations from transifex
by translation@torproject.org 24 Jul '15
by translation@torproject.org 24 Jul '15
24 Jul '15
commit f317e3b3d4f9a702a7320a7d027702d912675889
Author: Translation commit bot <translation(a)torproject.org>
Date: Fri Jul 24 19:54:55 2015 +0000
pulling translations from transifex
---
ar/priv.dtd | 2 ++
de/priv.dtd | 2 ++
en_GB/priv.dtd | 2 ++
es/priv.dtd | 2 ++
es_CO/priv.dtd | 2 ++
fa/priv.dtd | 2 ++
fr/priv.dtd | 2 ++
fr_CA/priv.dtd | 2 ++
hr_HR/priv.dtd | 2 ++
hu/priv.dtd | 2 ++
id/priv.dtd | 2 ++
it/priv.dtd | 2 ++
lv/priv.dtd | 2 ++
nb/priv.dtd | 2 ++
nl/priv.dtd | 2 ++
pl/priv.dtd | 2 ++
pt_BR/priv.dtd | 2 ++
ro/priv.dtd | 2 ++
ru/priv.dtd | 2 ++
tr/priv.dtd | 2 ++
zh_CN/priv.dtd | 2 ++
21 files changed, 42 insertions(+)
diff --git a/ar/priv.dtd b/ar/priv.dtd
new file mode 100644
index 0000000..bea09bf
--- /dev/null
+++ b/ar/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "جاري توليد المفتاح الخاص">
+<!ENTITY privDialog.done "تم">
\ No newline at end of file
diff --git a/de/priv.dtd b/de/priv.dtd
new file mode 100644
index 0000000..b9fb53f
--- /dev/null
+++ b/de/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Privater Schlüssel wird erzeugt">
+<!ENTITY privDialog.done "Fertig">
\ No newline at end of file
diff --git a/en_GB/priv.dtd b/en_GB/priv.dtd
new file mode 100644
index 0000000..7007979
--- /dev/null
+++ b/en_GB/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/es/priv.dtd b/es/priv.dtd
new file mode 100644
index 0000000..a79e92f
--- /dev/null
+++ b/es/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generando clave privada">
+<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/es_CO/priv.dtd b/es_CO/priv.dtd
new file mode 100644
index 0000000..f90048c
--- /dev/null
+++ b/es_CO/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generar una llave privada">
+<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/fa/priv.dtd b/fa/priv.dtd
new file mode 100644
index 0000000..f78e91e
--- /dev/null
+++ b/fa/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "تولید کلید خصوصی">
+<!ENTITY privDialog.done "انجام شد">
\ No newline at end of file
diff --git a/fr/priv.dtd b/fr/priv.dtd
new file mode 100644
index 0000000..59634c3
--- /dev/null
+++ b/fr/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Génération de la clé privée">
+<!ENTITY privDialog.done "Terminé">
\ No newline at end of file
diff --git a/fr_CA/priv.dtd b/fr_CA/priv.dtd
new file mode 100644
index 0000000..6caaf75
--- /dev/null
+++ b/fr_CA/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Création de la clef privée">
+<!ENTITY privDialog.done "Fait">
\ No newline at end of file
diff --git a/hr_HR/priv.dtd b/hr_HR/priv.dtd
new file mode 100644
index 0000000..6c4d395
--- /dev/null
+++ b/hr_HR/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generiram privatni ključ">
+<!ENTITY privDialog.done "Gotovo">
\ No newline at end of file
diff --git a/hu/priv.dtd b/hu/priv.dtd
new file mode 100644
index 0000000..1178e17
--- /dev/null
+++ b/hu/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Privát kulcs generálása">
+<!ENTITY privDialog.done "Kész">
\ No newline at end of file
diff --git a/id/priv.dtd b/id/priv.dtd
new file mode 100644
index 0000000..922d5d8
--- /dev/null
+++ b/id/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Membuat kunci privat">
+<!ENTITY privDialog.done "Selesai">
\ No newline at end of file
diff --git a/it/priv.dtd b/it/priv.dtd
new file mode 100644
index 0000000..e0f86af
--- /dev/null
+++ b/it/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generazione chiave privata">
+<!ENTITY privDialog.done "Fatto">
\ No newline at end of file
diff --git a/lv/priv.dtd b/lv/priv.dtd
new file mode 100644
index 0000000..7fdfb5a
--- /dev/null
+++ b/lv/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Ģenerē privāto atslēgu">
+<!ENTITY privDialog.done "Gatavs">
\ No newline at end of file
diff --git a/nb/priv.dtd b/nb/priv.dtd
new file mode 100644
index 0000000..09b9708
--- /dev/null
+++ b/nb/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Oppretter privat nøkkel">
+<!ENTITY privDialog.done "Ferdig">
\ No newline at end of file
diff --git a/nl/priv.dtd b/nl/priv.dtd
new file mode 100644
index 0000000..821b963
--- /dev/null
+++ b/nl/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Bezig met aanmaken van privésleutel">
+<!ENTITY privDialog.done "Klaar">
\ No newline at end of file
diff --git a/pl/priv.dtd b/pl/priv.dtd
new file mode 100644
index 0000000..4ada415
--- /dev/null
+++ b/pl/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Trwa generowanie prywatnego klucza">
+<!ENTITY privDialog.done "Gotowe">
\ No newline at end of file
diff --git a/pt_BR/priv.dtd b/pt_BR/priv.dtd
new file mode 100644
index 0000000..d581ea2
--- /dev/null
+++ b/pt_BR/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Gerando chave privada">
+<!ENTITY privDialog.done "Pronto">
\ No newline at end of file
diff --git a/ro/priv.dtd b/ro/priv.dtd
new file mode 100644
index 0000000..c1b44d3
--- /dev/null
+++ b/ro/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Se generează cheie privată">
+<!ENTITY privDialog.done "Gata">
\ No newline at end of file
diff --git a/ru/priv.dtd b/ru/priv.dtd
new file mode 100644
index 0000000..ba980a4
--- /dev/null
+++ b/ru/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Генерация закрытого ключа">
+<!ENTITY privDialog.done "Готово">
\ No newline at end of file
diff --git a/tr/priv.dtd b/tr/priv.dtd
new file mode 100644
index 0000000..d7f481b
--- /dev/null
+++ b/tr/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Özel anahtar oluşturuluyor">
+<!ENTITY privDialog.done "Bitti">
\ No newline at end of file
diff --git a/zh_CN/priv.dtd b/zh_CN/priv.dtd
new file mode 100644
index 0000000..bf3127c
--- /dev/null
+++ b/zh_CN/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "生成隐私密钥">
+<!ENTITY privDialog.done "完成">
\ No newline at end of file
1
0

[translation/tor-messenger-privdtd] pulling translations from transifex
by translation@torproject.org 24 Jul '15
by translation@torproject.org 24 Jul '15
24 Jul '15
commit 22e033ffcfdbe7d1fee790fe035fe9fa856e3b6c
Author: Translation commit bot <translation(a)torproject.org>
Date: Fri Jul 24 19:54:00 2015 +0000
pulling translations from transifex
---
ar/priv.dtd | 2 ++
ba/priv.dtd | 2 ++
de/priv.dtd | 2 ++
el/priv.dtd | 2 ++
en_GB/priv.dtd | 2 ++
es/priv.dtd | 2 ++
es_CO/priv.dtd | 2 ++
fa/priv.dtd | 2 ++
fr/priv.dtd | 2 ++
fr_CA/priv.dtd | 2 ++
gd/priv.dtd | 2 ++
hr_HR/priv.dtd | 2 ++
hu/priv.dtd | 2 ++
id/priv.dtd | 2 ++
it/priv.dtd | 2 ++
jbo/priv.dtd | 2 ++
lv/priv.dtd | 2 ++
nb/priv.dtd | 2 ++
nl/priv.dtd | 2 ++
pl/priv.dtd | 2 ++
pt/priv.dtd | 2 ++
pt_BR/priv.dtd | 2 ++
ro/priv.dtd | 2 ++
ru/priv.dtd | 2 ++
sa/priv.dtd | 2 ++
tr/priv.dtd | 2 ++
zh_CN/priv.dtd | 2 ++
zh_TW/priv.dtd | 2 ++
28 files changed, 56 insertions(+)
diff --git a/ar/priv.dtd b/ar/priv.dtd
new file mode 100644
index 0000000..bea09bf
--- /dev/null
+++ b/ar/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "جاري توليد المفتاح الخاص">
+<!ENTITY privDialog.done "تم">
\ No newline at end of file
diff --git a/ba/priv.dtd b/ba/priv.dtd
new file mode 100644
index 0000000..7007979
--- /dev/null
+++ b/ba/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/de/priv.dtd b/de/priv.dtd
new file mode 100644
index 0000000..b9fb53f
--- /dev/null
+++ b/de/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Privater Schlüssel wird erzeugt">
+<!ENTITY privDialog.done "Fertig">
\ No newline at end of file
diff --git a/el/priv.dtd b/el/priv.dtd
new file mode 100644
index 0000000..8d0b6f7
--- /dev/null
+++ b/el/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Δημιουργία ιδιωτικού κλειδιού ">
+<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/en_GB/priv.dtd b/en_GB/priv.dtd
new file mode 100644
index 0000000..7007979
--- /dev/null
+++ b/en_GB/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/es/priv.dtd b/es/priv.dtd
new file mode 100644
index 0000000..a79e92f
--- /dev/null
+++ b/es/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generando clave privada">
+<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/es_CO/priv.dtd b/es_CO/priv.dtd
new file mode 100644
index 0000000..f90048c
--- /dev/null
+++ b/es_CO/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generar una llave privada">
+<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/fa/priv.dtd b/fa/priv.dtd
new file mode 100644
index 0000000..f78e91e
--- /dev/null
+++ b/fa/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "تولید کلید خصوصی">
+<!ENTITY privDialog.done "انجام شد">
\ No newline at end of file
diff --git a/fr/priv.dtd b/fr/priv.dtd
new file mode 100644
index 0000000..59634c3
--- /dev/null
+++ b/fr/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Génération de la clé privée">
+<!ENTITY privDialog.done "Terminé">
\ No newline at end of file
diff --git a/fr_CA/priv.dtd b/fr_CA/priv.dtd
new file mode 100644
index 0000000..6caaf75
--- /dev/null
+++ b/fr_CA/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Création de la clef privée">
+<!ENTITY privDialog.done "Fait">
\ No newline at end of file
diff --git a/gd/priv.dtd b/gd/priv.dtd
new file mode 100644
index 0000000..7007979
--- /dev/null
+++ b/gd/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/hr_HR/priv.dtd b/hr_HR/priv.dtd
new file mode 100644
index 0000000..6c4d395
--- /dev/null
+++ b/hr_HR/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generiram privatni ključ">
+<!ENTITY privDialog.done "Gotovo">
\ No newline at end of file
diff --git a/hu/priv.dtd b/hu/priv.dtd
new file mode 100644
index 0000000..1178e17
--- /dev/null
+++ b/hu/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Privát kulcs generálása">
+<!ENTITY privDialog.done "Kész">
\ No newline at end of file
diff --git a/id/priv.dtd b/id/priv.dtd
new file mode 100644
index 0000000..922d5d8
--- /dev/null
+++ b/id/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Membuat kunci privat">
+<!ENTITY privDialog.done "Selesai">
\ No newline at end of file
diff --git a/it/priv.dtd b/it/priv.dtd
new file mode 100644
index 0000000..e0f86af
--- /dev/null
+++ b/it/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generazione chiave privata">
+<!ENTITY privDialog.done "Fatto">
\ No newline at end of file
diff --git a/jbo/priv.dtd b/jbo/priv.dtd
new file mode 100644
index 0000000..7007979
--- /dev/null
+++ b/jbo/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/lv/priv.dtd b/lv/priv.dtd
new file mode 100644
index 0000000..7fdfb5a
--- /dev/null
+++ b/lv/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Ģenerē privāto atslēgu">
+<!ENTITY privDialog.done "Gatavs">
\ No newline at end of file
diff --git a/nb/priv.dtd b/nb/priv.dtd
new file mode 100644
index 0000000..09b9708
--- /dev/null
+++ b/nb/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Oppretter privat nøkkel">
+<!ENTITY privDialog.done "Ferdig">
\ No newline at end of file
diff --git a/nl/priv.dtd b/nl/priv.dtd
new file mode 100644
index 0000000..821b963
--- /dev/null
+++ b/nl/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Bezig met aanmaken van privésleutel">
+<!ENTITY privDialog.done "Klaar">
\ No newline at end of file
diff --git a/pl/priv.dtd b/pl/priv.dtd
new file mode 100644
index 0000000..4ada415
--- /dev/null
+++ b/pl/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Trwa generowanie prywatnego klucza">
+<!ENTITY privDialog.done "Gotowe">
\ No newline at end of file
diff --git a/pt/priv.dtd b/pt/priv.dtd
new file mode 100644
index 0000000..e86fd87
--- /dev/null
+++ b/pt/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "Concluída">
\ No newline at end of file
diff --git a/pt_BR/priv.dtd b/pt_BR/priv.dtd
new file mode 100644
index 0000000..d581ea2
--- /dev/null
+++ b/pt_BR/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Gerando chave privada">
+<!ENTITY privDialog.done "Pronto">
\ No newline at end of file
diff --git a/ro/priv.dtd b/ro/priv.dtd
new file mode 100644
index 0000000..c1b44d3
--- /dev/null
+++ b/ro/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Se generează cheie privată">
+<!ENTITY privDialog.done "Gata">
\ No newline at end of file
diff --git a/ru/priv.dtd b/ru/priv.dtd
new file mode 100644
index 0000000..ba980a4
--- /dev/null
+++ b/ru/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Генерация закрытого ключа">
+<!ENTITY privDialog.done "Готово">
\ No newline at end of file
diff --git a/sa/priv.dtd b/sa/priv.dtd
new file mode 100644
index 0000000..7007979
--- /dev/null
+++ b/sa/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/tr/priv.dtd b/tr/priv.dtd
new file mode 100644
index 0000000..d7f481b
--- /dev/null
+++ b/tr/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Özel anahtar oluşturuluyor">
+<!ENTITY privDialog.done "Bitti">
\ No newline at end of file
diff --git a/zh_CN/priv.dtd b/zh_CN/priv.dtd
new file mode 100644
index 0000000..bf3127c
--- /dev/null
+++ b/zh_CN/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "生成隐私密钥">
+<!ENTITY privDialog.done "完成">
\ No newline at end of file
diff --git a/zh_TW/priv.dtd b/zh_TW/priv.dtd
new file mode 100644
index 0000000..cba66f7
--- /dev/null
+++ b/zh_TW/priv.dtd
@@ -0,0 +1,2 @@
+<!ENTITY privDialog.title "Generating private key">
+<!ENTITY privDialog.done "完成">
\ No newline at end of file
1
0

[translation/tor-messenger-privproperties] pulling translations from transifex
by translation@torproject.org 24 Jul '15
by translation@torproject.org 24 Jul '15
24 Jul '15
commit 99027527fb00ea4afdddc6db2900b138cb9908d5
Author: Translation commit bot <translation(a)torproject.org>
Date: Fri Jul 24 19:52:40 2015 +0000
pulling translations from transifex
---
ach/priv.properties | 1 +
ady/priv.properties | 1 +
af/priv.properties | 1 +
ak/priv.properties | 1 +
am/priv.properties | 1 +
ar/priv.dtd | 2 --
ar/priv.properties | 1 +
arn/priv.properties | 1 +
ast/priv.properties | 1 +
az/priv.properties | 1 +
ba/priv.dtd | 2 --
ba/priv.properties | 1 +
be/priv.properties | 1 +
bg/priv.properties | 1 +
bn/priv.properties | 1 +
bn_IN/priv.properties | 1 +
bo/priv.properties | 1 +
br/priv.properties | 1 +
bs/priv.properties | 1 +
ca/priv.properties | 1 +
cs/priv.properties | 1 +
csb/priv.properties | 1 +
cv/priv.properties | 1 +
cy/priv.properties | 1 +
cy_GB/priv.properties | 1 +
da/priv.properties | 1 +
de/priv.dtd | 2 --
de/priv.properties | 1 +
dz/priv.properties | 1 +
el/priv.dtd | 2 --
el/priv.properties | 1 +
en/priv.properties | 1 +
en_GB/priv.dtd | 2 --
en_GB/priv.properties | 1 +
eo/priv.properties | 1 +
es/priv.dtd | 2 --
es/priv.properties | 1 +
es_AR/priv.properties | 1 +
es_CL/priv.properties | 1 +
es_CO/priv.dtd | 2 --
es_CO/priv.properties | 1 +
es_MX/priv.properties | 1 +
et/priv.properties | 1 +
eu/priv.properties | 1 +
fa/priv.dtd | 2 --
fa/priv.properties | 1 +
fi/priv.properties | 1 +
fil/priv.properties | 1 +
fo/priv.properties | 1 +
fr/priv.dtd | 2 --
fr/priv.properties | 1 +
fr_CA/priv.dtd | 2 --
fr_CA/priv.properties | 1 +
fur/priv.properties | 1 +
fy/priv.properties | 1 +
ga/priv.properties | 1 +
gd/priv.dtd | 2 --
gd/priv.properties | 1 +
gl/priv.properties | 1 +
gu/priv.properties | 1 +
gu_IN/priv.properties | 1 +
gun/priv.properties | 1 +
ha/priv.properties | 1 +
he/priv.properties | 1 +
hi/priv.properties | 1 +
hr/priv.properties | 1 +
hr_HR/priv.dtd | 2 --
hr_HR/priv.properties | 1 +
ht/priv.properties | 1 +
hu/priv.dtd | 2 --
hu/priv.properties | 1 +
hy/priv.properties | 1 +
hy_AM/priv.properties | 1 +
ia/priv.properties | 1 +
id/priv.dtd | 2 --
id/priv.properties | 1 +
is/priv.properties | 1 +
it/priv.dtd | 2 --
it/priv.properties | 1 +
ja/priv.properties | 1 +
jbo/priv.dtd | 2 --
jbo/priv.properties | 1 +
jv/priv.properties | 1 +
ka/priv.properties | 1 +
kk/priv.properties | 1 +
km/priv.properties | 1 +
kn/priv.properties | 1 +
ko/priv.properties | 1 +
ko_KR/priv.properties | 1 +
ku/priv.properties | 1 +
ku_IQ/priv.properties | 1 +
kw/priv.properties | 1 +
ky/priv.properties | 1 +
la/priv.properties | 1 +
lb/priv.properties | 1 +
lg/priv.properties | 1 +
ln/priv.properties | 1 +
lo/priv.properties | 1 +
lt/priv.properties | 1 +
lv/priv.dtd | 2 --
lv/priv.properties | 1 +
mg/priv.properties | 1 +
mi/priv.properties | 1 +
mk/priv.properties | 1 +
ml/priv.properties | 1 +
mn/priv.properties | 1 +
mr/priv.properties | 1 +
ms_MY/priv.properties | 1 +
mt/priv.properties | 1 +
my/priv.properties | 1 +
nah/priv.properties | 1 +
nap/priv.properties | 1 +
nb/priv.dtd | 2 --
nb/priv.properties | 1 +
nds/priv.properties | 1 +
ne/priv.properties | 1 +
nl/priv.dtd | 2 --
nl/priv.properties | 1 +
nl_BE/priv.properties | 1 +
nn/priv.properties | 1 +
nso/priv.properties | 1 +
oc/priv.properties | 1 +
or/priv.properties | 1 +
pa/priv.properties | 1 +
pap/priv.properties | 1 +
pl/priv.dtd | 2 --
pl/priv.properties | 1 +
pms/priv.properties | 1 +
ps/priv.properties | 1 +
pt/priv.dtd | 2 --
pt/priv.properties | 1 +
pt_BR/priv.dtd | 2 --
pt_BR/priv.properties | 1 +
ro/priv.dtd | 2 --
ro/priv.properties | 1 +
ru/priv.dtd | 2 --
ru/priv.properties | 1 +
ru(a)petr1708/priv.properties | 1 +
sa/priv.dtd | 2 --
sa/priv.properties | 1 +
scn/priv.properties | 1 +
sco/priv.properties | 1 +
si/priv.properties | 1 +
si_LK/priv.properties | 1 +
sk/priv.properties | 1 +
sk_SK/priv.properties | 1 +
sl/priv.properties | 1 +
sl_SI/priv.properties | 1 +
sn/priv.properties | 1 +
so/priv.properties | 1 +
son/priv.properties | 1 +
sq/priv.properties | 1 +
sr/priv.properties | 1 +
sr(a)latin/priv.properties | 1 +
st/priv.properties | 1 +
su/priv.properties | 1 +
sv/priv.properties | 1 +
sw/priv.properties | 1 +
szl/priv.properties | 1 +
ta/priv.properties | 1 +
te/priv.properties | 1 +
te_IN/priv.properties | 1 +
tg/priv.properties | 1 +
th/priv.properties | 1 +
ti/priv.properties | 1 +
tk/priv.properties | 1 +
tl_PH/priv.properties | 1 +
tr/priv.dtd | 2 --
tr/priv.properties | 1 +
ug(a)Arab/priv.properties | 1 +
uk/priv.properties | 1 +
ur/priv.properties | 1 +
ur_PK/priv.properties | 1 +
uz/priv.properties | 1 +
ve/priv.properties | 1 +
vi/priv.properties | 1 +
wa/priv.properties | 1 +
wo/priv.properties | 1 +
yo/priv.properties | 1 +
zh_CN/priv.dtd | 2 --
zh_CN/priv.properties | 1 +
zh_HK/priv.properties | 1 +
zh_TW/priv.dtd | 2 --
zh_TW/priv.properties | 1 +
zu/priv.properties | 1 +
185 files changed, 157 insertions(+), 56 deletions(-)
diff --git a/ach/priv.properties b/ach/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ach/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ady/priv.properties b/ady/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ady/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/af/priv.properties b/af/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/af/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ak/priv.properties b/ak/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ak/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/am/priv.properties b/am/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/am/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ar/priv.dtd b/ar/priv.dtd
deleted file mode 100644
index bea09bf..0000000
--- a/ar/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "جاري توليد المفتاح الخاص">
-<!ENTITY privDialog.done "تم">
\ No newline at end of file
diff --git a/ar/priv.properties b/ar/priv.properties
new file mode 100644
index 0000000..c1e33b0
--- /dev/null
+++ b/ar/priv.properties
@@ -0,0 +1 @@
+priv.account=جاري توليد المفتاح الخاص بـ%S (%S) ...
diff --git a/arn/priv.properties b/arn/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/arn/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ast/priv.properties b/ast/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ast/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/az/priv.properties b/az/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/az/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ba/priv.dtd b/ba/priv.dtd
deleted file mode 100644
index 7007979..0000000
--- a/ba/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/ba/priv.properties b/ba/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ba/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/be/priv.properties b/be/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/be/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/bg/priv.properties b/bg/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/bg/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/bn/priv.properties b/bn/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/bn/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/bn_IN/priv.properties b/bn_IN/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/bn_IN/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/bo/priv.properties b/bo/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/bo/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/br/priv.properties b/br/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/br/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/bs/priv.properties b/bs/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/bs/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ca/priv.properties b/ca/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ca/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/cs/priv.properties b/cs/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/cs/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/csb/priv.properties b/csb/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/csb/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/cv/priv.properties b/cv/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/cv/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/cy/priv.properties b/cy/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/cy/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/cy_GB/priv.properties b/cy_GB/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/cy_GB/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/da/priv.properties b/da/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/da/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/de/priv.dtd b/de/priv.dtd
deleted file mode 100644
index b9fb53f..0000000
--- a/de/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Privater Schlüssel wird erzeugt">
-<!ENTITY privDialog.done "Fertig">
\ No newline at end of file
diff --git a/de/priv.properties b/de/priv.properties
new file mode 100644
index 0000000..2f82255
--- /dev/null
+++ b/de/priv.properties
@@ -0,0 +1 @@
+priv.account=Privater Schlüssel für %S (%S) wird erzeugt ...
diff --git a/dz/priv.properties b/dz/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/dz/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/el/priv.dtd b/el/priv.dtd
deleted file mode 100644
index 8d0b6f7..0000000
--- a/el/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Δημιουργία ιδιωτικού κλειδιού ">
-<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/el/priv.properties b/el/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/el/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/en/priv.properties b/en/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/en/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/en_GB/priv.dtd b/en_GB/priv.dtd
deleted file mode 100644
index 7007979..0000000
--- a/en_GB/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/en_GB/priv.properties b/en_GB/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/en_GB/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/eo/priv.properties b/eo/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/eo/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/es/priv.dtd b/es/priv.dtd
deleted file mode 100644
index a79e92f..0000000
--- a/es/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generando clave privada">
-<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/es/priv.properties b/es/priv.properties
new file mode 100644
index 0000000..db39744
--- /dev/null
+++ b/es/priv.properties
@@ -0,0 +1 @@
+priv.account=Generando clave privada para %S (%S) ...
diff --git a/es_AR/priv.properties b/es_AR/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/es_AR/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/es_CL/priv.properties b/es_CL/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/es_CL/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/es_CO/priv.dtd b/es_CO/priv.dtd
deleted file mode 100644
index f90048c..0000000
--- a/es_CO/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generar una llave privada">
-<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/es_CO/priv.properties b/es_CO/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/es_CO/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/es_MX/priv.properties b/es_MX/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/es_MX/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/et/priv.properties b/et/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/et/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/eu/priv.properties b/eu/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/eu/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/fa/priv.dtd b/fa/priv.dtd
deleted file mode 100644
index f78e91e..0000000
--- a/fa/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "تولید کلید خصوصی">
-<!ENTITY privDialog.done "انجام شد">
\ No newline at end of file
diff --git a/fa/priv.properties b/fa/priv.properties
new file mode 100644
index 0000000..3265bab
--- /dev/null
+++ b/fa/priv.properties
@@ -0,0 +1 @@
+priv.account=تولید کلید خصوصی برای %S (%S) ...
diff --git a/fi/priv.properties b/fi/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/fi/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/fil/priv.properties b/fil/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/fil/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/fo/priv.properties b/fo/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/fo/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/fr/priv.dtd b/fr/priv.dtd
deleted file mode 100644
index 59634c3..0000000
--- a/fr/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Génération de la clé privée">
-<!ENTITY privDialog.done "Terminé">
\ No newline at end of file
diff --git a/fr/priv.properties b/fr/priv.properties
new file mode 100644
index 0000000..ac633c7
--- /dev/null
+++ b/fr/priv.properties
@@ -0,0 +1 @@
+priv.account=Génération d'une clé privée pour %S (%S) ...
diff --git a/fr_CA/priv.dtd b/fr_CA/priv.dtd
deleted file mode 100644
index 6caaf75..0000000
--- a/fr_CA/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Création de la clef privée">
-<!ENTITY privDialog.done "Fait">
\ No newline at end of file
diff --git a/fr_CA/priv.properties b/fr_CA/priv.properties
new file mode 100644
index 0000000..26e1a4f
--- /dev/null
+++ b/fr_CA/priv.properties
@@ -0,0 +1 @@
+priv.account=Création de la clef privée pour %S (%S)...
diff --git a/fur/priv.properties b/fur/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/fur/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/fy/priv.properties b/fy/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/fy/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ga/priv.properties b/ga/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ga/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/gd/priv.dtd b/gd/priv.dtd
deleted file mode 100644
index 7007979..0000000
--- a/gd/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/gd/priv.properties b/gd/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/gd/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/gl/priv.properties b/gl/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/gl/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/gu/priv.properties b/gu/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/gu/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/gu_IN/priv.properties b/gu_IN/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/gu_IN/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/gun/priv.properties b/gun/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/gun/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ha/priv.properties b/ha/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ha/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/he/priv.properties b/he/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/he/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/hi/priv.properties b/hi/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/hi/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/hr/priv.properties b/hr/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/hr/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/hr_HR/priv.dtd b/hr_HR/priv.dtd
deleted file mode 100644
index 6c4d395..0000000
--- a/hr_HR/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generiram privatni ključ">
-<!ENTITY privDialog.done "Gotovo">
\ No newline at end of file
diff --git a/hr_HR/priv.properties b/hr_HR/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/hr_HR/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ht/priv.properties b/ht/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ht/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/hu/priv.dtd b/hu/priv.dtd
deleted file mode 100644
index 1178e17..0000000
--- a/hu/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Privát kulcs generálása">
-<!ENTITY privDialog.done "Kész">
\ No newline at end of file
diff --git a/hu/priv.properties b/hu/priv.properties
new file mode 100644
index 0000000..538b27c
--- /dev/null
+++ b/hu/priv.properties
@@ -0,0 +1 @@
+priv.account=Privát kulcs generálása ehhez: %S (%S) ...
diff --git a/hy/priv.properties b/hy/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/hy/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/hy_AM/priv.properties b/hy_AM/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/hy_AM/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ia/priv.properties b/ia/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ia/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/id/priv.dtd b/id/priv.dtd
deleted file mode 100644
index 922d5d8..0000000
--- a/id/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Membuat kunci privat">
-<!ENTITY privDialog.done "Selesai">
\ No newline at end of file
diff --git a/id/priv.properties b/id/priv.properties
new file mode 100644
index 0000000..a4ad9fc
--- /dev/null
+++ b/id/priv.properties
@@ -0,0 +1 @@
+priv.account=Membuat kunci privat untuk %S (%S) ...
diff --git a/is/priv.properties b/is/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/is/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/it/priv.dtd b/it/priv.dtd
deleted file mode 100644
index e0f86af..0000000
--- a/it/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generazione chiave privata">
-<!ENTITY privDialog.done "Fatto">
\ No newline at end of file
diff --git a/it/priv.properties b/it/priv.properties
new file mode 100644
index 0000000..79d75fa
--- /dev/null
+++ b/it/priv.properties
@@ -0,0 +1 @@
+priv.account=Generazione della chiave privata per %S (%S)...
diff --git a/ja/priv.properties b/ja/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ja/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/jbo/priv.dtd b/jbo/priv.dtd
deleted file mode 100644
index 7007979..0000000
--- a/jbo/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/jbo/priv.properties b/jbo/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/jbo/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/jv/priv.properties b/jv/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/jv/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ka/priv.properties b/ka/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ka/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/kk/priv.properties b/kk/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/kk/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/km/priv.properties b/km/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/km/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/kn/priv.properties b/kn/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/kn/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ko/priv.properties b/ko/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ko/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ko_KR/priv.properties b/ko_KR/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ko_KR/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ku/priv.properties b/ku/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ku/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ku_IQ/priv.properties b/ku_IQ/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ku_IQ/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/kw/priv.properties b/kw/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/kw/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ky/priv.properties b/ky/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ky/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/la/priv.properties b/la/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/la/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/lb/priv.properties b/lb/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/lb/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/lg/priv.properties b/lg/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/lg/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ln/priv.properties b/ln/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ln/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/lo/priv.properties b/lo/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/lo/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/lt/priv.properties b/lt/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/lt/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/lv/priv.dtd b/lv/priv.dtd
deleted file mode 100644
index 7fdfb5a..0000000
--- a/lv/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Ģenerē privāto atslēgu">
-<!ENTITY privDialog.done "Gatavs">
\ No newline at end of file
diff --git a/lv/priv.properties b/lv/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/lv/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/mg/priv.properties b/mg/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/mg/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/mi/priv.properties b/mi/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/mi/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/mk/priv.properties b/mk/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/mk/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ml/priv.properties b/ml/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ml/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/mn/priv.properties b/mn/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/mn/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/mr/priv.properties b/mr/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/mr/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ms_MY/priv.properties b/ms_MY/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ms_MY/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/mt/priv.properties b/mt/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/mt/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/my/priv.properties b/my/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/my/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/nah/priv.properties b/nah/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/nah/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/nap/priv.properties b/nap/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/nap/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/nb/priv.dtd b/nb/priv.dtd
deleted file mode 100644
index 09b9708..0000000
--- a/nb/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Oppretter privat nøkkel">
-<!ENTITY privDialog.done "Ferdig">
\ No newline at end of file
diff --git a/nb/priv.properties b/nb/priv.properties
new file mode 100644
index 0000000..e2b3fcf
--- /dev/null
+++ b/nb/priv.properties
@@ -0,0 +1 @@
+priv.account=Oppretter privat nøkkel for %S (%S) ...
diff --git a/nds/priv.properties b/nds/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/nds/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ne/priv.properties b/ne/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ne/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/nl/priv.dtd b/nl/priv.dtd
deleted file mode 100644
index 821b963..0000000
--- a/nl/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Bezig met aanmaken van privésleutel">
-<!ENTITY privDialog.done "Klaar">
\ No newline at end of file
diff --git a/nl/priv.properties b/nl/priv.properties
new file mode 100644
index 0000000..32c911b
--- /dev/null
+++ b/nl/priv.properties
@@ -0,0 +1 @@
+priv.account=Bezig met aanmaken van privésleutel voor %S (%S)...
diff --git a/nl_BE/priv.properties b/nl_BE/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/nl_BE/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/nn/priv.properties b/nn/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/nn/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/nso/priv.properties b/nso/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/nso/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/oc/priv.properties b/oc/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/oc/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/or/priv.properties b/or/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/or/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/pa/priv.properties b/pa/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/pa/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/pap/priv.properties b/pap/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/pap/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/pl/priv.dtd b/pl/priv.dtd
deleted file mode 100644
index 4ada415..0000000
--- a/pl/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Trwa generowanie prywatnego klucza">
-<!ENTITY privDialog.done "Gotowe">
\ No newline at end of file
diff --git a/pl/priv.properties b/pl/priv.properties
new file mode 100644
index 0000000..af9673f
--- /dev/null
+++ b/pl/priv.properties
@@ -0,0 +1 @@
+priv.account=Trwa generowanie prywatnych kluczy dla %S (%S) ...
diff --git a/pms/priv.properties b/pms/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/pms/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ps/priv.properties b/ps/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ps/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/pt/priv.dtd b/pt/priv.dtd
deleted file mode 100644
index e86fd87..0000000
--- a/pt/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "Concluída">
\ No newline at end of file
diff --git a/pt/priv.properties b/pt/priv.properties
new file mode 100644
index 0000000..79a579e
--- /dev/null
+++ b/pt/priv.properties
@@ -0,0 +1 @@
+priv.account=A gerar a chave privada para %S (%S) ...
diff --git a/pt_BR/priv.dtd b/pt_BR/priv.dtd
deleted file mode 100644
index d581ea2..0000000
--- a/pt_BR/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Gerando chave privada">
-<!ENTITY privDialog.done "Pronto">
\ No newline at end of file
diff --git a/pt_BR/priv.properties b/pt_BR/priv.properties
new file mode 100644
index 0000000..df1f754
--- /dev/null
+++ b/pt_BR/priv.properties
@@ -0,0 +1 @@
+priv.account=Gerando chave privada para %S (%S)...
diff --git a/ro/priv.dtd b/ro/priv.dtd
deleted file mode 100644
index c1b44d3..0000000
--- a/ro/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Se generează cheie privată">
-<!ENTITY privDialog.done "Gata">
\ No newline at end of file
diff --git a/ro/priv.properties b/ro/priv.properties
new file mode 100644
index 0000000..05ecee9
--- /dev/null
+++ b/ro/priv.properties
@@ -0,0 +1 @@
+priv.account=Se generează cheia privată pentru %S (%S) ...
diff --git a/ru/priv.dtd b/ru/priv.dtd
deleted file mode 100644
index ba980a4..0000000
--- a/ru/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Генерация закрытого ключа">
-<!ENTITY privDialog.done "Готово">
\ No newline at end of file
diff --git a/ru/priv.properties b/ru/priv.properties
new file mode 100644
index 0000000..f5364ab
--- /dev/null
+++ b/ru/priv.properties
@@ -0,0 +1 @@
+priv.account=Генерирую личный ключ для %S (%S) ...
diff --git a/ru(a)petr1708/priv.properties b/ru(a)petr1708/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ru(a)petr1708/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sa/priv.dtd b/sa/priv.dtd
deleted file mode 100644
index 7007979..0000000
--- a/sa/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/sa/priv.properties b/sa/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sa/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/scn/priv.properties b/scn/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/scn/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sco/priv.properties b/sco/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sco/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/si/priv.properties b/si/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/si/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/si_LK/priv.properties b/si_LK/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/si_LK/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sk/priv.properties b/sk/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sk/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sk_SK/priv.properties b/sk_SK/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sk_SK/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sl/priv.properties b/sl/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sl/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sl_SI/priv.properties b/sl_SI/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sl_SI/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sn/priv.properties b/sn/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sn/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/so/priv.properties b/so/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/so/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/son/priv.properties b/son/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/son/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sq/priv.properties b/sq/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sq/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sr/priv.properties b/sr/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sr/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sr(a)latin/priv.properties b/sr(a)latin/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sr(a)latin/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/st/priv.properties b/st/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/st/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/su/priv.properties b/su/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/su/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sv/priv.properties b/sv/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sv/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/sw/priv.properties b/sw/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/sw/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/szl/priv.properties b/szl/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/szl/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ta/priv.properties b/ta/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ta/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/te/priv.properties b/te/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/te/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/te_IN/priv.properties b/te_IN/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/te_IN/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/tg/priv.properties b/tg/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/tg/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/th/priv.properties b/th/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/th/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ti/priv.properties b/ti/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ti/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/tk/priv.properties b/tk/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/tk/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/tl_PH/priv.properties b/tl_PH/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/tl_PH/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/tr/priv.dtd b/tr/priv.dtd
deleted file mode 100644
index d7f481b..0000000
--- a/tr/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Özel anahtar oluşturuluyor">
-<!ENTITY privDialog.done "Bitti">
\ No newline at end of file
diff --git a/tr/priv.properties b/tr/priv.properties
new file mode 100644
index 0000000..2001b89
--- /dev/null
+++ b/tr/priv.properties
@@ -0,0 +1 @@
+priv.account=%S (%S) için özel anahtar oluşturuluyor ...
diff --git a/ug(a)Arab/priv.properties b/ug(a)Arab/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ug(a)Arab/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/uk/priv.properties b/uk/priv.properties
new file mode 100644
index 0000000..619504f
--- /dev/null
+++ b/uk/priv.properties
@@ -0,0 +1 @@
+priv.account=Згенерувати приватний ключ для %S (%S) ...
diff --git a/ur/priv.properties b/ur/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ur/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ur_PK/priv.properties b/ur_PK/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ur_PK/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/uz/priv.properties b/uz/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/uz/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/ve/priv.properties b/ve/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/ve/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/vi/priv.properties b/vi/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/vi/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/wa/priv.properties b/wa/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/wa/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/wo/priv.properties b/wo/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/wo/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/yo/priv.properties b/yo/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/yo/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/zh_CN/priv.dtd b/zh_CN/priv.dtd
deleted file mode 100644
index bf3127c..0000000
--- a/zh_CN/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "生成隐私密钥">
-<!ENTITY privDialog.done "完成">
\ No newline at end of file
diff --git a/zh_CN/priv.properties b/zh_CN/priv.properties
new file mode 100644
index 0000000..6d6e401
--- /dev/null
+++ b/zh_CN/priv.properties
@@ -0,0 +1 @@
+priv.account=正在生成 %S (%S) 的隐私密钥...
diff --git a/zh_HK/priv.properties b/zh_HK/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/zh_HK/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/zh_TW/priv.dtd b/zh_TW/priv.dtd
deleted file mode 100644
index cba66f7..0000000
--- a/zh_TW/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "完成">
\ No newline at end of file
diff --git a/zh_TW/priv.properties b/zh_TW/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/zh_TW/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/zu/priv.properties b/zu/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/zu/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
1
0

[translation/tor-messenger-privproperties_completed] pulling translations from transifex
by translation@torproject.org 24 Jul '15
by translation@torproject.org 24 Jul '15
24 Jul '15
commit de11729202e43bc06ad3b89790bb2cfc37c2c608
Author: Translation commit bot <translation(a)torproject.org>
Date: Fri Jul 24 19:49:53 2015 +0000
pulling translations from transifex
---
ar/priv.dtd | 2 --
ar/priv.properties | 1 +
de/priv.dtd | 2 --
de/priv.properties | 1 +
en/priv.properties | 1 +
en_GB/priv.dtd | 2 --
en_GB/priv.properties | 1 +
es/priv.dtd | 2 --
es/priv.properties | 1 +
es_CO/priv.dtd | 2 --
fa/priv.dtd | 2 --
fa/priv.properties | 1 +
fr/priv.dtd | 2 --
fr/priv.properties | 1 +
fr_CA/priv.dtd | 2 --
fr_CA/priv.properties | 1 +
hr_HR/priv.dtd | 2 --
hu/priv.dtd | 2 --
hu/priv.properties | 1 +
id/priv.dtd | 2 --
id/priv.properties | 1 +
it/priv.dtd | 2 --
it/priv.properties | 1 +
lv/priv.dtd | 2 --
nb/priv.dtd | 2 --
nb/priv.properties | 1 +
nl/priv.dtd | 2 --
nl/priv.properties | 1 +
pl/priv.dtd | 2 --
pl/priv.properties | 1 +
pt/priv.properties | 1 +
pt_BR/priv.dtd | 2 --
pt_BR/priv.properties | 1 +
ro/priv.dtd | 2 --
ro/priv.properties | 1 +
ru/priv.dtd | 2 --
ru/priv.properties | 1 +
tr/priv.dtd | 2 --
tr/priv.properties | 1 +
uk/priv.properties | 1 +
zh_CN/priv.dtd | 2 --
zh_CN/priv.properties | 1 +
42 files changed, 21 insertions(+), 42 deletions(-)
diff --git a/ar/priv.dtd b/ar/priv.dtd
deleted file mode 100644
index bea09bf..0000000
--- a/ar/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "جاري توليد المفتاح الخاص">
-<!ENTITY privDialog.done "تم">
\ No newline at end of file
diff --git a/ar/priv.properties b/ar/priv.properties
new file mode 100644
index 0000000..c1e33b0
--- /dev/null
+++ b/ar/priv.properties
@@ -0,0 +1 @@
+priv.account=جاري توليد المفتاح الخاص بـ%S (%S) ...
diff --git a/de/priv.dtd b/de/priv.dtd
deleted file mode 100644
index b9fb53f..0000000
--- a/de/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Privater Schlüssel wird erzeugt">
-<!ENTITY privDialog.done "Fertig">
\ No newline at end of file
diff --git a/de/priv.properties b/de/priv.properties
new file mode 100644
index 0000000..2f82255
--- /dev/null
+++ b/de/priv.properties
@@ -0,0 +1 @@
+priv.account=Privater Schlüssel für %S (%S) wird erzeugt ...
diff --git a/en/priv.properties b/en/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/en/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/en_GB/priv.dtd b/en_GB/priv.dtd
deleted file mode 100644
index 7007979..0000000
--- a/en_GB/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generating private key">
-<!ENTITY privDialog.done "Done">
\ No newline at end of file
diff --git a/en_GB/priv.properties b/en_GB/priv.properties
new file mode 100644
index 0000000..98177ad
--- /dev/null
+++ b/en_GB/priv.properties
@@ -0,0 +1 @@
+priv.account=Generating private key for %S (%S) ...
diff --git a/es/priv.dtd b/es/priv.dtd
deleted file mode 100644
index a79e92f..0000000
--- a/es/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generando clave privada">
-<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/es/priv.properties b/es/priv.properties
new file mode 100644
index 0000000..db39744
--- /dev/null
+++ b/es/priv.properties
@@ -0,0 +1 @@
+priv.account=Generando clave privada para %S (%S) ...
diff --git a/es_CO/priv.dtd b/es_CO/priv.dtd
deleted file mode 100644
index f90048c..0000000
--- a/es_CO/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generar una llave privada">
-<!ENTITY privDialog.done "Hecho">
\ No newline at end of file
diff --git a/fa/priv.dtd b/fa/priv.dtd
deleted file mode 100644
index f78e91e..0000000
--- a/fa/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "تولید کلید خصوصی">
-<!ENTITY privDialog.done "انجام شد">
\ No newline at end of file
diff --git a/fa/priv.properties b/fa/priv.properties
new file mode 100644
index 0000000..3265bab
--- /dev/null
+++ b/fa/priv.properties
@@ -0,0 +1 @@
+priv.account=تولید کلید خصوصی برای %S (%S) ...
diff --git a/fr/priv.dtd b/fr/priv.dtd
deleted file mode 100644
index 59634c3..0000000
--- a/fr/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Génération de la clé privée">
-<!ENTITY privDialog.done "Terminé">
\ No newline at end of file
diff --git a/fr/priv.properties b/fr/priv.properties
new file mode 100644
index 0000000..ac633c7
--- /dev/null
+++ b/fr/priv.properties
@@ -0,0 +1 @@
+priv.account=Génération d'une clé privée pour %S (%S) ...
diff --git a/fr_CA/priv.dtd b/fr_CA/priv.dtd
deleted file mode 100644
index 6caaf75..0000000
--- a/fr_CA/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Création de la clef privée">
-<!ENTITY privDialog.done "Fait">
\ No newline at end of file
diff --git a/fr_CA/priv.properties b/fr_CA/priv.properties
new file mode 100644
index 0000000..26e1a4f
--- /dev/null
+++ b/fr_CA/priv.properties
@@ -0,0 +1 @@
+priv.account=Création de la clef privée pour %S (%S)...
diff --git a/hr_HR/priv.dtd b/hr_HR/priv.dtd
deleted file mode 100644
index 6c4d395..0000000
--- a/hr_HR/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generiram privatni ključ">
-<!ENTITY privDialog.done "Gotovo">
\ No newline at end of file
diff --git a/hu/priv.dtd b/hu/priv.dtd
deleted file mode 100644
index 1178e17..0000000
--- a/hu/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Privát kulcs generálása">
-<!ENTITY privDialog.done "Kész">
\ No newline at end of file
diff --git a/hu/priv.properties b/hu/priv.properties
new file mode 100644
index 0000000..538b27c
--- /dev/null
+++ b/hu/priv.properties
@@ -0,0 +1 @@
+priv.account=Privát kulcs generálása ehhez: %S (%S) ...
diff --git a/id/priv.dtd b/id/priv.dtd
deleted file mode 100644
index 922d5d8..0000000
--- a/id/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Membuat kunci privat">
-<!ENTITY privDialog.done "Selesai">
\ No newline at end of file
diff --git a/id/priv.properties b/id/priv.properties
new file mode 100644
index 0000000..a4ad9fc
--- /dev/null
+++ b/id/priv.properties
@@ -0,0 +1 @@
+priv.account=Membuat kunci privat untuk %S (%S) ...
diff --git a/it/priv.dtd b/it/priv.dtd
deleted file mode 100644
index e0f86af..0000000
--- a/it/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Generazione chiave privata">
-<!ENTITY privDialog.done "Fatto">
\ No newline at end of file
diff --git a/it/priv.properties b/it/priv.properties
new file mode 100644
index 0000000..79d75fa
--- /dev/null
+++ b/it/priv.properties
@@ -0,0 +1 @@
+priv.account=Generazione della chiave privata per %S (%S)...
diff --git a/lv/priv.dtd b/lv/priv.dtd
deleted file mode 100644
index 7fdfb5a..0000000
--- a/lv/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Ģenerē privāto atslēgu">
-<!ENTITY privDialog.done "Gatavs">
\ No newline at end of file
diff --git a/nb/priv.dtd b/nb/priv.dtd
deleted file mode 100644
index 09b9708..0000000
--- a/nb/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Oppretter privat nøkkel">
-<!ENTITY privDialog.done "Ferdig">
\ No newline at end of file
diff --git a/nb/priv.properties b/nb/priv.properties
new file mode 100644
index 0000000..e2b3fcf
--- /dev/null
+++ b/nb/priv.properties
@@ -0,0 +1 @@
+priv.account=Oppretter privat nøkkel for %S (%S) ...
diff --git a/nl/priv.dtd b/nl/priv.dtd
deleted file mode 100644
index 821b963..0000000
--- a/nl/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Bezig met aanmaken van privésleutel">
-<!ENTITY privDialog.done "Klaar">
\ No newline at end of file
diff --git a/nl/priv.properties b/nl/priv.properties
new file mode 100644
index 0000000..32c911b
--- /dev/null
+++ b/nl/priv.properties
@@ -0,0 +1 @@
+priv.account=Bezig met aanmaken van privésleutel voor %S (%S)...
diff --git a/pl/priv.dtd b/pl/priv.dtd
deleted file mode 100644
index 4ada415..0000000
--- a/pl/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Trwa generowanie prywatnego klucza">
-<!ENTITY privDialog.done "Gotowe">
\ No newline at end of file
diff --git a/pl/priv.properties b/pl/priv.properties
new file mode 100644
index 0000000..af9673f
--- /dev/null
+++ b/pl/priv.properties
@@ -0,0 +1 @@
+priv.account=Trwa generowanie prywatnych kluczy dla %S (%S) ...
diff --git a/pt/priv.properties b/pt/priv.properties
new file mode 100644
index 0000000..79a579e
--- /dev/null
+++ b/pt/priv.properties
@@ -0,0 +1 @@
+priv.account=A gerar a chave privada para %S (%S) ...
diff --git a/pt_BR/priv.dtd b/pt_BR/priv.dtd
deleted file mode 100644
index d581ea2..0000000
--- a/pt_BR/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Gerando chave privada">
-<!ENTITY privDialog.done "Pronto">
\ No newline at end of file
diff --git a/pt_BR/priv.properties b/pt_BR/priv.properties
new file mode 100644
index 0000000..df1f754
--- /dev/null
+++ b/pt_BR/priv.properties
@@ -0,0 +1 @@
+priv.account=Gerando chave privada para %S (%S)...
diff --git a/ro/priv.dtd b/ro/priv.dtd
deleted file mode 100644
index c1b44d3..0000000
--- a/ro/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Se generează cheie privată">
-<!ENTITY privDialog.done "Gata">
\ No newline at end of file
diff --git a/ro/priv.properties b/ro/priv.properties
new file mode 100644
index 0000000..05ecee9
--- /dev/null
+++ b/ro/priv.properties
@@ -0,0 +1 @@
+priv.account=Se generează cheia privată pentru %S (%S) ...
diff --git a/ru/priv.dtd b/ru/priv.dtd
deleted file mode 100644
index ba980a4..0000000
--- a/ru/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Генерация закрытого ключа">
-<!ENTITY privDialog.done "Готово">
\ No newline at end of file
diff --git a/ru/priv.properties b/ru/priv.properties
new file mode 100644
index 0000000..f5364ab
--- /dev/null
+++ b/ru/priv.properties
@@ -0,0 +1 @@
+priv.account=Генерирую личный ключ для %S (%S) ...
diff --git a/tr/priv.dtd b/tr/priv.dtd
deleted file mode 100644
index d7f481b..0000000
--- a/tr/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "Özel anahtar oluşturuluyor">
-<!ENTITY privDialog.done "Bitti">
\ No newline at end of file
diff --git a/tr/priv.properties b/tr/priv.properties
new file mode 100644
index 0000000..2001b89
--- /dev/null
+++ b/tr/priv.properties
@@ -0,0 +1 @@
+priv.account=%S (%S) için özel anahtar oluşturuluyor ...
diff --git a/uk/priv.properties b/uk/priv.properties
new file mode 100644
index 0000000..619504f
--- /dev/null
+++ b/uk/priv.properties
@@ -0,0 +1 @@
+priv.account=Згенерувати приватний ключ для %S (%S) ...
diff --git a/zh_CN/priv.dtd b/zh_CN/priv.dtd
deleted file mode 100644
index bf3127c..0000000
--- a/zh_CN/priv.dtd
+++ /dev/null
@@ -1,2 +0,0 @@
-<!ENTITY privDialog.title "生成隐私密钥">
-<!ENTITY privDialog.done "完成">
\ No newline at end of file
diff --git a/zh_CN/priv.properties b/zh_CN/priv.properties
new file mode 100644
index 0000000..6d6e401
--- /dev/null
+++ b/zh_CN/priv.properties
@@ -0,0 +1 @@
+priv.account=正在生成 %S (%S) 的隐私密钥...
1
0