tor-commits
Threads by month
- ----- 2025 -----
- 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
May 2014
- 25 participants
- 1732 discussions

[flashproxy/master] fix out-of-source builds and `make distcheck`
by infinity0@torproject.org 19 May '14
by infinity0@torproject.org 19 May '14
19 May '14
commit 8a73911ed82454de0c77c2479eb865c4dee8b3d2
Author: Ximin Luo <infinity0(a)torproject.org>
Date: Mon May 19 14:50:50 2014 +0100
fix out-of-source builds and `make distcheck`
---
facilitator/Makefile.am | 6 ++++--
mkman.sh | 9 +++++----
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/facilitator/Makefile.am b/facilitator/Makefile.am
index e16ea37..c4d8617 100644
--- a/facilitator/Makefile.am
+++ b/facilitator/Makefile.am
@@ -46,12 +46,14 @@ subst_vars = sed -e 's,[@]cgibindir[@],$(cgibindir),g'
# our own targets
doc/%.1: % mkman.sh mkman.inc Makefile
+# mkdir needed for out-of-source build
+ $(MKDIR_P) $$(dirname "$@")
{ $(PYENV) $(PYTHON) "$<" --help; } \
- | { $(PYENV) ./mkman.sh "$<" $(VERSION) > "$@"; }
+ | { $(PYENV) $(srcdir)/mkman.sh "$<" $(VERSION) > "$@"; }
examples/fp-facilitator.conf: examples/fp-facilitator.conf.in Makefile
# mkdir needed for out-of-source build
- mkdir -p $$(dirname "$@")
+ $(MKDIR_P) $$(dirname "$@")
$(subst_vars) "$<" > "$@"
pylint: $(dist_bin_SCRIPTS)
diff --git a/mkman.sh b/mkman.sh
index cd4ecff..2532194 100755
--- a/mkman.sh
+++ b/mkman.sh
@@ -43,6 +43,7 @@ fi
prog="$1"
ver="$2"
name="${3:-$(get_description "$1")}"
+progname="$(basename "$prog")"
# Prepare a temporary executable file that just dumps its own contents.
trap 'rm -rf .tmp.$$' EXIT INT TERM
@@ -51,11 +52,11 @@ mkdir -p ".tmp.$$"
{
echo "$shebang"
cat
-} > ".tmp.$$/$prog"
-test $(size ".tmp.$$/$prog") -gt $((${#shebang} + 1)) || { echo >&2 "no input received; abort"; exit 1; }
-chmod +x ".tmp.$$/$prog"
+} > ".tmp.$$/$progname"
+test $(size ".tmp.$$/$progname") -gt $((${#shebang} + 1)) || { echo >&2 "no input received; abort"; exit 1; }
+chmod +x ".tmp.$$/$progname"
-help2man ".tmp.$$/$prog" --help-option="-q" \
+help2man ".tmp.$$/$progname" --help-option="-q" \
--name="$name" --version-string="$ver" \
--no-info --include "$(dirname "$0")/mkman.inc" \
| help2man_fixup
1
0

[flashproxy/master] install secret file directly with the right perms, and move examples back to docdir
by infinity0@torproject.org 19 May '14
by infinity0@torproject.org 19 May '14
19 May '14
commit 6c505e856dfdd5c0398b1012cd6a309b38b94ccc
Author: Ximin Luo <infinity0(a)torproject.org>
Date: Mon May 19 14:46:06 2014 +0100
install secret file directly with the right perms, and move examples back to docdir
---
facilitator/Makefile.am | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/facilitator/Makefile.am b/facilitator/Makefile.am
index 268fec4..e16ea37 100644
--- a/facilitator/Makefile.am
+++ b/facilitator/Makefile.am
@@ -7,7 +7,7 @@ cgibindir = @cgibindir@
# unfortunately sysvinit does not support having initscripts in /usr/local/etc
# yet, so we have to hard code a path here. :(
initscriptdir = /etc/init.d
-exampledir = $(pkgdatadir)/examples
+exampledir = $(docdir)/examples
appenginedir = $(pkgdatadir)/appengine
pkgconfdir = $(sysconfdir)/flashproxy
appengineconfdir = $(pkgconfdir)/reg-appspot
@@ -57,6 +57,12 @@ examples/fp-facilitator.conf: examples/fp-facilitator.conf.in Makefile
pylint: $(dist_bin_SCRIPTS)
pylint -E $^
+install-data-local:
+ $(INSTALL_DATA) -m 600 -t $(DESTDIR)$(pkgconfdir) $(srcdir)/examples/reg-email.pass
+
+uninstall-local:
+ rm $(DESTDIR)$(pkgconfdir)/reg-email.pass
+
# The {pre,post}-{install,remove} targets are just given as reference, and
# ought to be separate scripts as part of your distro's installation process.
# They are intentionally not linked to the install target since they require
@@ -107,12 +113,9 @@ install-secrets:
install -m 600 /dev/null ${pkgconfdir}/reg-daemon.key && \
openssl genrsa 2048 | tee ${pkgconfdir}/reg-daemon.key | \
openssl rsa -pubout > ${pkgconfdir}/reg-daemon.pub; }
- test -f ${pkgconfdir}/reg-email.pass || { \
- install -m 600 /dev/null ${pkgconfdir}/reg-email.pass && \
- cat ${exampledir}/reg-email.pass > ${pkgconfdir}/reg-email.pass; }
remove-secrets:
- for i in reg-daemon.key reg-daemon.pub reg-email.pass; do \
+ for i in reg-daemon.key reg-daemon.pub; do \
rm -f ${pkgconfdir}/$$i; \
done
1
0

19 May '14
commit f9c3c67c4817d2e3c2894dc0463ebf760836b137
Author: Ximin Luo <infinity0(a)torproject.org>
Date: Mon May 19 14:09:20 2014 +0100
update to new pt-websocket-server name
---
obfs-flash-server.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/obfs-flash-server.go b/obfs-flash-server.go
index b56270d..1a5c9b5 100644
--- a/obfs-flash-server.go
+++ b/obfs-flash-server.go
@@ -32,7 +32,7 @@ var handlerChan = make(chan int)
func usage() {
fmt.Printf("Usage: %s [OPTIONS]\n", os.Args[0])
- fmt.Printf("Chains websocket-server and obfsproxy transports. websocket-server and\n")
+ fmt.Printf("Chains websocket and obfsproxy server transports. pt-websocket-server and\n")
fmt.Printf("obfsproxy must be in PATH.\n")
fmt.Printf("\n")
fmt.Printf(" -h, --help show this help.\n")
1
0

19 May '14
commit d0c01a321fe8453a426d736f303fd75c774241f2
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon May 19 12:45:03 2014 +0000
Update translations for bridgedb
---
hu/LC_MESSAGES/bridgedb.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hu/LC_MESSAGES/bridgedb.po b/hu/LC_MESSAGES/bridgedb.po
index 5d9d34b..a9f024b 100644
--- a/hu/LC_MESSAGES/bridgedb.po
+++ b/hu/LC_MESSAGES/bridgedb.po
@@ -11,7 +11,7 @@ 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-05-16 18:39+0000\n"
-"PO-Revision-Date: 2014-05-19 12:13+0000\n"
+"PO-Revision-Date: 2014-05-19 12:22+0000\n"
"Last-Translator: Gergő Felde <taiurin(a)gmail.com>\n"
"Language-Team: Hungarian (http://www.transifex.com/projects/p/torproject/language/hu/)\n"
"MIME-Version: 1.0\n"
1
0

19 May '14
commit 3f9a6e06e18c4d7f3ebf3c733807d8c48685decb
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon May 19 12:15:03 2014 +0000
Update translations for bridgedb
---
hu/LC_MESSAGES/bridgedb.po | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/hu/LC_MESSAGES/bridgedb.po b/hu/LC_MESSAGES/bridgedb.po
index f570188..5d9d34b 100644
--- a/hu/LC_MESSAGES/bridgedb.po
+++ b/hu/LC_MESSAGES/bridgedb.po
@@ -3,6 +3,7 @@
# This file is distributed under the same license as the BridgeDB project.
#
# Translators:
+# Gergő Felde <taiurin(a)gmail.com>, 2014
# vargaviktor <viktor.varga(a)gmail.com>, 2013
# vargaviktor <viktor.varga(a)gmail.com>, 2011
msgid ""
@@ -10,8 +11,8 @@ 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-05-16 18:39+0000\n"
-"PO-Revision-Date: 2014-05-17 14:36+0000\n"
-"Last-Translator: runasand <runa.sandvik(a)gmail.com>\n"
+"PO-Revision-Date: 2014-05-19 12:13+0000\n"
+"Last-Translator: Gergő Felde <taiurin(a)gmail.com>\n"
"Language-Team: Hungarian (http://www.transifex.com/projects/p/torproject/language/hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -36,7 +37,7 @@ msgstr ""
#. "TBB"
#: lib/bridgedb/HTTPServer.py:124
msgid "Sorry! Something went wrong with your request."
-msgstr ""
+msgstr "Elnézést! Valami balul sült el a kérésed közben."
#: lib/bridgedb/strings.py:18
msgid "[This is an automated message; please do not reply.]"
@@ -44,7 +45,7 @@ msgstr "[Ez egy automata levél, kérjük ne válaszoljon.]"
#: lib/bridgedb/strings.py:20
msgid "Here are your bridges:"
-msgstr ""
+msgstr "Itt vannak a hídjaid:"
#: lib/bridgedb/strings.py:22
#, python-format
@@ -60,25 +61,25 @@ msgstr ""
#: lib/bridgedb/strings.py:27
msgid "Welcome to BridgeDB!"
-msgstr ""
+msgstr "Üdvözöl a BridgeDB!"
#. TRANSLATORS: Please DO NOT translate the words "transport" or "TYPE".
#: lib/bridgedb/strings.py:29
msgid "Currently supported transport TYPEs:"
-msgstr ""
+msgstr "Jelenleg támogatott átviteli típusok: "
#: lib/bridgedb/strings.py:30
#, python-format
msgid "Hey, %s!"
-msgstr ""
+msgstr "Hé, %s!"
#: lib/bridgedb/strings.py:31
msgid "Hello, friend!"
-msgstr ""
+msgstr "Hello!"
#: lib/bridgedb/strings.py:32 lib/bridgedb/templates/base.html:100
msgid "Public Keys"
-msgstr ""
+msgstr "Nyilvános kulcsok"
#. TRANSLATORS: This string will end up saying something like:
#. "This email was generated with rainbows, unicorns, and sparkles
1
0
commit 7735064af5a60d99f041d168d04fbda44a495760
Author: Ximin Luo <infinity0(a)torproject.org>
Date: Mon May 19 10:16:58 2014 +0100
bump facilitator version
---
facilitator/configure.ac | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/facilitator/configure.ac b/facilitator/configure.ac
index 32fbc1f..b875365 100644
--- a/facilitator/configure.ac
+++ b/facilitator/configure.ac
@@ -1,5 +1,5 @@
AC_PREREQ([2.68])
-AC_INIT([flashproxy-facilitator], [1.5])
+AC_INIT([flashproxy-facilitator], [1.6])
AM_INIT_AUTOMAKE([-Wall foreign])
AC_ARG_VAR(fpfacilitatoruser, [the user/group for the facilitator to run as])
1
0

[websocket/master] update instances of "websocket-server" embedded in documentation and metadata
by infinity0@torproject.org 19 May '14
by infinity0@torproject.org 19 May '14
19 May '14
commit f75ce00346237321622a3959997c707a1eaaf5ad
Author: Ximin Luo <infinity0(a)torproject.org>
Date: Sun May 18 14:09:27 2014 +0100
update instances of "websocket-server" embedded in documentation and metadata
---
.gitignore | 4 ++--
README | 2 +-
pt-websocket-server/pt-websocket-server.go | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/.gitignore b/.gitignore
index 1fee725..1e915e0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-/websocket-client
-/websocket-server
+/pt-websocket-client/pt-websocket-client
+/pt-websocket-server/pt-websocket-server
diff --git a/README b/README
index 718dd67..f2844eb 100644
--- a/README
+++ b/README
@@ -27,4 +27,4 @@ Add configuration like the following to the relay's torrc. You can
change the --port option; make sure that port is open in the firewall.
ExtORPort 6669
- ServerTransportPlugin websocket exec /usr/local/bin/websocket-server --port 9901
+ ServerTransportPlugin websocket exec /usr/local/bin/pt-websocket-server --port 9901
diff --git a/pt-websocket-server/pt-websocket-server.go b/pt-websocket-server/pt-websocket-server.go
index 4120df8..c393ebc 100644
--- a/pt-websocket-server/pt-websocket-server.go
+++ b/pt-websocket-server/pt-websocket-server.go
@@ -2,7 +2,7 @@
//
// Usage in torrc:
// ExtORPort 6669
-// ServerTransportPlugin websocket exec ./websocket-server --port 9901
+// ServerTransportPlugin websocket exec ./pt-websocket-server --port 9901
package main
import (
1
0

[websocket/master] disambiguate binary names to avoid potential name clashes
by infinity0@torproject.org 19 May '14
by infinity0@torproject.org 19 May '14
19 May '14
commit c4ef06f097354214460d45207a0297eec79d3bbe
Author: Ximin Luo <infinity0(a)torproject.org>
Date: Sun May 18 13:47:26 2014 +0100
disambiguate binary names to avoid potential name clashes
---
Makefile | 22 +-
pt-websocket-client/pt-websocket-client.go | 263 ++++++++++++++++++++++++
pt-websocket-server/pt-websocket-server.go | 299 ++++++++++++++++++++++++++++
websocket-client/websocket-client.go | 263 ------------------------
websocket-server/websocket-server.go | 299 ----------------------------
5 files changed, 573 insertions(+), 573 deletions(-)
diff --git a/Makefile b/Makefile
index b723c86..4882798 100644
--- a/Makefile
+++ b/Makefile
@@ -9,26 +9,26 @@ GOBUILDFLAGS =
# apt-get install gccgo-multilib
# GOBUILDFLAGS = -compiler gccgo -gccgoflags "-O3 -m32 -static-libgo"
-all: websocket-server/websocket-server
+all: pt-websocket-server/pt-websocket-server
-websocket-server/websocket-server: websocket-server/*.go websocket/*.go
- cd websocket-server && go build $(GOBUILDFLAGS)
+pt-websocket-server/pt-websocket-server: pt-websocket-server/*.go websocket/*.go
+ cd pt-websocket-server && go build $(GOBUILDFLAGS)
-websocket-client/websocket-client: websocket-client/*.go
- cd websocket-client && go build $(GOBUILDFLAGS)
+pt-websocket-client/pt-websocket-client: pt-websocket-client/*.go
+ cd pt-websocket-client && go build $(GOBUILDFLAGS)
-doc/websocket-server.1: websocket-server/websocket-server
+doc/pt-websocket-server.1: pt-websocket-server/pt-websocket-server
help2man --no-info --name "WebSocket server pluggable transport" --version-string "$(VERSION)" -o "$@" "$<"
-install: websocket-server/websocket-server
+install: pt-websocket-server/pt-websocket-server
mkdir -p "$(DESTDIR)$(BINDIR)"
- cp -f websocket-server/websocket-server "$(DESTDIR)$(BINDIR)"
+ cp -f "$<" "$(DESTDIR)$(BINDIR)"
clean:
- rm -f websocket-server/websocket-server websocket-client/websocket-client
- rm -f doc/websocket-server.1
+ rm -f pt-websocket-server/pt-websocket-server pt-websocket-client/pt-websocket-client
+ rm -f doc/pt-websocket-server.1
fmt:
- go fmt ./websocket-server ./websocket-client ./websocket
+ go fmt ./pt-websocket-server ./pt-websocket-client ./websocket
.PHONY: all install clean fmt
diff --git a/pt-websocket-client/pt-websocket-client.go b/pt-websocket-client/pt-websocket-client.go
new file mode 100644
index 0000000..fe38c9d
--- /dev/null
+++ b/pt-websocket-client/pt-websocket-client.go
@@ -0,0 +1,263 @@
+// Tor websocket client transport plugin.
+//
+// Usage in torrc:
+// UseBridges 1
+// Bridge websocket X.X.X.X:YYYY
+// ClientTransportPlugin websocket exec ./websocket-client
+package main
+
+import (
+ "code.google.com/p/go.net/websocket"
+ "flag"
+ "fmt"
+ "io"
+ "net"
+ "net/url"
+ "os"
+ "os/signal"
+ "sync"
+ "syscall"
+ "time"
+)
+
+import "git.torproject.org/pluggable-transports/goptlib.git"
+
+var ptInfo pt.ClientInfo
+
+const ptMethodName = "websocket"
+const bufSiz = 1500
+
+var logFile = os.Stderr
+
+// When a connection handler starts, +1 is written to this channel; when it
+// ends, -1 is written.
+var handlerChan = make(chan int)
+
+var logMutex sync.Mutex
+
+func usage() {
+ fmt.Printf("Usage: %s [OPTIONS]\n", os.Args[0])
+ fmt.Printf("WebSocket client pluggable transport for Tor.\n")
+ fmt.Printf("Works only as a managed proxy.\n")
+ fmt.Printf("\n")
+ fmt.Printf(" -h, --help show this help.\n")
+ fmt.Printf(" --log FILE log messages to FILE (default stderr).\n")
+ fmt.Printf(" --socks ADDR listen for SOCKS on ADDR.\n")
+}
+
+func log(format string, v ...interface{}) {
+ dateStr := time.Now().Format("2006-01-02 15:04:05")
+ logMutex.Lock()
+ defer logMutex.Unlock()
+ msg := fmt.Sprintf(format, v...)
+ fmt.Fprintf(logFile, "%s %s\n", dateStr, msg)
+}
+
+func proxy(local *net.TCPConn, ws *websocket.Conn) {
+ var wg sync.WaitGroup
+
+ wg.Add(2)
+
+ // Local-to-WebSocket read loop.
+ go func() {
+ buf := make([]byte, bufSiz)
+ var err error
+ for {
+ n, er := local.Read(buf[:])
+ if n > 0 {
+ ew := websocket.Message.Send(ws, buf[:n])
+ if ew != nil {
+ err = ew
+ break
+ }
+ }
+ if er != nil {
+ err = er
+ break
+ }
+ }
+ if err != nil && err != io.EOF {
+ log("%s", err)
+ }
+ local.CloseRead()
+ ws.Close()
+
+ wg.Done()
+ }()
+
+ // WebSocket-to-local read loop.
+ go func() {
+ var buf []byte
+ var err error
+ for {
+ er := websocket.Message.Receive(ws, &buf)
+ if er != nil {
+ err = er
+ break
+ }
+ n, ew := local.Write(buf)
+ if ew != nil {
+ err = ew
+ break
+ }
+ if n != len(buf) {
+ err = io.ErrShortWrite
+ break
+ }
+ }
+ if err != nil && err != io.EOF {
+ log("%s", err)
+ }
+ local.CloseWrite()
+ ws.Close()
+
+ wg.Done()
+ }()
+
+ wg.Wait()
+}
+
+func handleConnection(conn *pt.SocksConn) error {
+ defer conn.Close()
+
+ handlerChan <- 1
+ defer func() {
+ handlerChan <- -1
+ }()
+
+ var ws *websocket.Conn
+
+ log("SOCKS request for %s", conn.Req.Target)
+ destAddr, err := net.ResolveTCPAddr("tcp", conn.Req.Target)
+ if err != nil {
+ conn.Reject()
+ return err
+ }
+ wsUrl := url.URL{Scheme: "ws", Host: conn.Req.Target}
+ ws, err = websocket.Dial(wsUrl.String(), "", wsUrl.String())
+ if err != nil {
+ err = conn.Reject()
+ return err
+ }
+ log("WebSocket connection to %s", ws.Config().Location.String())
+ defer ws.Close()
+ err = conn.Grant(destAddr)
+ if err != nil {
+ return err
+ }
+
+ proxy(conn.Conn.(*net.TCPConn), ws)
+
+ return nil
+}
+
+func socksAcceptLoop(ln *pt.SocksListener) error {
+ defer ln.Close()
+ for {
+ socks, err := ln.AcceptSocks()
+ if err != nil {
+ if e, ok := err.(*net.OpError); ok && !e.Temporary() {
+ return err
+ }
+ continue
+ }
+ go func() {
+ err := handleConnection(socks)
+ if err != nil {
+ log("SOCKS from %s: %s", socks.RemoteAddr(), err)
+ }
+ }()
+ }
+ return nil
+}
+
+func startListener(addrStr string) (*pt.SocksListener, error) {
+ ln, err := pt.ListenSocks("tcp", addrStr)
+ if err != nil {
+ return nil, err
+ }
+ go func() {
+ err := socksAcceptLoop(ln)
+ if err != nil {
+ log("accept: %s", err)
+ }
+ }()
+ return ln, nil
+}
+
+func main() {
+ var logFilename string
+ var socksAddrStr string
+ var err error
+
+ flag.Usage = usage
+ flag.StringVar(&logFilename, "log", "", "log file to write to")
+ flag.StringVar(&socksAddrStr, "socks", "127.0.0.1:0", "address on which to listen for SOCKS connections")
+ flag.Parse()
+
+ if logFilename != "" {
+ f, err := os.OpenFile(logFilename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Can't open log file %q: %s.\n", logFilename, err.Error())
+ os.Exit(1)
+ }
+ logFile = f
+ }
+
+ log("starting")
+ ptInfo, err = pt.ClientSetup([]string{ptMethodName})
+ if err != nil {
+ log("error in setup: %s", err)
+ os.Exit(1)
+ }
+
+ listeners := make([]net.Listener, 0)
+ for _, methodName := range ptInfo.MethodNames {
+ switch methodName {
+ case ptMethodName:
+ ln, err := startListener(socksAddrStr)
+ if err != nil {
+ pt.CmethodError(ptMethodName, err.Error())
+ break
+ }
+ pt.Cmethod(ptMethodName, ln.Version(), ln.Addr())
+ log("listening on %s", ln.Addr().String())
+ listeners = append(listeners, ln)
+ default:
+ pt.CmethodError(methodName, "no such method")
+ }
+ }
+ pt.CmethodsDone()
+
+ var numHandlers int = 0
+ var sig os.Signal
+ sigChan := make(chan os.Signal, 1)
+ signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
+
+ // wait for first signal
+ sig = nil
+ for sig == nil {
+ select {
+ case n := <-handlerChan:
+ numHandlers += n
+ case sig = <-sigChan:
+ }
+ }
+ for _, ln := range listeners {
+ ln.Close()
+ }
+
+ if sig == syscall.SIGTERM {
+ return
+ }
+
+ // wait for second signal or no more handlers
+ sig = nil
+ for sig == nil && numHandlers != 0 {
+ select {
+ case n := <-handlerChan:
+ numHandlers += n
+ case sig = <-sigChan:
+ }
+ }
+}
diff --git a/pt-websocket-server/pt-websocket-server.go b/pt-websocket-server/pt-websocket-server.go
new file mode 100644
index 0000000..4120df8
--- /dev/null
+++ b/pt-websocket-server/pt-websocket-server.go
@@ -0,0 +1,299 @@
+// Tor websocket server transport plugin.
+//
+// Usage in torrc:
+// ExtORPort 6669
+// ServerTransportPlugin websocket exec ./websocket-server --port 9901
+package main
+
+import (
+ "encoding/base64"
+ "errors"
+ "flag"
+ "fmt"
+ "io"
+ "net"
+ "net/http"
+ "os"
+ "os/signal"
+ "sync"
+ "syscall"
+ "time"
+)
+
+import "../websocket"
+
+import "git.torproject.org/pluggable-transports/goptlib.git"
+
+const ptMethodName = "websocket"
+const requestTimeout = 10 * time.Second
+
+// "4/3+1" accounts for possible base64 encoding.
+const maxMessageSize = 64*1024*4/3 + 1
+
+var logFile = os.Stderr
+
+var ptInfo pt.ServerInfo
+
+// When a connection handler starts, +1 is written to this channel; when it
+// ends, -1 is written.
+var handlerChan = make(chan int)
+
+func usage() {
+ fmt.Printf("Usage: %s [OPTIONS]\n", os.Args[0])
+ fmt.Printf("WebSocket server pluggable transport for Tor.\n")
+ fmt.Printf("Works only as a managed proxy.\n")
+ fmt.Printf("\n")
+ fmt.Printf(" -h, --help show this help.\n")
+ fmt.Printf(" --log FILE log messages to FILE (default stderr).\n")
+ fmt.Printf(" --port PORT listen on PORT (overrides Tor's requested port).\n")
+}
+
+var logMutex sync.Mutex
+
+func log(format string, v ...interface{}) {
+ dateStr := time.Now().Format("2006-01-02 15:04:05")
+ logMutex.Lock()
+ defer logMutex.Unlock()
+ msg := fmt.Sprintf(format, v...)
+ fmt.Fprintf(logFile, "%s %s\n", dateStr, msg)
+}
+
+// An abstraction that makes an underlying WebSocket connection look like an
+// io.ReadWriteCloser. It internally takes care of things like base64 encoding
+// and decoding.
+type webSocketConn struct {
+ Ws *websocket.WebSocket
+ Base64 bool
+ messageBuf []byte
+}
+
+// Implements io.Reader.
+func (conn *webSocketConn) Read(b []byte) (n int, err error) {
+ for len(conn.messageBuf) == 0 {
+ var m websocket.Message
+ m, err = conn.Ws.ReadMessage()
+ if err != nil {
+ return
+ }
+ if m.Opcode == 8 {
+ err = io.EOF
+ return
+ }
+ if conn.Base64 {
+ if m.Opcode != 1 {
+ err = errors.New(fmt.Sprintf("got non-text opcode %d with the base64 subprotocol", m.Opcode))
+ return
+ }
+ conn.messageBuf = make([]byte, base64.StdEncoding.DecodedLen(len(m.Payload)))
+ var num int
+ num, err = base64.StdEncoding.Decode(conn.messageBuf, m.Payload)
+ if err != nil {
+ return
+ }
+ conn.messageBuf = conn.messageBuf[:num]
+ } else {
+ if m.Opcode != 2 {
+ err = errors.New(fmt.Sprintf("got non-binary opcode %d with no subprotocol", m.Opcode))
+ return
+ }
+ conn.messageBuf = m.Payload
+ }
+ }
+
+ n = copy(b, conn.messageBuf)
+ conn.messageBuf = conn.messageBuf[n:]
+
+ return
+}
+
+// Implements io.Writer.
+func (conn *webSocketConn) Write(b []byte) (n int, err error) {
+ if conn.Base64 {
+ buf := make([]byte, base64.StdEncoding.EncodedLen(len(b)))
+ base64.StdEncoding.Encode(buf, b)
+ err = conn.Ws.WriteMessage(1, buf)
+ if err != nil {
+ return
+ }
+ n = len(b)
+ } else {
+ err = conn.Ws.WriteMessage(2, b)
+ n = len(b)
+ }
+ return
+}
+
+// Implements io.Closer.
+func (conn *webSocketConn) Close() error {
+ // Ignore any error in trying to write a Close frame.
+ _ = conn.Ws.WriteFrame(8, nil)
+ return conn.Ws.Conn.Close()
+}
+
+// Create a new webSocketConn.
+func newWebSocketConn(ws *websocket.WebSocket) webSocketConn {
+ var conn webSocketConn
+ conn.Ws = ws
+ conn.Base64 = (ws.Subprotocol == "base64")
+ return conn
+}
+
+// Copy from WebSocket to socket and vice versa.
+func proxy(local *net.TCPConn, conn *webSocketConn) {
+ var wg sync.WaitGroup
+ wg.Add(2)
+
+ go func() {
+ _, err := io.Copy(conn, local)
+ if err != nil {
+ log("error copying ORPort to WebSocket")
+ }
+ local.CloseRead()
+ conn.Close()
+ wg.Done()
+ }()
+ go func() {
+ _, err := io.Copy(local, conn)
+ if err != nil {
+ log("error copying WebSocket to ORPort")
+ }
+ local.CloseWrite()
+ conn.Close()
+ wg.Done()
+ }()
+
+ wg.Wait()
+}
+
+func webSocketHandler(ws *websocket.WebSocket) {
+ // Undo timeouts on HTTP request handling.
+ ws.Conn.SetDeadline(time.Time{})
+ conn := newWebSocketConn(ws)
+ defer conn.Close()
+
+ handlerChan <- 1
+ defer func() {
+ handlerChan <- -1
+ }()
+
+ or, err := pt.DialOr(&ptInfo, ws.Conn.RemoteAddr().String(), ptMethodName)
+ if err != nil {
+ log("Failed to connect to ORPort: " + err.Error())
+ return
+ }
+ defer or.Close()
+
+ proxy(or, &conn)
+}
+
+func startListener(addr *net.TCPAddr) (*net.TCPListener, error) {
+ ln, err := net.ListenTCP("tcp", addr)
+ if err != nil {
+ return nil, err
+ }
+ go func() {
+ defer ln.Close()
+ var config websocket.Config
+ config.Subprotocols = []string{"base64"}
+ config.MaxMessageSize = maxMessageSize
+ s := &http.Server{
+ Handler: config.Handler(webSocketHandler),
+ ReadTimeout: requestTimeout,
+ }
+ err = s.Serve(ln)
+ if err != nil {
+ log("http.Serve: " + err.Error())
+ }
+ }()
+ return ln, nil
+}
+
+func main() {
+ var logFilename string
+ var port int
+
+ flag.Usage = usage
+ flag.StringVar(&logFilename, "log", "", "log file to write to")
+ flag.IntVar(&port, "port", 0, "port to listen on if unspecified by Tor")
+ flag.Parse()
+
+ if logFilename != "" {
+ f, err := os.OpenFile(logFilename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Can't open log file %q: %s.\n", logFilename, err.Error())
+ os.Exit(1)
+ }
+ logFile = f
+ }
+
+ log("starting")
+ var err error
+ ptInfo, err = pt.ServerSetup([]string{ptMethodName})
+ if err != nil {
+ log("error in setup: %s", err)
+ os.Exit(1)
+ }
+
+ listeners := make([]*net.TCPListener, 0)
+ for _, bindaddr := range ptInfo.Bindaddrs {
+ // Override tor's requested port (which is 0 if this transport
+ // has not been run before) with the one requested by the --port
+ // option.
+ if port != 0 {
+ bindaddr.Addr.Port = port
+ }
+
+ switch bindaddr.MethodName {
+ case ptMethodName:
+ ln, err := startListener(bindaddr.Addr)
+ if err != nil {
+ pt.SmethodError(bindaddr.MethodName, err.Error())
+ break
+ }
+ pt.Smethod(bindaddr.MethodName, ln.Addr())
+ log("listening on %s", ln.Addr().String())
+ listeners = append(listeners, ln)
+ default:
+ pt.SmethodError(bindaddr.MethodName, "no such method")
+ }
+ }
+ pt.SmethodsDone()
+
+ var numHandlers int = 0
+ var sig os.Signal
+ sigChan := make(chan os.Signal, 1)
+ signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
+
+ // wait for first signal
+ sig = nil
+ for sig == nil {
+ select {
+ case n := <-handlerChan:
+ numHandlers += n
+ case sig = <-sigChan:
+ }
+ }
+ log("Got first signal %q with %d running handlers.", sig, numHandlers)
+ for _, ln := range listeners {
+ ln.Close()
+ }
+
+ if sig == syscall.SIGTERM {
+ log("Caught signal %q, exiting.", sig)
+ return
+ }
+
+ // wait for second signal or no more handlers
+ sig = nil
+ for sig == nil && numHandlers != 0 {
+ select {
+ case n := <-handlerChan:
+ numHandlers += n
+ log("%d remaining handlers.", numHandlers)
+ case sig = <-sigChan:
+ }
+ }
+ if sig != nil {
+ log("Got second signal %q with %d running handlers.", sig, numHandlers)
+ }
+}
diff --git a/websocket-client/websocket-client.go b/websocket-client/websocket-client.go
deleted file mode 100644
index fe38c9d..0000000
--- a/websocket-client/websocket-client.go
+++ /dev/null
@@ -1,263 +0,0 @@
-// Tor websocket client transport plugin.
-//
-// Usage in torrc:
-// UseBridges 1
-// Bridge websocket X.X.X.X:YYYY
-// ClientTransportPlugin websocket exec ./websocket-client
-package main
-
-import (
- "code.google.com/p/go.net/websocket"
- "flag"
- "fmt"
- "io"
- "net"
- "net/url"
- "os"
- "os/signal"
- "sync"
- "syscall"
- "time"
-)
-
-import "git.torproject.org/pluggable-transports/goptlib.git"
-
-var ptInfo pt.ClientInfo
-
-const ptMethodName = "websocket"
-const bufSiz = 1500
-
-var logFile = os.Stderr
-
-// When a connection handler starts, +1 is written to this channel; when it
-// ends, -1 is written.
-var handlerChan = make(chan int)
-
-var logMutex sync.Mutex
-
-func usage() {
- fmt.Printf("Usage: %s [OPTIONS]\n", os.Args[0])
- fmt.Printf("WebSocket client pluggable transport for Tor.\n")
- fmt.Printf("Works only as a managed proxy.\n")
- fmt.Printf("\n")
- fmt.Printf(" -h, --help show this help.\n")
- fmt.Printf(" --log FILE log messages to FILE (default stderr).\n")
- fmt.Printf(" --socks ADDR listen for SOCKS on ADDR.\n")
-}
-
-func log(format string, v ...interface{}) {
- dateStr := time.Now().Format("2006-01-02 15:04:05")
- logMutex.Lock()
- defer logMutex.Unlock()
- msg := fmt.Sprintf(format, v...)
- fmt.Fprintf(logFile, "%s %s\n", dateStr, msg)
-}
-
-func proxy(local *net.TCPConn, ws *websocket.Conn) {
- var wg sync.WaitGroup
-
- wg.Add(2)
-
- // Local-to-WebSocket read loop.
- go func() {
- buf := make([]byte, bufSiz)
- var err error
- for {
- n, er := local.Read(buf[:])
- if n > 0 {
- ew := websocket.Message.Send(ws, buf[:n])
- if ew != nil {
- err = ew
- break
- }
- }
- if er != nil {
- err = er
- break
- }
- }
- if err != nil && err != io.EOF {
- log("%s", err)
- }
- local.CloseRead()
- ws.Close()
-
- wg.Done()
- }()
-
- // WebSocket-to-local read loop.
- go func() {
- var buf []byte
- var err error
- for {
- er := websocket.Message.Receive(ws, &buf)
- if er != nil {
- err = er
- break
- }
- n, ew := local.Write(buf)
- if ew != nil {
- err = ew
- break
- }
- if n != len(buf) {
- err = io.ErrShortWrite
- break
- }
- }
- if err != nil && err != io.EOF {
- log("%s", err)
- }
- local.CloseWrite()
- ws.Close()
-
- wg.Done()
- }()
-
- wg.Wait()
-}
-
-func handleConnection(conn *pt.SocksConn) error {
- defer conn.Close()
-
- handlerChan <- 1
- defer func() {
- handlerChan <- -1
- }()
-
- var ws *websocket.Conn
-
- log("SOCKS request for %s", conn.Req.Target)
- destAddr, err := net.ResolveTCPAddr("tcp", conn.Req.Target)
- if err != nil {
- conn.Reject()
- return err
- }
- wsUrl := url.URL{Scheme: "ws", Host: conn.Req.Target}
- ws, err = websocket.Dial(wsUrl.String(), "", wsUrl.String())
- if err != nil {
- err = conn.Reject()
- return err
- }
- log("WebSocket connection to %s", ws.Config().Location.String())
- defer ws.Close()
- err = conn.Grant(destAddr)
- if err != nil {
- return err
- }
-
- proxy(conn.Conn.(*net.TCPConn), ws)
-
- return nil
-}
-
-func socksAcceptLoop(ln *pt.SocksListener) error {
- defer ln.Close()
- for {
- socks, err := ln.AcceptSocks()
- if err != nil {
- if e, ok := err.(*net.OpError); ok && !e.Temporary() {
- return err
- }
- continue
- }
- go func() {
- err := handleConnection(socks)
- if err != nil {
- log("SOCKS from %s: %s", socks.RemoteAddr(), err)
- }
- }()
- }
- return nil
-}
-
-func startListener(addrStr string) (*pt.SocksListener, error) {
- ln, err := pt.ListenSocks("tcp", addrStr)
- if err != nil {
- return nil, err
- }
- go func() {
- err := socksAcceptLoop(ln)
- if err != nil {
- log("accept: %s", err)
- }
- }()
- return ln, nil
-}
-
-func main() {
- var logFilename string
- var socksAddrStr string
- var err error
-
- flag.Usage = usage
- flag.StringVar(&logFilename, "log", "", "log file to write to")
- flag.StringVar(&socksAddrStr, "socks", "127.0.0.1:0", "address on which to listen for SOCKS connections")
- flag.Parse()
-
- if logFilename != "" {
- f, err := os.OpenFile(logFilename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Can't open log file %q: %s.\n", logFilename, err.Error())
- os.Exit(1)
- }
- logFile = f
- }
-
- log("starting")
- ptInfo, err = pt.ClientSetup([]string{ptMethodName})
- if err != nil {
- log("error in setup: %s", err)
- os.Exit(1)
- }
-
- listeners := make([]net.Listener, 0)
- for _, methodName := range ptInfo.MethodNames {
- switch methodName {
- case ptMethodName:
- ln, err := startListener(socksAddrStr)
- if err != nil {
- pt.CmethodError(ptMethodName, err.Error())
- break
- }
- pt.Cmethod(ptMethodName, ln.Version(), ln.Addr())
- log("listening on %s", ln.Addr().String())
- listeners = append(listeners, ln)
- default:
- pt.CmethodError(methodName, "no such method")
- }
- }
- pt.CmethodsDone()
-
- var numHandlers int = 0
- var sig os.Signal
- sigChan := make(chan os.Signal, 1)
- signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
-
- // wait for first signal
- sig = nil
- for sig == nil {
- select {
- case n := <-handlerChan:
- numHandlers += n
- case sig = <-sigChan:
- }
- }
- for _, ln := range listeners {
- ln.Close()
- }
-
- if sig == syscall.SIGTERM {
- return
- }
-
- // wait for second signal or no more handlers
- sig = nil
- for sig == nil && numHandlers != 0 {
- select {
- case n := <-handlerChan:
- numHandlers += n
- case sig = <-sigChan:
- }
- }
-}
diff --git a/websocket-server/websocket-server.go b/websocket-server/websocket-server.go
deleted file mode 100644
index 4120df8..0000000
--- a/websocket-server/websocket-server.go
+++ /dev/null
@@ -1,299 +0,0 @@
-// Tor websocket server transport plugin.
-//
-// Usage in torrc:
-// ExtORPort 6669
-// ServerTransportPlugin websocket exec ./websocket-server --port 9901
-package main
-
-import (
- "encoding/base64"
- "errors"
- "flag"
- "fmt"
- "io"
- "net"
- "net/http"
- "os"
- "os/signal"
- "sync"
- "syscall"
- "time"
-)
-
-import "../websocket"
-
-import "git.torproject.org/pluggable-transports/goptlib.git"
-
-const ptMethodName = "websocket"
-const requestTimeout = 10 * time.Second
-
-// "4/3+1" accounts for possible base64 encoding.
-const maxMessageSize = 64*1024*4/3 + 1
-
-var logFile = os.Stderr
-
-var ptInfo pt.ServerInfo
-
-// When a connection handler starts, +1 is written to this channel; when it
-// ends, -1 is written.
-var handlerChan = make(chan int)
-
-func usage() {
- fmt.Printf("Usage: %s [OPTIONS]\n", os.Args[0])
- fmt.Printf("WebSocket server pluggable transport for Tor.\n")
- fmt.Printf("Works only as a managed proxy.\n")
- fmt.Printf("\n")
- fmt.Printf(" -h, --help show this help.\n")
- fmt.Printf(" --log FILE log messages to FILE (default stderr).\n")
- fmt.Printf(" --port PORT listen on PORT (overrides Tor's requested port).\n")
-}
-
-var logMutex sync.Mutex
-
-func log(format string, v ...interface{}) {
- dateStr := time.Now().Format("2006-01-02 15:04:05")
- logMutex.Lock()
- defer logMutex.Unlock()
- msg := fmt.Sprintf(format, v...)
- fmt.Fprintf(logFile, "%s %s\n", dateStr, msg)
-}
-
-// An abstraction that makes an underlying WebSocket connection look like an
-// io.ReadWriteCloser. It internally takes care of things like base64 encoding
-// and decoding.
-type webSocketConn struct {
- Ws *websocket.WebSocket
- Base64 bool
- messageBuf []byte
-}
-
-// Implements io.Reader.
-func (conn *webSocketConn) Read(b []byte) (n int, err error) {
- for len(conn.messageBuf) == 0 {
- var m websocket.Message
- m, err = conn.Ws.ReadMessage()
- if err != nil {
- return
- }
- if m.Opcode == 8 {
- err = io.EOF
- return
- }
- if conn.Base64 {
- if m.Opcode != 1 {
- err = errors.New(fmt.Sprintf("got non-text opcode %d with the base64 subprotocol", m.Opcode))
- return
- }
- conn.messageBuf = make([]byte, base64.StdEncoding.DecodedLen(len(m.Payload)))
- var num int
- num, err = base64.StdEncoding.Decode(conn.messageBuf, m.Payload)
- if err != nil {
- return
- }
- conn.messageBuf = conn.messageBuf[:num]
- } else {
- if m.Opcode != 2 {
- err = errors.New(fmt.Sprintf("got non-binary opcode %d with no subprotocol", m.Opcode))
- return
- }
- conn.messageBuf = m.Payload
- }
- }
-
- n = copy(b, conn.messageBuf)
- conn.messageBuf = conn.messageBuf[n:]
-
- return
-}
-
-// Implements io.Writer.
-func (conn *webSocketConn) Write(b []byte) (n int, err error) {
- if conn.Base64 {
- buf := make([]byte, base64.StdEncoding.EncodedLen(len(b)))
- base64.StdEncoding.Encode(buf, b)
- err = conn.Ws.WriteMessage(1, buf)
- if err != nil {
- return
- }
- n = len(b)
- } else {
- err = conn.Ws.WriteMessage(2, b)
- n = len(b)
- }
- return
-}
-
-// Implements io.Closer.
-func (conn *webSocketConn) Close() error {
- // Ignore any error in trying to write a Close frame.
- _ = conn.Ws.WriteFrame(8, nil)
- return conn.Ws.Conn.Close()
-}
-
-// Create a new webSocketConn.
-func newWebSocketConn(ws *websocket.WebSocket) webSocketConn {
- var conn webSocketConn
- conn.Ws = ws
- conn.Base64 = (ws.Subprotocol == "base64")
- return conn
-}
-
-// Copy from WebSocket to socket and vice versa.
-func proxy(local *net.TCPConn, conn *webSocketConn) {
- var wg sync.WaitGroup
- wg.Add(2)
-
- go func() {
- _, err := io.Copy(conn, local)
- if err != nil {
- log("error copying ORPort to WebSocket")
- }
- local.CloseRead()
- conn.Close()
- wg.Done()
- }()
- go func() {
- _, err := io.Copy(local, conn)
- if err != nil {
- log("error copying WebSocket to ORPort")
- }
- local.CloseWrite()
- conn.Close()
- wg.Done()
- }()
-
- wg.Wait()
-}
-
-func webSocketHandler(ws *websocket.WebSocket) {
- // Undo timeouts on HTTP request handling.
- ws.Conn.SetDeadline(time.Time{})
- conn := newWebSocketConn(ws)
- defer conn.Close()
-
- handlerChan <- 1
- defer func() {
- handlerChan <- -1
- }()
-
- or, err := pt.DialOr(&ptInfo, ws.Conn.RemoteAddr().String(), ptMethodName)
- if err != nil {
- log("Failed to connect to ORPort: " + err.Error())
- return
- }
- defer or.Close()
-
- proxy(or, &conn)
-}
-
-func startListener(addr *net.TCPAddr) (*net.TCPListener, error) {
- ln, err := net.ListenTCP("tcp", addr)
- if err != nil {
- return nil, err
- }
- go func() {
- defer ln.Close()
- var config websocket.Config
- config.Subprotocols = []string{"base64"}
- config.MaxMessageSize = maxMessageSize
- s := &http.Server{
- Handler: config.Handler(webSocketHandler),
- ReadTimeout: requestTimeout,
- }
- err = s.Serve(ln)
- if err != nil {
- log("http.Serve: " + err.Error())
- }
- }()
- return ln, nil
-}
-
-func main() {
- var logFilename string
- var port int
-
- flag.Usage = usage
- flag.StringVar(&logFilename, "log", "", "log file to write to")
- flag.IntVar(&port, "port", 0, "port to listen on if unspecified by Tor")
- flag.Parse()
-
- if logFilename != "" {
- f, err := os.OpenFile(logFilename, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
- if err != nil {
- fmt.Fprintf(os.Stderr, "Can't open log file %q: %s.\n", logFilename, err.Error())
- os.Exit(1)
- }
- logFile = f
- }
-
- log("starting")
- var err error
- ptInfo, err = pt.ServerSetup([]string{ptMethodName})
- if err != nil {
- log("error in setup: %s", err)
- os.Exit(1)
- }
-
- listeners := make([]*net.TCPListener, 0)
- for _, bindaddr := range ptInfo.Bindaddrs {
- // Override tor's requested port (which is 0 if this transport
- // has not been run before) with the one requested by the --port
- // option.
- if port != 0 {
- bindaddr.Addr.Port = port
- }
-
- switch bindaddr.MethodName {
- case ptMethodName:
- ln, err := startListener(bindaddr.Addr)
- if err != nil {
- pt.SmethodError(bindaddr.MethodName, err.Error())
- break
- }
- pt.Smethod(bindaddr.MethodName, ln.Addr())
- log("listening on %s", ln.Addr().String())
- listeners = append(listeners, ln)
- default:
- pt.SmethodError(bindaddr.MethodName, "no such method")
- }
- }
- pt.SmethodsDone()
-
- var numHandlers int = 0
- var sig os.Signal
- sigChan := make(chan os.Signal, 1)
- signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
-
- // wait for first signal
- sig = nil
- for sig == nil {
- select {
- case n := <-handlerChan:
- numHandlers += n
- case sig = <-sigChan:
- }
- }
- log("Got first signal %q with %d running handlers.", sig, numHandlers)
- for _, ln := range listeners {
- ln.Close()
- }
-
- if sig == syscall.SIGTERM {
- log("Caught signal %q, exiting.", sig)
- return
- }
-
- // wait for second signal or no more handlers
- sig = nil
- for sig == nil && numHandlers != 0 {
- select {
- case n := <-handlerChan:
- numHandlers += n
- log("%d remaining handlers.", numHandlers)
- case sig = <-sigChan:
- }
- }
- if sig != nil {
- log("Got second signal %q with %d running handlers.", sig, numHandlers)
- }
-}
1
0

[user-manual/master] Retrieve Tor Browser version and locales from its repository
by lunar@torproject.org 18 May '14
by lunar@torproject.org 18 May '14
18 May '14
commit 127b3eb9dd468031f6f2830ee22fd4559843c5b2
Author: Lunar <lunar(a)torproject.org>
Date: Sun May 18 21:20:14 2014 +0200
Retrieve Tor Browser version and locales from its repository
---
.gitignore | 6 +-
Makefile.am | 2 +-
configure.ac | 17 ++
es-ES/es-ES.po | 380 ++++++++++++++++++++++++++++++++++++++++++++
es/es.po | 380 --------------------------------------------
pt-PT/pt-PT.po | 380 ++++++++++++++++++++++++++++++++++++++++++++
pt_PT/pt_PT.po | 380 --------------------------------------------
tor-browser-version.txt.in | 2 +-
zh-CN/zh-CN.po | 380 ++++++++++++++++++++++++++++++++++++++++++++
zh_CN/zh_CN.po | 380 --------------------------------------------
10 files changed, 1162 insertions(+), 1145 deletions(-)
diff --git a/.gitignore b/.gitignore
index ba2dcf1..5bc9b24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,9 +10,9 @@
/[a-z][a-z]/*.mo
/[a-z][a-z]/*.stamp
/[a-z][a-z]/*.page
-/[a-z][a-z]_[A-Z][A-Z]/*.mo
-/[a-z][a-z]_[A-Z][A-Z]/*.stamp
-/[a-z][a-z]_[A-Z][A-Z]/*.page
+/[a-z][a-z]-[A-Z][A-Z]/*.mo
+/[a-z][a-z]-[A-Z][A-Z]/*.stamp
+/[a-z][a-z]-[A-Z][A-Z]/*.page
/media-symlinks.stamp
/Makefile
diff --git a/Makefile.am b/Makefile.am
index 6980dba..9f25f3d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -6,7 +6,7 @@ HELP_ID = tor-browser-user-manual
HELP_FILES = $(shell cd C && git ls-files '*.page')
HELP_MEDIA = $(shell cd C && git ls-files 'media')
HELP_PLATFORMS = windows macosx linux
-HELP_LINGUAS = ar de es fa fr it ko nl pl pt_PT ru tr vi zh_CN
+HELP_LINGUAS = @TOR_BROWSER_BUNDLE_LOCALES@
.PHONY: html
html: all media-symlinks.stamp
diff --git a/configure.ac b/configure.ac
index 705611d..ed8bbcf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,6 +4,23 @@ AC_INIT([tor-browser-user-manual],
AM_INIT_AUTOMAKE([foreign])
+AC_ARG_WITH(tor-browser-bundle,
+ AC_HELP_STRING([--with-tor-browser-bundle=PROGRAM],
+ [location of the clone of tor-browser-bundle.git]),
+ [tor_browser_bundle_dir=$withval])
+VERSIONS_PATH="${tor_browser_bundle_dir}/gitian/versions"
+if ! sh -n "$VERSIONS_PATH" 2>/dev/null; then
+ AC_MSG_ERROR([Please clone tor-browser-bundle.git and specify its location using --with-tor-browser-bundle])
+fi
+
+TOR_BROWSER_VERSION=$(. "$VERSIONS_PATH"; echo "$TORBROWSER_VERSION")
+if test "x$TOR_BROWSER_VERSION" = "x"; then
+ AC_MSG_ERROR([Couldn't determine Tor Browser version.])
+fi
+TOR_BROWSER_BUNDLE_LOCALES=$(. "$VERSIONS_PATH"; echo "$BUNDLE_LOCALES")
+
+AC_SUBST(TOR_BROWSER_BUNDLE_LOCALES)
+
YELP_HELP_INIT
AC_CONFIG_FILES([Makefile
diff --git a/es-ES/es-ES.po b/es-ES/es-ES.po
new file mode 100644
index 0000000..03e9cad
--- /dev/null
+++ b/es-ES/es-ES.po
@@ -0,0 +1,380 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2014-05-15 11:21+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL(a)li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/bridges.page:144(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-custom-bridges_en-US.png' md5='93365c2aa3fb4d627497e83f28a39b7e'"
+msgstr ""
+
+#: C/bridges.page:7(info/desc)
+msgid "What bridges are and how to use them."
+msgstr ""
+
+#: C/bridges.page:8(info/title)
+msgctxt "sort"
+msgid "05 Bridges"
+msgstr ""
+
+#: C/bridges.page:12(page/title)
+msgid "Bridges"
+msgstr ""
+
+#: C/bridges.page:14(page/p)
+msgid "Bridges are quiet gateways into the Tor Network. Like Tor relays, they are run by volunteers. Unlike relays, they are not listed publicly. Using bridges disguise the fact that one is using Tor."
+msgstr ""
+
+#: C/bridges.page:20(page/p)
+msgid "Currently there are five bridge types, or transports, available. More are being developed."
+msgstr ""
+
+#: C/bridges.page:27(td/p)
+msgid "ORPort"
+msgstr ""
+
+#: C/bridges.page:32(td/p)
+msgid "Requesting 'bridges' without specifying the bridge type, will return ORPort bridges, also called Vanilla bridges. ORPort bridges are NOT reliable for circumventing censorship or national firewalls. ORPort bridges can be useful as trusted entry points into the Tor network."
+msgstr ""
+
+#: C/bridges.page:42(td/p)
+msgid "obfs2"
+msgstr ""
+
+#: C/bridges.page:47(td/p)
+msgid "Censors have learned how to identify obfs2 bridges. This transport is being deprecated."
+msgstr ""
+
+#: C/bridges.page:55(td/p)
+msgid "obfs3"
+msgstr ""
+
+#: C/bridges.page:60(td/p)
+msgid "Obfsproxy disguises Tor traffic as random noise. obfs3 bridges work almost everywhere. A few obfs3 bridges have been blocked."
+msgstr ""
+
+#: C/bridges.page:68(td/p)
+msgid "Scramblesuit"
+msgstr ""
+
+#: C/bridges.page:73(td/p)
+msgid "Scramblesuit is an additional tool for the obfsproxy transport. Scramblesuit bridges are designed to be hard to identify and hard to block."
+msgstr ""
+
+#: C/bridges.page:82(td/p)
+msgid "FTE"
+msgstr ""
+
+#: C/bridges.page:87(td/p)
+msgid "Format-Transforming Encryption disguises Tor traffic as web (HTTP) traffic or other types of internet traffic. FTE bridges are effective, but in limited supply."
+msgstr ""
+
+#: C/bridges.page:96(page/p)
+msgid "(Note that flashproxy is a Pluggable Transport, but does not rely on bridges.)"
+msgstr ""
+
+#: C/bridges.page:100(page/p)
+msgid "There are four ways to get a bridge."
+msgstr ""
+
+#: C/bridges.page:106(item/p)
+msgid "Visit <link href=\"https://bridges.torproject.org/\">https://bridges.torproject.org/</link> and follow the instructions."
+msgstr ""
+
+#: C/bridges.page:111(item/p)
+msgid "Email bridges(a)bridges.torproject.org from a gmail or yahoo email address. Put <cmd>get bridges</cmd> in the body for ORPort bridges or <cmd>transport=obfs3</cmd> for obfs3 bridges."
+msgstr ""
+
+#: C/bridges.page:118(item/p)
+msgid "Politely ask a human at help(a)rt.torproject.org if you cannot access either of the first two methods."
+msgstr ""
+
+#: C/bridges.page:124(item/p)
+msgid "Install and configure a Tor instance to be bridge for yourself. The computer acting as a bridge must have uncensored internet access to the Tor network. A full installation guide can be found at <link href=\"https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en\">https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en</link>"
+msgstr ""
+
+#: C/bridges.page:133(page/p)
+msgid "Enter the bridge information you get from any of the above steps in Tor-launcher."
+msgstr ""
+
+#: C/bridges.page:138(page/p)
+msgid "Choose yes when asked if your Internet Service Provider blocks connections to the Tor network. Select 'Use custom bridges' and enter each bridge identifier on its own line."
+msgstr ""
+
+#: C/bridges.page:146(page/p)
+msgid "Click Connect. Using bridges slow down the connection. If the connection fails, the bridges you received may be down. Get more and try again."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:21(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-configure_en-US.png' md5='966f4bafcb829e59b2b84d08144d885e'"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:28(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-wizard_en-US.png' md5='21f80fc3f4e34359bfdc44684d7da09d'"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:36(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-provided-bridges_en-US.png' md5='70524dccb698a21bb1d20223461e3272'"
+msgstr ""
+
+#: C/circumvention.page:7(info/title)
+msgctxt "sort"
+msgid "04 Circumvention"
+msgstr ""
+
+#: C/circumvention.page:8(info/desc)
+msgid "What to do if the Tor network is blocked."
+msgstr ""
+
+#: C/circumvention.page:12(page/title)
+msgid "Circumvention"
+msgstr ""
+
+#: C/circumvention.page:14(page/p)
+msgid "Some firewalls can detect and block connections to Tor. The Tor Browser includes some circumvention tools for getting around blocking firewalls. These circumvention tools are called Pluggable Transports. To turn them on, click \"Configure\" in the Tor launcher window."
+msgstr ""
+
+#: C/circumvention.page:23(page/p)
+msgid "Select yes when asked if your internet service provider blocks connections to Tor.\""
+msgstr ""
+
+#: C/circumvention.page:30(page/p)
+msgid "Select \"Connect with provided bridges\". Tor Browser has three Pluggable Transports to choose from. If one fails to get you online, try selecting a different transport."
+msgstr ""
+
+#: C/circumvention.page:38(page/p)
+msgid "If you try all three transports, and none of them get you online, select \"Enter custom bridges\", and enter bridges manually. Read the <link xref=\"bridges\">Getting Bridges</link> section for instructions on getting custom bridges."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/how-tor-works.page:19(media)
+msgctxt "_"
+msgid "external ref='media/how-tor-works.png' md5='6fe4151a88b7a518466f0582e40ccc8c'"
+msgstr ""
+
+#: C/how-tor-works.page:6(info/title)
+msgctxt "sort"
+msgid "01 Tor"
+msgstr ""
+
+#: C/how-tor-works.page:7(info/desc)
+msgid "How Tor works."
+msgstr ""
+
+#: C/how-tor-works.page:11(page/title)
+msgid "Tor"
+msgstr ""
+
+#: C/how-tor-works.page:12(page/p)
+msgid "Tor is a network of virtual tunnels that allows you to improve your privacy and security on the Internet. Tor works by sending your traffic through three random servers (also known as <em>relays</em>) in the Tor network, before the traffic is sent out onto the public Internet"
+msgstr ""
+
+#: C/how-tor-works.page:20(page/p)
+msgid "The image above illustrates a user browsing to different websites over Tor. The green monitors represent relays in the Tor network, while the three keys represent the layers of encryption between the user and each relay."
+msgstr ""
+
+#: C/how-tor-works.page:26(page/p)
+msgid "Tor will anonymize the origin of your traffic, and it will encrypt everything between you and the Tor network. Tor will also encrypt your traffic inside the Tor network, but it cannot encrypt your traffic between the Tor network and its final destination."
+msgstr ""
+
+#: C/how-tor-works.page:32(page/p)
+msgid "If you are communicating sensitive information, for example when logging on to a website with a username and password, make sure that you are using HTTPS (e.g. <input><em>https</em>://torproject.org/</input>, not <input><em>http</em>://torproject.org/</input>)."
+msgstr ""
+
+#: C/index.page:6(page/title)
+msgid "Tor Browser Help"
+msgstr ""
+
+#: C/index.page:7(page/p)
+msgid "Version: UNKNOWN-dirty"
+msgstr ""
+
+#: C/known-issues.page:7(info/desc)
+msgid "A list of known issues."
+msgstr ""
+
+#: C/known-issues.page:8(info/title)
+msgctxt "sort"
+msgid "03 Known Issues"
+msgstr ""
+
+#: C/known-issues.page:12(page/title)
+msgid "Known Issues"
+msgstr ""
+
+#: C/known-issues.page:16(item/p)
+msgid "The following firewall software have been known to interfere with Tor and may need to be temporarily disabled:"
+msgstr ""
+
+#: C/known-issues.page:20(item/p)
+msgid "Webroot SecureAnywhere"
+msgstr ""
+
+#: C/known-issues.page:23(item/p)
+msgid "Kaspersky Internet Security 2012"
+msgstr ""
+
+#: C/known-issues.page:26(item/p)
+msgid "Sophos Antivirus for Mac"
+msgstr ""
+
+#: C/known-issues.page:29(item/p)
+msgid "Microsoft Security Essentials"
+msgstr ""
+
+#: C/known-issues.page:34(item/p)
+msgid "Videos that require Adobe Flash are unavailable. Flash is disabled for security reasons. Most YouTube videos can be played with HTML5 by visiting the video's \"Embed\" → \"Share\" link."
+msgstr ""
+
+#: C/known-issues.page:41(item/p)
+msgid "Tor can not use a bridge if a proxy is set."
+msgstr ""
+
+#: C/known-issues.page:46(item/p)
+msgid "The Tor Browser package is dated January 1, 2000 00:00:00 UTC. This is to ensure that each software build is exactly reproducible."
+msgstr ""
+
+#: C/known-issues.page:52(item/p)
+msgid "To run Tor Browser on Ubuntu, users need to execute a shell script. Open \"Files\" (Unity's explorer), open Preferences → Behavior Tab → Set \"Run executable text files when they are opened\" to \"Ask every time\", then OK. Tor Browser can also be started from the command line by running"
+msgstr ""
+
+#: C/known-issues.page:58(item/code)
+#, no-wrap
+msgid ""
+"\n"
+" ./start-tor-browser\n"
+" "
+msgstr ""
+
+#: C/known-issues.page:61(item/p)
+msgid "from inside the Tor Browser directory."
+msgstr ""
+
+#: C/known-issues.page:66(page/p)
+msgid "If you have an issue with Tor Browser that isn't on this list, feel free to email help(a)rt.torproject.org."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/troubleshooting.page:19(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-connect_en-US.png' md5='03118f523f4cbc7c001da1ddacc9e394'"
+msgstr ""
+
+#: C/troubleshooting.page:7(info/title)
+msgctxt "sort"
+msgid "02 Troubleshooting"
+msgstr ""
+
+#: C/troubleshooting.page:8(info/desc)
+msgid "What to do if Tor Browser doesn't work."
+msgstr ""
+
+#: C/troubleshooting.page:12(page/title)
+msgid "Troubleshooting"
+msgstr ""
+
+#: C/troubleshooting.page:14(page/p)
+msgid "The Tor Browser should get you online automatically after clicking the \"Connect\" button on the start up screen."
+msgstr ""
+
+#: C/troubleshooting.page:21(page/p)
+msgid "If it doesn't connect, there may be a simple fix. Try each of the following:"
+msgstr ""
+
+#: C/troubleshooting.page:27(item/p)
+msgid "Make sure another Tor Browser is not already running. If you're not sure if Tor Browser is running, restart your computer."
+msgstr ""
+
+#: C/troubleshooting.page:31(item/p)
+msgid "'Allow' Tor in your antivirus program."
+msgstr ""
+
+#: C/troubleshooting.page:34(item/p)
+msgid "Temporarily disable your firewall."
+msgstr ""
+
+#: C/troubleshooting.page:37(item/p)
+msgid "Delete Tor Browser and install it again. If updating, do not overwrite your previous Tor Browser files."
+msgstr ""
+
+#: C/troubleshooting.page:42(page/p)
+msgid "If you still can't connect, your internet service provider might be censoring connections to Tor. Follow the instructions in the <link xref=\"circumvention\">Circumvention</link> section."
+msgstr ""
+
+#: C/troubleshooting.page:48(page/p)
+msgid "If the above steps do not address your problem, email help(a)rt.torproject.org with your operating system, the details of your problem, and what you've already tried."
+msgstr ""
+
+#: C/uninstalling.page:7(info/desc)
+msgid "How to remove Tor Browser from your system."
+msgstr ""
+
+#: C/uninstalling.page:8(info/title)
+msgctxt "sort"
+msgid "06 Uninstalling"
+msgstr ""
+
+#: C/uninstalling.page:12(page/title)
+msgid "Uninstalling"
+msgstr ""
+
+#: C/uninstalling.page:14(page/p)
+msgid "The Tor Browser does not affect any of the existing software or settings on your computer. Uninstalling Tor Browser will not affect your system's software or settings either."
+msgstr ""
+
+#: C/uninstalling.page:20(page/p)
+msgid "Removing the Tor Browser from your system is simple:"
+msgstr ""
+
+#: C/uninstalling.page:26(item/p)
+msgid "Locate your Tor Browser folder. The default location is your Desktop."
+msgstr ""
+
+#: C/uninstalling.page:29(item/p)
+msgid "Delete the Tor Browser folder."
+msgstr ""
+
+#: C/uninstalling.page:32(item/p)
+msgid "Empty your Trash"
+msgstr ""
+
+#: C/uninstalling.page:36(page/p)
+msgid "Note that your operating system's standard \"Uninstall\" utility is not used."
+msgstr ""
+
diff --git a/es/es.po b/es/es.po
deleted file mode 100644
index 03e9cad..0000000
--- a/es/es.po
+++ /dev/null
@@ -1,380 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2014-05-15 11:21+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL(a)li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
-msgctxt "_"
-msgid "translator-credits"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/bridges.page:144(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-custom-bridges_en-US.png' md5='93365c2aa3fb4d627497e83f28a39b7e'"
-msgstr ""
-
-#: C/bridges.page:7(info/desc)
-msgid "What bridges are and how to use them."
-msgstr ""
-
-#: C/bridges.page:8(info/title)
-msgctxt "sort"
-msgid "05 Bridges"
-msgstr ""
-
-#: C/bridges.page:12(page/title)
-msgid "Bridges"
-msgstr ""
-
-#: C/bridges.page:14(page/p)
-msgid "Bridges are quiet gateways into the Tor Network. Like Tor relays, they are run by volunteers. Unlike relays, they are not listed publicly. Using bridges disguise the fact that one is using Tor."
-msgstr ""
-
-#: C/bridges.page:20(page/p)
-msgid "Currently there are five bridge types, or transports, available. More are being developed."
-msgstr ""
-
-#: C/bridges.page:27(td/p)
-msgid "ORPort"
-msgstr ""
-
-#: C/bridges.page:32(td/p)
-msgid "Requesting 'bridges' without specifying the bridge type, will return ORPort bridges, also called Vanilla bridges. ORPort bridges are NOT reliable for circumventing censorship or national firewalls. ORPort bridges can be useful as trusted entry points into the Tor network."
-msgstr ""
-
-#: C/bridges.page:42(td/p)
-msgid "obfs2"
-msgstr ""
-
-#: C/bridges.page:47(td/p)
-msgid "Censors have learned how to identify obfs2 bridges. This transport is being deprecated."
-msgstr ""
-
-#: C/bridges.page:55(td/p)
-msgid "obfs3"
-msgstr ""
-
-#: C/bridges.page:60(td/p)
-msgid "Obfsproxy disguises Tor traffic as random noise. obfs3 bridges work almost everywhere. A few obfs3 bridges have been blocked."
-msgstr ""
-
-#: C/bridges.page:68(td/p)
-msgid "Scramblesuit"
-msgstr ""
-
-#: C/bridges.page:73(td/p)
-msgid "Scramblesuit is an additional tool for the obfsproxy transport. Scramblesuit bridges are designed to be hard to identify and hard to block."
-msgstr ""
-
-#: C/bridges.page:82(td/p)
-msgid "FTE"
-msgstr ""
-
-#: C/bridges.page:87(td/p)
-msgid "Format-Transforming Encryption disguises Tor traffic as web (HTTP) traffic or other types of internet traffic. FTE bridges are effective, but in limited supply."
-msgstr ""
-
-#: C/bridges.page:96(page/p)
-msgid "(Note that flashproxy is a Pluggable Transport, but does not rely on bridges.)"
-msgstr ""
-
-#: C/bridges.page:100(page/p)
-msgid "There are four ways to get a bridge."
-msgstr ""
-
-#: C/bridges.page:106(item/p)
-msgid "Visit <link href=\"https://bridges.torproject.org/\">https://bridges.torproject.org/</link> and follow the instructions."
-msgstr ""
-
-#: C/bridges.page:111(item/p)
-msgid "Email bridges(a)bridges.torproject.org from a gmail or yahoo email address. Put <cmd>get bridges</cmd> in the body for ORPort bridges or <cmd>transport=obfs3</cmd> for obfs3 bridges."
-msgstr ""
-
-#: C/bridges.page:118(item/p)
-msgid "Politely ask a human at help(a)rt.torproject.org if you cannot access either of the first two methods."
-msgstr ""
-
-#: C/bridges.page:124(item/p)
-msgid "Install and configure a Tor instance to be bridge for yourself. The computer acting as a bridge must have uncensored internet access to the Tor network. A full installation guide can be found at <link href=\"https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en\">https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en</link>"
-msgstr ""
-
-#: C/bridges.page:133(page/p)
-msgid "Enter the bridge information you get from any of the above steps in Tor-launcher."
-msgstr ""
-
-#: C/bridges.page:138(page/p)
-msgid "Choose yes when asked if your Internet Service Provider blocks connections to the Tor network. Select 'Use custom bridges' and enter each bridge identifier on its own line."
-msgstr ""
-
-#: C/bridges.page:146(page/p)
-msgid "Click Connect. Using bridges slow down the connection. If the connection fails, the bridges you received may be down. Get more and try again."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:21(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-configure_en-US.png' md5='966f4bafcb829e59b2b84d08144d885e'"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:28(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-wizard_en-US.png' md5='21f80fc3f4e34359bfdc44684d7da09d'"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:36(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-provided-bridges_en-US.png' md5='70524dccb698a21bb1d20223461e3272'"
-msgstr ""
-
-#: C/circumvention.page:7(info/title)
-msgctxt "sort"
-msgid "04 Circumvention"
-msgstr ""
-
-#: C/circumvention.page:8(info/desc)
-msgid "What to do if the Tor network is blocked."
-msgstr ""
-
-#: C/circumvention.page:12(page/title)
-msgid "Circumvention"
-msgstr ""
-
-#: C/circumvention.page:14(page/p)
-msgid "Some firewalls can detect and block connections to Tor. The Tor Browser includes some circumvention tools for getting around blocking firewalls. These circumvention tools are called Pluggable Transports. To turn them on, click \"Configure\" in the Tor launcher window."
-msgstr ""
-
-#: C/circumvention.page:23(page/p)
-msgid "Select yes when asked if your internet service provider blocks connections to Tor.\""
-msgstr ""
-
-#: C/circumvention.page:30(page/p)
-msgid "Select \"Connect with provided bridges\". Tor Browser has three Pluggable Transports to choose from. If one fails to get you online, try selecting a different transport."
-msgstr ""
-
-#: C/circumvention.page:38(page/p)
-msgid "If you try all three transports, and none of them get you online, select \"Enter custom bridges\", and enter bridges manually. Read the <link xref=\"bridges\">Getting Bridges</link> section for instructions on getting custom bridges."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/how-tor-works.page:19(media)
-msgctxt "_"
-msgid "external ref='media/how-tor-works.png' md5='6fe4151a88b7a518466f0582e40ccc8c'"
-msgstr ""
-
-#: C/how-tor-works.page:6(info/title)
-msgctxt "sort"
-msgid "01 Tor"
-msgstr ""
-
-#: C/how-tor-works.page:7(info/desc)
-msgid "How Tor works."
-msgstr ""
-
-#: C/how-tor-works.page:11(page/title)
-msgid "Tor"
-msgstr ""
-
-#: C/how-tor-works.page:12(page/p)
-msgid "Tor is a network of virtual tunnels that allows you to improve your privacy and security on the Internet. Tor works by sending your traffic through three random servers (also known as <em>relays</em>) in the Tor network, before the traffic is sent out onto the public Internet"
-msgstr ""
-
-#: C/how-tor-works.page:20(page/p)
-msgid "The image above illustrates a user browsing to different websites over Tor. The green monitors represent relays in the Tor network, while the three keys represent the layers of encryption between the user and each relay."
-msgstr ""
-
-#: C/how-tor-works.page:26(page/p)
-msgid "Tor will anonymize the origin of your traffic, and it will encrypt everything between you and the Tor network. Tor will also encrypt your traffic inside the Tor network, but it cannot encrypt your traffic between the Tor network and its final destination."
-msgstr ""
-
-#: C/how-tor-works.page:32(page/p)
-msgid "If you are communicating sensitive information, for example when logging on to a website with a username and password, make sure that you are using HTTPS (e.g. <input><em>https</em>://torproject.org/</input>, not <input><em>http</em>://torproject.org/</input>)."
-msgstr ""
-
-#: C/index.page:6(page/title)
-msgid "Tor Browser Help"
-msgstr ""
-
-#: C/index.page:7(page/p)
-msgid "Version: UNKNOWN-dirty"
-msgstr ""
-
-#: C/known-issues.page:7(info/desc)
-msgid "A list of known issues."
-msgstr ""
-
-#: C/known-issues.page:8(info/title)
-msgctxt "sort"
-msgid "03 Known Issues"
-msgstr ""
-
-#: C/known-issues.page:12(page/title)
-msgid "Known Issues"
-msgstr ""
-
-#: C/known-issues.page:16(item/p)
-msgid "The following firewall software have been known to interfere with Tor and may need to be temporarily disabled:"
-msgstr ""
-
-#: C/known-issues.page:20(item/p)
-msgid "Webroot SecureAnywhere"
-msgstr ""
-
-#: C/known-issues.page:23(item/p)
-msgid "Kaspersky Internet Security 2012"
-msgstr ""
-
-#: C/known-issues.page:26(item/p)
-msgid "Sophos Antivirus for Mac"
-msgstr ""
-
-#: C/known-issues.page:29(item/p)
-msgid "Microsoft Security Essentials"
-msgstr ""
-
-#: C/known-issues.page:34(item/p)
-msgid "Videos that require Adobe Flash are unavailable. Flash is disabled for security reasons. Most YouTube videos can be played with HTML5 by visiting the video's \"Embed\" → \"Share\" link."
-msgstr ""
-
-#: C/known-issues.page:41(item/p)
-msgid "Tor can not use a bridge if a proxy is set."
-msgstr ""
-
-#: C/known-issues.page:46(item/p)
-msgid "The Tor Browser package is dated January 1, 2000 00:00:00 UTC. This is to ensure that each software build is exactly reproducible."
-msgstr ""
-
-#: C/known-issues.page:52(item/p)
-msgid "To run Tor Browser on Ubuntu, users need to execute a shell script. Open \"Files\" (Unity's explorer), open Preferences → Behavior Tab → Set \"Run executable text files when they are opened\" to \"Ask every time\", then OK. Tor Browser can also be started from the command line by running"
-msgstr ""
-
-#: C/known-issues.page:58(item/code)
-#, no-wrap
-msgid ""
-"\n"
-" ./start-tor-browser\n"
-" "
-msgstr ""
-
-#: C/known-issues.page:61(item/p)
-msgid "from inside the Tor Browser directory."
-msgstr ""
-
-#: C/known-issues.page:66(page/p)
-msgid "If you have an issue with Tor Browser that isn't on this list, feel free to email help(a)rt.torproject.org."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/troubleshooting.page:19(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-connect_en-US.png' md5='03118f523f4cbc7c001da1ddacc9e394'"
-msgstr ""
-
-#: C/troubleshooting.page:7(info/title)
-msgctxt "sort"
-msgid "02 Troubleshooting"
-msgstr ""
-
-#: C/troubleshooting.page:8(info/desc)
-msgid "What to do if Tor Browser doesn't work."
-msgstr ""
-
-#: C/troubleshooting.page:12(page/title)
-msgid "Troubleshooting"
-msgstr ""
-
-#: C/troubleshooting.page:14(page/p)
-msgid "The Tor Browser should get you online automatically after clicking the \"Connect\" button on the start up screen."
-msgstr ""
-
-#: C/troubleshooting.page:21(page/p)
-msgid "If it doesn't connect, there may be a simple fix. Try each of the following:"
-msgstr ""
-
-#: C/troubleshooting.page:27(item/p)
-msgid "Make sure another Tor Browser is not already running. If you're not sure if Tor Browser is running, restart your computer."
-msgstr ""
-
-#: C/troubleshooting.page:31(item/p)
-msgid "'Allow' Tor in your antivirus program."
-msgstr ""
-
-#: C/troubleshooting.page:34(item/p)
-msgid "Temporarily disable your firewall."
-msgstr ""
-
-#: C/troubleshooting.page:37(item/p)
-msgid "Delete Tor Browser and install it again. If updating, do not overwrite your previous Tor Browser files."
-msgstr ""
-
-#: C/troubleshooting.page:42(page/p)
-msgid "If you still can't connect, your internet service provider might be censoring connections to Tor. Follow the instructions in the <link xref=\"circumvention\">Circumvention</link> section."
-msgstr ""
-
-#: C/troubleshooting.page:48(page/p)
-msgid "If the above steps do not address your problem, email help(a)rt.torproject.org with your operating system, the details of your problem, and what you've already tried."
-msgstr ""
-
-#: C/uninstalling.page:7(info/desc)
-msgid "How to remove Tor Browser from your system."
-msgstr ""
-
-#: C/uninstalling.page:8(info/title)
-msgctxt "sort"
-msgid "06 Uninstalling"
-msgstr ""
-
-#: C/uninstalling.page:12(page/title)
-msgid "Uninstalling"
-msgstr ""
-
-#: C/uninstalling.page:14(page/p)
-msgid "The Tor Browser does not affect any of the existing software or settings on your computer. Uninstalling Tor Browser will not affect your system's software or settings either."
-msgstr ""
-
-#: C/uninstalling.page:20(page/p)
-msgid "Removing the Tor Browser from your system is simple:"
-msgstr ""
-
-#: C/uninstalling.page:26(item/p)
-msgid "Locate your Tor Browser folder. The default location is your Desktop."
-msgstr ""
-
-#: C/uninstalling.page:29(item/p)
-msgid "Delete the Tor Browser folder."
-msgstr ""
-
-#: C/uninstalling.page:32(item/p)
-msgid "Empty your Trash"
-msgstr ""
-
-#: C/uninstalling.page:36(page/p)
-msgid "Note that your operating system's standard \"Uninstall\" utility is not used."
-msgstr ""
-
diff --git a/pt-PT/pt-PT.po b/pt-PT/pt-PT.po
new file mode 100644
index 0000000..03e9cad
--- /dev/null
+++ b/pt-PT/pt-PT.po
@@ -0,0 +1,380 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2014-05-15 11:21+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL(a)li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/bridges.page:144(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-custom-bridges_en-US.png' md5='93365c2aa3fb4d627497e83f28a39b7e'"
+msgstr ""
+
+#: C/bridges.page:7(info/desc)
+msgid "What bridges are and how to use them."
+msgstr ""
+
+#: C/bridges.page:8(info/title)
+msgctxt "sort"
+msgid "05 Bridges"
+msgstr ""
+
+#: C/bridges.page:12(page/title)
+msgid "Bridges"
+msgstr ""
+
+#: C/bridges.page:14(page/p)
+msgid "Bridges are quiet gateways into the Tor Network. Like Tor relays, they are run by volunteers. Unlike relays, they are not listed publicly. Using bridges disguise the fact that one is using Tor."
+msgstr ""
+
+#: C/bridges.page:20(page/p)
+msgid "Currently there are five bridge types, or transports, available. More are being developed."
+msgstr ""
+
+#: C/bridges.page:27(td/p)
+msgid "ORPort"
+msgstr ""
+
+#: C/bridges.page:32(td/p)
+msgid "Requesting 'bridges' without specifying the bridge type, will return ORPort bridges, also called Vanilla bridges. ORPort bridges are NOT reliable for circumventing censorship or national firewalls. ORPort bridges can be useful as trusted entry points into the Tor network."
+msgstr ""
+
+#: C/bridges.page:42(td/p)
+msgid "obfs2"
+msgstr ""
+
+#: C/bridges.page:47(td/p)
+msgid "Censors have learned how to identify obfs2 bridges. This transport is being deprecated."
+msgstr ""
+
+#: C/bridges.page:55(td/p)
+msgid "obfs3"
+msgstr ""
+
+#: C/bridges.page:60(td/p)
+msgid "Obfsproxy disguises Tor traffic as random noise. obfs3 bridges work almost everywhere. A few obfs3 bridges have been blocked."
+msgstr ""
+
+#: C/bridges.page:68(td/p)
+msgid "Scramblesuit"
+msgstr ""
+
+#: C/bridges.page:73(td/p)
+msgid "Scramblesuit is an additional tool for the obfsproxy transport. Scramblesuit bridges are designed to be hard to identify and hard to block."
+msgstr ""
+
+#: C/bridges.page:82(td/p)
+msgid "FTE"
+msgstr ""
+
+#: C/bridges.page:87(td/p)
+msgid "Format-Transforming Encryption disguises Tor traffic as web (HTTP) traffic or other types of internet traffic. FTE bridges are effective, but in limited supply."
+msgstr ""
+
+#: C/bridges.page:96(page/p)
+msgid "(Note that flashproxy is a Pluggable Transport, but does not rely on bridges.)"
+msgstr ""
+
+#: C/bridges.page:100(page/p)
+msgid "There are four ways to get a bridge."
+msgstr ""
+
+#: C/bridges.page:106(item/p)
+msgid "Visit <link href=\"https://bridges.torproject.org/\">https://bridges.torproject.org/</link> and follow the instructions."
+msgstr ""
+
+#: C/bridges.page:111(item/p)
+msgid "Email bridges(a)bridges.torproject.org from a gmail or yahoo email address. Put <cmd>get bridges</cmd> in the body for ORPort bridges or <cmd>transport=obfs3</cmd> for obfs3 bridges."
+msgstr ""
+
+#: C/bridges.page:118(item/p)
+msgid "Politely ask a human at help(a)rt.torproject.org if you cannot access either of the first two methods."
+msgstr ""
+
+#: C/bridges.page:124(item/p)
+msgid "Install and configure a Tor instance to be bridge for yourself. The computer acting as a bridge must have uncensored internet access to the Tor network. A full installation guide can be found at <link href=\"https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en\">https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en</link>"
+msgstr ""
+
+#: C/bridges.page:133(page/p)
+msgid "Enter the bridge information you get from any of the above steps in Tor-launcher."
+msgstr ""
+
+#: C/bridges.page:138(page/p)
+msgid "Choose yes when asked if your Internet Service Provider blocks connections to the Tor network. Select 'Use custom bridges' and enter each bridge identifier on its own line."
+msgstr ""
+
+#: C/bridges.page:146(page/p)
+msgid "Click Connect. Using bridges slow down the connection. If the connection fails, the bridges you received may be down. Get more and try again."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:21(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-configure_en-US.png' md5='966f4bafcb829e59b2b84d08144d885e'"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:28(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-wizard_en-US.png' md5='21f80fc3f4e34359bfdc44684d7da09d'"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:36(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-provided-bridges_en-US.png' md5='70524dccb698a21bb1d20223461e3272'"
+msgstr ""
+
+#: C/circumvention.page:7(info/title)
+msgctxt "sort"
+msgid "04 Circumvention"
+msgstr ""
+
+#: C/circumvention.page:8(info/desc)
+msgid "What to do if the Tor network is blocked."
+msgstr ""
+
+#: C/circumvention.page:12(page/title)
+msgid "Circumvention"
+msgstr ""
+
+#: C/circumvention.page:14(page/p)
+msgid "Some firewalls can detect and block connections to Tor. The Tor Browser includes some circumvention tools for getting around blocking firewalls. These circumvention tools are called Pluggable Transports. To turn them on, click \"Configure\" in the Tor launcher window."
+msgstr ""
+
+#: C/circumvention.page:23(page/p)
+msgid "Select yes when asked if your internet service provider blocks connections to Tor.\""
+msgstr ""
+
+#: C/circumvention.page:30(page/p)
+msgid "Select \"Connect with provided bridges\". Tor Browser has three Pluggable Transports to choose from. If one fails to get you online, try selecting a different transport."
+msgstr ""
+
+#: C/circumvention.page:38(page/p)
+msgid "If you try all three transports, and none of them get you online, select \"Enter custom bridges\", and enter bridges manually. Read the <link xref=\"bridges\">Getting Bridges</link> section for instructions on getting custom bridges."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/how-tor-works.page:19(media)
+msgctxt "_"
+msgid "external ref='media/how-tor-works.png' md5='6fe4151a88b7a518466f0582e40ccc8c'"
+msgstr ""
+
+#: C/how-tor-works.page:6(info/title)
+msgctxt "sort"
+msgid "01 Tor"
+msgstr ""
+
+#: C/how-tor-works.page:7(info/desc)
+msgid "How Tor works."
+msgstr ""
+
+#: C/how-tor-works.page:11(page/title)
+msgid "Tor"
+msgstr ""
+
+#: C/how-tor-works.page:12(page/p)
+msgid "Tor is a network of virtual tunnels that allows you to improve your privacy and security on the Internet. Tor works by sending your traffic through three random servers (also known as <em>relays</em>) in the Tor network, before the traffic is sent out onto the public Internet"
+msgstr ""
+
+#: C/how-tor-works.page:20(page/p)
+msgid "The image above illustrates a user browsing to different websites over Tor. The green monitors represent relays in the Tor network, while the three keys represent the layers of encryption between the user and each relay."
+msgstr ""
+
+#: C/how-tor-works.page:26(page/p)
+msgid "Tor will anonymize the origin of your traffic, and it will encrypt everything between you and the Tor network. Tor will also encrypt your traffic inside the Tor network, but it cannot encrypt your traffic between the Tor network and its final destination."
+msgstr ""
+
+#: C/how-tor-works.page:32(page/p)
+msgid "If you are communicating sensitive information, for example when logging on to a website with a username and password, make sure that you are using HTTPS (e.g. <input><em>https</em>://torproject.org/</input>, not <input><em>http</em>://torproject.org/</input>)."
+msgstr ""
+
+#: C/index.page:6(page/title)
+msgid "Tor Browser Help"
+msgstr ""
+
+#: C/index.page:7(page/p)
+msgid "Version: UNKNOWN-dirty"
+msgstr ""
+
+#: C/known-issues.page:7(info/desc)
+msgid "A list of known issues."
+msgstr ""
+
+#: C/known-issues.page:8(info/title)
+msgctxt "sort"
+msgid "03 Known Issues"
+msgstr ""
+
+#: C/known-issues.page:12(page/title)
+msgid "Known Issues"
+msgstr ""
+
+#: C/known-issues.page:16(item/p)
+msgid "The following firewall software have been known to interfere with Tor and may need to be temporarily disabled:"
+msgstr ""
+
+#: C/known-issues.page:20(item/p)
+msgid "Webroot SecureAnywhere"
+msgstr ""
+
+#: C/known-issues.page:23(item/p)
+msgid "Kaspersky Internet Security 2012"
+msgstr ""
+
+#: C/known-issues.page:26(item/p)
+msgid "Sophos Antivirus for Mac"
+msgstr ""
+
+#: C/known-issues.page:29(item/p)
+msgid "Microsoft Security Essentials"
+msgstr ""
+
+#: C/known-issues.page:34(item/p)
+msgid "Videos that require Adobe Flash are unavailable. Flash is disabled for security reasons. Most YouTube videos can be played with HTML5 by visiting the video's \"Embed\" → \"Share\" link."
+msgstr ""
+
+#: C/known-issues.page:41(item/p)
+msgid "Tor can not use a bridge if a proxy is set."
+msgstr ""
+
+#: C/known-issues.page:46(item/p)
+msgid "The Tor Browser package is dated January 1, 2000 00:00:00 UTC. This is to ensure that each software build is exactly reproducible."
+msgstr ""
+
+#: C/known-issues.page:52(item/p)
+msgid "To run Tor Browser on Ubuntu, users need to execute a shell script. Open \"Files\" (Unity's explorer), open Preferences → Behavior Tab → Set \"Run executable text files when they are opened\" to \"Ask every time\", then OK. Tor Browser can also be started from the command line by running"
+msgstr ""
+
+#: C/known-issues.page:58(item/code)
+#, no-wrap
+msgid ""
+"\n"
+" ./start-tor-browser\n"
+" "
+msgstr ""
+
+#: C/known-issues.page:61(item/p)
+msgid "from inside the Tor Browser directory."
+msgstr ""
+
+#: C/known-issues.page:66(page/p)
+msgid "If you have an issue with Tor Browser that isn't on this list, feel free to email help(a)rt.torproject.org."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/troubleshooting.page:19(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-connect_en-US.png' md5='03118f523f4cbc7c001da1ddacc9e394'"
+msgstr ""
+
+#: C/troubleshooting.page:7(info/title)
+msgctxt "sort"
+msgid "02 Troubleshooting"
+msgstr ""
+
+#: C/troubleshooting.page:8(info/desc)
+msgid "What to do if Tor Browser doesn't work."
+msgstr ""
+
+#: C/troubleshooting.page:12(page/title)
+msgid "Troubleshooting"
+msgstr ""
+
+#: C/troubleshooting.page:14(page/p)
+msgid "The Tor Browser should get you online automatically after clicking the \"Connect\" button on the start up screen."
+msgstr ""
+
+#: C/troubleshooting.page:21(page/p)
+msgid "If it doesn't connect, there may be a simple fix. Try each of the following:"
+msgstr ""
+
+#: C/troubleshooting.page:27(item/p)
+msgid "Make sure another Tor Browser is not already running. If you're not sure if Tor Browser is running, restart your computer."
+msgstr ""
+
+#: C/troubleshooting.page:31(item/p)
+msgid "'Allow' Tor in your antivirus program."
+msgstr ""
+
+#: C/troubleshooting.page:34(item/p)
+msgid "Temporarily disable your firewall."
+msgstr ""
+
+#: C/troubleshooting.page:37(item/p)
+msgid "Delete Tor Browser and install it again. If updating, do not overwrite your previous Tor Browser files."
+msgstr ""
+
+#: C/troubleshooting.page:42(page/p)
+msgid "If you still can't connect, your internet service provider might be censoring connections to Tor. Follow the instructions in the <link xref=\"circumvention\">Circumvention</link> section."
+msgstr ""
+
+#: C/troubleshooting.page:48(page/p)
+msgid "If the above steps do not address your problem, email help(a)rt.torproject.org with your operating system, the details of your problem, and what you've already tried."
+msgstr ""
+
+#: C/uninstalling.page:7(info/desc)
+msgid "How to remove Tor Browser from your system."
+msgstr ""
+
+#: C/uninstalling.page:8(info/title)
+msgctxt "sort"
+msgid "06 Uninstalling"
+msgstr ""
+
+#: C/uninstalling.page:12(page/title)
+msgid "Uninstalling"
+msgstr ""
+
+#: C/uninstalling.page:14(page/p)
+msgid "The Tor Browser does not affect any of the existing software or settings on your computer. Uninstalling Tor Browser will not affect your system's software or settings either."
+msgstr ""
+
+#: C/uninstalling.page:20(page/p)
+msgid "Removing the Tor Browser from your system is simple:"
+msgstr ""
+
+#: C/uninstalling.page:26(item/p)
+msgid "Locate your Tor Browser folder. The default location is your Desktop."
+msgstr ""
+
+#: C/uninstalling.page:29(item/p)
+msgid "Delete the Tor Browser folder."
+msgstr ""
+
+#: C/uninstalling.page:32(item/p)
+msgid "Empty your Trash"
+msgstr ""
+
+#: C/uninstalling.page:36(page/p)
+msgid "Note that your operating system's standard \"Uninstall\" utility is not used."
+msgstr ""
+
diff --git a/pt_PT/pt_PT.po b/pt_PT/pt_PT.po
deleted file mode 100644
index 03e9cad..0000000
--- a/pt_PT/pt_PT.po
+++ /dev/null
@@ -1,380 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2014-05-15 11:21+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL(a)li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
-msgctxt "_"
-msgid "translator-credits"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/bridges.page:144(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-custom-bridges_en-US.png' md5='93365c2aa3fb4d627497e83f28a39b7e'"
-msgstr ""
-
-#: C/bridges.page:7(info/desc)
-msgid "What bridges are and how to use them."
-msgstr ""
-
-#: C/bridges.page:8(info/title)
-msgctxt "sort"
-msgid "05 Bridges"
-msgstr ""
-
-#: C/bridges.page:12(page/title)
-msgid "Bridges"
-msgstr ""
-
-#: C/bridges.page:14(page/p)
-msgid "Bridges are quiet gateways into the Tor Network. Like Tor relays, they are run by volunteers. Unlike relays, they are not listed publicly. Using bridges disguise the fact that one is using Tor."
-msgstr ""
-
-#: C/bridges.page:20(page/p)
-msgid "Currently there are five bridge types, or transports, available. More are being developed."
-msgstr ""
-
-#: C/bridges.page:27(td/p)
-msgid "ORPort"
-msgstr ""
-
-#: C/bridges.page:32(td/p)
-msgid "Requesting 'bridges' without specifying the bridge type, will return ORPort bridges, also called Vanilla bridges. ORPort bridges are NOT reliable for circumventing censorship or national firewalls. ORPort bridges can be useful as trusted entry points into the Tor network."
-msgstr ""
-
-#: C/bridges.page:42(td/p)
-msgid "obfs2"
-msgstr ""
-
-#: C/bridges.page:47(td/p)
-msgid "Censors have learned how to identify obfs2 bridges. This transport is being deprecated."
-msgstr ""
-
-#: C/bridges.page:55(td/p)
-msgid "obfs3"
-msgstr ""
-
-#: C/bridges.page:60(td/p)
-msgid "Obfsproxy disguises Tor traffic as random noise. obfs3 bridges work almost everywhere. A few obfs3 bridges have been blocked."
-msgstr ""
-
-#: C/bridges.page:68(td/p)
-msgid "Scramblesuit"
-msgstr ""
-
-#: C/bridges.page:73(td/p)
-msgid "Scramblesuit is an additional tool for the obfsproxy transport. Scramblesuit bridges are designed to be hard to identify and hard to block."
-msgstr ""
-
-#: C/bridges.page:82(td/p)
-msgid "FTE"
-msgstr ""
-
-#: C/bridges.page:87(td/p)
-msgid "Format-Transforming Encryption disguises Tor traffic as web (HTTP) traffic or other types of internet traffic. FTE bridges are effective, but in limited supply."
-msgstr ""
-
-#: C/bridges.page:96(page/p)
-msgid "(Note that flashproxy is a Pluggable Transport, but does not rely on bridges.)"
-msgstr ""
-
-#: C/bridges.page:100(page/p)
-msgid "There are four ways to get a bridge."
-msgstr ""
-
-#: C/bridges.page:106(item/p)
-msgid "Visit <link href=\"https://bridges.torproject.org/\">https://bridges.torproject.org/</link> and follow the instructions."
-msgstr ""
-
-#: C/bridges.page:111(item/p)
-msgid "Email bridges(a)bridges.torproject.org from a gmail or yahoo email address. Put <cmd>get bridges</cmd> in the body for ORPort bridges or <cmd>transport=obfs3</cmd> for obfs3 bridges."
-msgstr ""
-
-#: C/bridges.page:118(item/p)
-msgid "Politely ask a human at help(a)rt.torproject.org if you cannot access either of the first two methods."
-msgstr ""
-
-#: C/bridges.page:124(item/p)
-msgid "Install and configure a Tor instance to be bridge for yourself. The computer acting as a bridge must have uncensored internet access to the Tor network. A full installation guide can be found at <link href=\"https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en\">https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en</link>"
-msgstr ""
-
-#: C/bridges.page:133(page/p)
-msgid "Enter the bridge information you get from any of the above steps in Tor-launcher."
-msgstr ""
-
-#: C/bridges.page:138(page/p)
-msgid "Choose yes when asked if your Internet Service Provider blocks connections to the Tor network. Select 'Use custom bridges' and enter each bridge identifier on its own line."
-msgstr ""
-
-#: C/bridges.page:146(page/p)
-msgid "Click Connect. Using bridges slow down the connection. If the connection fails, the bridges you received may be down. Get more and try again."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:21(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-configure_en-US.png' md5='966f4bafcb829e59b2b84d08144d885e'"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:28(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-wizard_en-US.png' md5='21f80fc3f4e34359bfdc44684d7da09d'"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:36(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-provided-bridges_en-US.png' md5='70524dccb698a21bb1d20223461e3272'"
-msgstr ""
-
-#: C/circumvention.page:7(info/title)
-msgctxt "sort"
-msgid "04 Circumvention"
-msgstr ""
-
-#: C/circumvention.page:8(info/desc)
-msgid "What to do if the Tor network is blocked."
-msgstr ""
-
-#: C/circumvention.page:12(page/title)
-msgid "Circumvention"
-msgstr ""
-
-#: C/circumvention.page:14(page/p)
-msgid "Some firewalls can detect and block connections to Tor. The Tor Browser includes some circumvention tools for getting around blocking firewalls. These circumvention tools are called Pluggable Transports. To turn them on, click \"Configure\" in the Tor launcher window."
-msgstr ""
-
-#: C/circumvention.page:23(page/p)
-msgid "Select yes when asked if your internet service provider blocks connections to Tor.\""
-msgstr ""
-
-#: C/circumvention.page:30(page/p)
-msgid "Select \"Connect with provided bridges\". Tor Browser has three Pluggable Transports to choose from. If one fails to get you online, try selecting a different transport."
-msgstr ""
-
-#: C/circumvention.page:38(page/p)
-msgid "If you try all three transports, and none of them get you online, select \"Enter custom bridges\", and enter bridges manually. Read the <link xref=\"bridges\">Getting Bridges</link> section for instructions on getting custom bridges."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/how-tor-works.page:19(media)
-msgctxt "_"
-msgid "external ref='media/how-tor-works.png' md5='6fe4151a88b7a518466f0582e40ccc8c'"
-msgstr ""
-
-#: C/how-tor-works.page:6(info/title)
-msgctxt "sort"
-msgid "01 Tor"
-msgstr ""
-
-#: C/how-tor-works.page:7(info/desc)
-msgid "How Tor works."
-msgstr ""
-
-#: C/how-tor-works.page:11(page/title)
-msgid "Tor"
-msgstr ""
-
-#: C/how-tor-works.page:12(page/p)
-msgid "Tor is a network of virtual tunnels that allows you to improve your privacy and security on the Internet. Tor works by sending your traffic through three random servers (also known as <em>relays</em>) in the Tor network, before the traffic is sent out onto the public Internet"
-msgstr ""
-
-#: C/how-tor-works.page:20(page/p)
-msgid "The image above illustrates a user browsing to different websites over Tor. The green monitors represent relays in the Tor network, while the three keys represent the layers of encryption between the user and each relay."
-msgstr ""
-
-#: C/how-tor-works.page:26(page/p)
-msgid "Tor will anonymize the origin of your traffic, and it will encrypt everything between you and the Tor network. Tor will also encrypt your traffic inside the Tor network, but it cannot encrypt your traffic between the Tor network and its final destination."
-msgstr ""
-
-#: C/how-tor-works.page:32(page/p)
-msgid "If you are communicating sensitive information, for example when logging on to a website with a username and password, make sure that you are using HTTPS (e.g. <input><em>https</em>://torproject.org/</input>, not <input><em>http</em>://torproject.org/</input>)."
-msgstr ""
-
-#: C/index.page:6(page/title)
-msgid "Tor Browser Help"
-msgstr ""
-
-#: C/index.page:7(page/p)
-msgid "Version: UNKNOWN-dirty"
-msgstr ""
-
-#: C/known-issues.page:7(info/desc)
-msgid "A list of known issues."
-msgstr ""
-
-#: C/known-issues.page:8(info/title)
-msgctxt "sort"
-msgid "03 Known Issues"
-msgstr ""
-
-#: C/known-issues.page:12(page/title)
-msgid "Known Issues"
-msgstr ""
-
-#: C/known-issues.page:16(item/p)
-msgid "The following firewall software have been known to interfere with Tor and may need to be temporarily disabled:"
-msgstr ""
-
-#: C/known-issues.page:20(item/p)
-msgid "Webroot SecureAnywhere"
-msgstr ""
-
-#: C/known-issues.page:23(item/p)
-msgid "Kaspersky Internet Security 2012"
-msgstr ""
-
-#: C/known-issues.page:26(item/p)
-msgid "Sophos Antivirus for Mac"
-msgstr ""
-
-#: C/known-issues.page:29(item/p)
-msgid "Microsoft Security Essentials"
-msgstr ""
-
-#: C/known-issues.page:34(item/p)
-msgid "Videos that require Adobe Flash are unavailable. Flash is disabled for security reasons. Most YouTube videos can be played with HTML5 by visiting the video's \"Embed\" → \"Share\" link."
-msgstr ""
-
-#: C/known-issues.page:41(item/p)
-msgid "Tor can not use a bridge if a proxy is set."
-msgstr ""
-
-#: C/known-issues.page:46(item/p)
-msgid "The Tor Browser package is dated January 1, 2000 00:00:00 UTC. This is to ensure that each software build is exactly reproducible."
-msgstr ""
-
-#: C/known-issues.page:52(item/p)
-msgid "To run Tor Browser on Ubuntu, users need to execute a shell script. Open \"Files\" (Unity's explorer), open Preferences → Behavior Tab → Set \"Run executable text files when they are opened\" to \"Ask every time\", then OK. Tor Browser can also be started from the command line by running"
-msgstr ""
-
-#: C/known-issues.page:58(item/code)
-#, no-wrap
-msgid ""
-"\n"
-" ./start-tor-browser\n"
-" "
-msgstr ""
-
-#: C/known-issues.page:61(item/p)
-msgid "from inside the Tor Browser directory."
-msgstr ""
-
-#: C/known-issues.page:66(page/p)
-msgid "If you have an issue with Tor Browser that isn't on this list, feel free to email help(a)rt.torproject.org."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/troubleshooting.page:19(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-connect_en-US.png' md5='03118f523f4cbc7c001da1ddacc9e394'"
-msgstr ""
-
-#: C/troubleshooting.page:7(info/title)
-msgctxt "sort"
-msgid "02 Troubleshooting"
-msgstr ""
-
-#: C/troubleshooting.page:8(info/desc)
-msgid "What to do if Tor Browser doesn't work."
-msgstr ""
-
-#: C/troubleshooting.page:12(page/title)
-msgid "Troubleshooting"
-msgstr ""
-
-#: C/troubleshooting.page:14(page/p)
-msgid "The Tor Browser should get you online automatically after clicking the \"Connect\" button on the start up screen."
-msgstr ""
-
-#: C/troubleshooting.page:21(page/p)
-msgid "If it doesn't connect, there may be a simple fix. Try each of the following:"
-msgstr ""
-
-#: C/troubleshooting.page:27(item/p)
-msgid "Make sure another Tor Browser is not already running. If you're not sure if Tor Browser is running, restart your computer."
-msgstr ""
-
-#: C/troubleshooting.page:31(item/p)
-msgid "'Allow' Tor in your antivirus program."
-msgstr ""
-
-#: C/troubleshooting.page:34(item/p)
-msgid "Temporarily disable your firewall."
-msgstr ""
-
-#: C/troubleshooting.page:37(item/p)
-msgid "Delete Tor Browser and install it again. If updating, do not overwrite your previous Tor Browser files."
-msgstr ""
-
-#: C/troubleshooting.page:42(page/p)
-msgid "If you still can't connect, your internet service provider might be censoring connections to Tor. Follow the instructions in the <link xref=\"circumvention\">Circumvention</link> section."
-msgstr ""
-
-#: C/troubleshooting.page:48(page/p)
-msgid "If the above steps do not address your problem, email help(a)rt.torproject.org with your operating system, the details of your problem, and what you've already tried."
-msgstr ""
-
-#: C/uninstalling.page:7(info/desc)
-msgid "How to remove Tor Browser from your system."
-msgstr ""
-
-#: C/uninstalling.page:8(info/title)
-msgctxt "sort"
-msgid "06 Uninstalling"
-msgstr ""
-
-#: C/uninstalling.page:12(page/title)
-msgid "Uninstalling"
-msgstr ""
-
-#: C/uninstalling.page:14(page/p)
-msgid "The Tor Browser does not affect any of the existing software or settings on your computer. Uninstalling Tor Browser will not affect your system's software or settings either."
-msgstr ""
-
-#: C/uninstalling.page:20(page/p)
-msgid "Removing the Tor Browser from your system is simple:"
-msgstr ""
-
-#: C/uninstalling.page:26(item/p)
-msgid "Locate your Tor Browser folder. The default location is your Desktop."
-msgstr ""
-
-#: C/uninstalling.page:29(item/p)
-msgid "Delete the Tor Browser folder."
-msgstr ""
-
-#: C/uninstalling.page:32(item/p)
-msgid "Empty your Trash"
-msgstr ""
-
-#: C/uninstalling.page:36(page/p)
-msgid "Note that your operating system's standard \"Uninstall\" utility is not used."
-msgstr ""
-
diff --git a/tor-browser-version.txt.in b/tor-browser-version.txt.in
index d78bda9..c675947 100644
--- a/tor-browser-version.txt.in
+++ b/tor-browser-version.txt.in
@@ -1 +1 @@
-@VERSION@
+@TOR_BROWSER_VERSION@
diff --git a/zh-CN/zh-CN.po b/zh-CN/zh-CN.po
new file mode 100644
index 0000000..03e9cad
--- /dev/null
+++ b/zh-CN/zh-CN.po
@@ -0,0 +1,380 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2014-05-15 11:21+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL(a)li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
+msgctxt "_"
+msgid "translator-credits"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/bridges.page:144(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-custom-bridges_en-US.png' md5='93365c2aa3fb4d627497e83f28a39b7e'"
+msgstr ""
+
+#: C/bridges.page:7(info/desc)
+msgid "What bridges are and how to use them."
+msgstr ""
+
+#: C/bridges.page:8(info/title)
+msgctxt "sort"
+msgid "05 Bridges"
+msgstr ""
+
+#: C/bridges.page:12(page/title)
+msgid "Bridges"
+msgstr ""
+
+#: C/bridges.page:14(page/p)
+msgid "Bridges are quiet gateways into the Tor Network. Like Tor relays, they are run by volunteers. Unlike relays, they are not listed publicly. Using bridges disguise the fact that one is using Tor."
+msgstr ""
+
+#: C/bridges.page:20(page/p)
+msgid "Currently there are five bridge types, or transports, available. More are being developed."
+msgstr ""
+
+#: C/bridges.page:27(td/p)
+msgid "ORPort"
+msgstr ""
+
+#: C/bridges.page:32(td/p)
+msgid "Requesting 'bridges' without specifying the bridge type, will return ORPort bridges, also called Vanilla bridges. ORPort bridges are NOT reliable for circumventing censorship or national firewalls. ORPort bridges can be useful as trusted entry points into the Tor network."
+msgstr ""
+
+#: C/bridges.page:42(td/p)
+msgid "obfs2"
+msgstr ""
+
+#: C/bridges.page:47(td/p)
+msgid "Censors have learned how to identify obfs2 bridges. This transport is being deprecated."
+msgstr ""
+
+#: C/bridges.page:55(td/p)
+msgid "obfs3"
+msgstr ""
+
+#: C/bridges.page:60(td/p)
+msgid "Obfsproxy disguises Tor traffic as random noise. obfs3 bridges work almost everywhere. A few obfs3 bridges have been blocked."
+msgstr ""
+
+#: C/bridges.page:68(td/p)
+msgid "Scramblesuit"
+msgstr ""
+
+#: C/bridges.page:73(td/p)
+msgid "Scramblesuit is an additional tool for the obfsproxy transport. Scramblesuit bridges are designed to be hard to identify and hard to block."
+msgstr ""
+
+#: C/bridges.page:82(td/p)
+msgid "FTE"
+msgstr ""
+
+#: C/bridges.page:87(td/p)
+msgid "Format-Transforming Encryption disguises Tor traffic as web (HTTP) traffic or other types of internet traffic. FTE bridges are effective, but in limited supply."
+msgstr ""
+
+#: C/bridges.page:96(page/p)
+msgid "(Note that flashproxy is a Pluggable Transport, but does not rely on bridges.)"
+msgstr ""
+
+#: C/bridges.page:100(page/p)
+msgid "There are four ways to get a bridge."
+msgstr ""
+
+#: C/bridges.page:106(item/p)
+msgid "Visit <link href=\"https://bridges.torproject.org/\">https://bridges.torproject.org/</link> and follow the instructions."
+msgstr ""
+
+#: C/bridges.page:111(item/p)
+msgid "Email bridges(a)bridges.torproject.org from a gmail or yahoo email address. Put <cmd>get bridges</cmd> in the body for ORPort bridges or <cmd>transport=obfs3</cmd> for obfs3 bridges."
+msgstr ""
+
+#: C/bridges.page:118(item/p)
+msgid "Politely ask a human at help(a)rt.torproject.org if you cannot access either of the first two methods."
+msgstr ""
+
+#: C/bridges.page:124(item/p)
+msgid "Install and configure a Tor instance to be bridge for yourself. The computer acting as a bridge must have uncensored internet access to the Tor network. A full installation guide can be found at <link href=\"https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en\">https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en</link>"
+msgstr ""
+
+#: C/bridges.page:133(page/p)
+msgid "Enter the bridge information you get from any of the above steps in Tor-launcher."
+msgstr ""
+
+#: C/bridges.page:138(page/p)
+msgid "Choose yes when asked if your Internet Service Provider blocks connections to the Tor network. Select 'Use custom bridges' and enter each bridge identifier on its own line."
+msgstr ""
+
+#: C/bridges.page:146(page/p)
+msgid "Click Connect. Using bridges slow down the connection. If the connection fails, the bridges you received may be down. Get more and try again."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:21(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-configure_en-US.png' md5='966f4bafcb829e59b2b84d08144d885e'"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:28(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-wizard_en-US.png' md5='21f80fc3f4e34359bfdc44684d7da09d'"
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/circumvention.page:36(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-provided-bridges_en-US.png' md5='70524dccb698a21bb1d20223461e3272'"
+msgstr ""
+
+#: C/circumvention.page:7(info/title)
+msgctxt "sort"
+msgid "04 Circumvention"
+msgstr ""
+
+#: C/circumvention.page:8(info/desc)
+msgid "What to do if the Tor network is blocked."
+msgstr ""
+
+#: C/circumvention.page:12(page/title)
+msgid "Circumvention"
+msgstr ""
+
+#: C/circumvention.page:14(page/p)
+msgid "Some firewalls can detect and block connections to Tor. The Tor Browser includes some circumvention tools for getting around blocking firewalls. These circumvention tools are called Pluggable Transports. To turn them on, click \"Configure\" in the Tor launcher window."
+msgstr ""
+
+#: C/circumvention.page:23(page/p)
+msgid "Select yes when asked if your internet service provider blocks connections to Tor.\""
+msgstr ""
+
+#: C/circumvention.page:30(page/p)
+msgid "Select \"Connect with provided bridges\". Tor Browser has three Pluggable Transports to choose from. If one fails to get you online, try selecting a different transport."
+msgstr ""
+
+#: C/circumvention.page:38(page/p)
+msgid "If you try all three transports, and none of them get you online, select \"Enter custom bridges\", and enter bridges manually. Read the <link xref=\"bridges\">Getting Bridges</link> section for instructions on getting custom bridges."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/how-tor-works.page:19(media)
+msgctxt "_"
+msgid "external ref='media/how-tor-works.png' md5='6fe4151a88b7a518466f0582e40ccc8c'"
+msgstr ""
+
+#: C/how-tor-works.page:6(info/title)
+msgctxt "sort"
+msgid "01 Tor"
+msgstr ""
+
+#: C/how-tor-works.page:7(info/desc)
+msgid "How Tor works."
+msgstr ""
+
+#: C/how-tor-works.page:11(page/title)
+msgid "Tor"
+msgstr ""
+
+#: C/how-tor-works.page:12(page/p)
+msgid "Tor is a network of virtual tunnels that allows you to improve your privacy and security on the Internet. Tor works by sending your traffic through three random servers (also known as <em>relays</em>) in the Tor network, before the traffic is sent out onto the public Internet"
+msgstr ""
+
+#: C/how-tor-works.page:20(page/p)
+msgid "The image above illustrates a user browsing to different websites over Tor. The green monitors represent relays in the Tor network, while the three keys represent the layers of encryption between the user and each relay."
+msgstr ""
+
+#: C/how-tor-works.page:26(page/p)
+msgid "Tor will anonymize the origin of your traffic, and it will encrypt everything between you and the Tor network. Tor will also encrypt your traffic inside the Tor network, but it cannot encrypt your traffic between the Tor network and its final destination."
+msgstr ""
+
+#: C/how-tor-works.page:32(page/p)
+msgid "If you are communicating sensitive information, for example when logging on to a website with a username and password, make sure that you are using HTTPS (e.g. <input><em>https</em>://torproject.org/</input>, not <input><em>http</em>://torproject.org/</input>)."
+msgstr ""
+
+#: C/index.page:6(page/title)
+msgid "Tor Browser Help"
+msgstr ""
+
+#: C/index.page:7(page/p)
+msgid "Version: UNKNOWN-dirty"
+msgstr ""
+
+#: C/known-issues.page:7(info/desc)
+msgid "A list of known issues."
+msgstr ""
+
+#: C/known-issues.page:8(info/title)
+msgctxt "sort"
+msgid "03 Known Issues"
+msgstr ""
+
+#: C/known-issues.page:12(page/title)
+msgid "Known Issues"
+msgstr ""
+
+#: C/known-issues.page:16(item/p)
+msgid "The following firewall software have been known to interfere with Tor and may need to be temporarily disabled:"
+msgstr ""
+
+#: C/known-issues.page:20(item/p)
+msgid "Webroot SecureAnywhere"
+msgstr ""
+
+#: C/known-issues.page:23(item/p)
+msgid "Kaspersky Internet Security 2012"
+msgstr ""
+
+#: C/known-issues.page:26(item/p)
+msgid "Sophos Antivirus for Mac"
+msgstr ""
+
+#: C/known-issues.page:29(item/p)
+msgid "Microsoft Security Essentials"
+msgstr ""
+
+#: C/known-issues.page:34(item/p)
+msgid "Videos that require Adobe Flash are unavailable. Flash is disabled for security reasons. Most YouTube videos can be played with HTML5 by visiting the video's \"Embed\" → \"Share\" link."
+msgstr ""
+
+#: C/known-issues.page:41(item/p)
+msgid "Tor can not use a bridge if a proxy is set."
+msgstr ""
+
+#: C/known-issues.page:46(item/p)
+msgid "The Tor Browser package is dated January 1, 2000 00:00:00 UTC. This is to ensure that each software build is exactly reproducible."
+msgstr ""
+
+#: C/known-issues.page:52(item/p)
+msgid "To run Tor Browser on Ubuntu, users need to execute a shell script. Open \"Files\" (Unity's explorer), open Preferences → Behavior Tab → Set \"Run executable text files when they are opened\" to \"Ask every time\", then OK. Tor Browser can also be started from the command line by running"
+msgstr ""
+
+#: C/known-issues.page:58(item/code)
+#, no-wrap
+msgid ""
+"\n"
+" ./start-tor-browser\n"
+" "
+msgstr ""
+
+#: C/known-issues.page:61(item/p)
+msgid "from inside the Tor Browser directory."
+msgstr ""
+
+#: C/known-issues.page:66(page/p)
+msgid "If you have an issue with Tor Browser that isn't on this list, feel free to email help(a)rt.torproject.org."
+msgstr ""
+
+#. This is a reference to an external file such as an image or video. When
+#. the file changes, the md5 hash will change to let you know you need to
+#. update your localized copy. The msgstr is not used at all. Set it to
+#. whatever you like once you have updated your copy of the file.
+#: C/troubleshooting.page:19(media)
+msgctxt "_"
+msgid "external ref='media/tor-launcher-connect_en-US.png' md5='03118f523f4cbc7c001da1ddacc9e394'"
+msgstr ""
+
+#: C/troubleshooting.page:7(info/title)
+msgctxt "sort"
+msgid "02 Troubleshooting"
+msgstr ""
+
+#: C/troubleshooting.page:8(info/desc)
+msgid "What to do if Tor Browser doesn't work."
+msgstr ""
+
+#: C/troubleshooting.page:12(page/title)
+msgid "Troubleshooting"
+msgstr ""
+
+#: C/troubleshooting.page:14(page/p)
+msgid "The Tor Browser should get you online automatically after clicking the \"Connect\" button on the start up screen."
+msgstr ""
+
+#: C/troubleshooting.page:21(page/p)
+msgid "If it doesn't connect, there may be a simple fix. Try each of the following:"
+msgstr ""
+
+#: C/troubleshooting.page:27(item/p)
+msgid "Make sure another Tor Browser is not already running. If you're not sure if Tor Browser is running, restart your computer."
+msgstr ""
+
+#: C/troubleshooting.page:31(item/p)
+msgid "'Allow' Tor in your antivirus program."
+msgstr ""
+
+#: C/troubleshooting.page:34(item/p)
+msgid "Temporarily disable your firewall."
+msgstr ""
+
+#: C/troubleshooting.page:37(item/p)
+msgid "Delete Tor Browser and install it again. If updating, do not overwrite your previous Tor Browser files."
+msgstr ""
+
+#: C/troubleshooting.page:42(page/p)
+msgid "If you still can't connect, your internet service provider might be censoring connections to Tor. Follow the instructions in the <link xref=\"circumvention\">Circumvention</link> section."
+msgstr ""
+
+#: C/troubleshooting.page:48(page/p)
+msgid "If the above steps do not address your problem, email help(a)rt.torproject.org with your operating system, the details of your problem, and what you've already tried."
+msgstr ""
+
+#: C/uninstalling.page:7(info/desc)
+msgid "How to remove Tor Browser from your system."
+msgstr ""
+
+#: C/uninstalling.page:8(info/title)
+msgctxt "sort"
+msgid "06 Uninstalling"
+msgstr ""
+
+#: C/uninstalling.page:12(page/title)
+msgid "Uninstalling"
+msgstr ""
+
+#: C/uninstalling.page:14(page/p)
+msgid "The Tor Browser does not affect any of the existing software or settings on your computer. Uninstalling Tor Browser will not affect your system's software or settings either."
+msgstr ""
+
+#: C/uninstalling.page:20(page/p)
+msgid "Removing the Tor Browser from your system is simple:"
+msgstr ""
+
+#: C/uninstalling.page:26(item/p)
+msgid "Locate your Tor Browser folder. The default location is your Desktop."
+msgstr ""
+
+#: C/uninstalling.page:29(item/p)
+msgid "Delete the Tor Browser folder."
+msgstr ""
+
+#: C/uninstalling.page:32(item/p)
+msgid "Empty your Trash"
+msgstr ""
+
+#: C/uninstalling.page:36(page/p)
+msgid "Note that your operating system's standard \"Uninstall\" utility is not used."
+msgstr ""
+
diff --git a/zh_CN/zh_CN.po b/zh_CN/zh_CN.po
deleted file mode 100644
index 03e9cad..0000000
--- a/zh_CN/zh_CN.po
+++ /dev/null
@@ -1,380 +0,0 @@
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2014-05-15 11:21+0200\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL(a)li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-
-#. Put one translator per line, in the form NAME <EMAIL>, YEAR1, YEAR2
-msgctxt "_"
-msgid "translator-credits"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/bridges.page:144(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-custom-bridges_en-US.png' md5='93365c2aa3fb4d627497e83f28a39b7e'"
-msgstr ""
-
-#: C/bridges.page:7(info/desc)
-msgid "What bridges are and how to use them."
-msgstr ""
-
-#: C/bridges.page:8(info/title)
-msgctxt "sort"
-msgid "05 Bridges"
-msgstr ""
-
-#: C/bridges.page:12(page/title)
-msgid "Bridges"
-msgstr ""
-
-#: C/bridges.page:14(page/p)
-msgid "Bridges are quiet gateways into the Tor Network. Like Tor relays, they are run by volunteers. Unlike relays, they are not listed publicly. Using bridges disguise the fact that one is using Tor."
-msgstr ""
-
-#: C/bridges.page:20(page/p)
-msgid "Currently there are five bridge types, or transports, available. More are being developed."
-msgstr ""
-
-#: C/bridges.page:27(td/p)
-msgid "ORPort"
-msgstr ""
-
-#: C/bridges.page:32(td/p)
-msgid "Requesting 'bridges' without specifying the bridge type, will return ORPort bridges, also called Vanilla bridges. ORPort bridges are NOT reliable for circumventing censorship or national firewalls. ORPort bridges can be useful as trusted entry points into the Tor network."
-msgstr ""
-
-#: C/bridges.page:42(td/p)
-msgid "obfs2"
-msgstr ""
-
-#: C/bridges.page:47(td/p)
-msgid "Censors have learned how to identify obfs2 bridges. This transport is being deprecated."
-msgstr ""
-
-#: C/bridges.page:55(td/p)
-msgid "obfs3"
-msgstr ""
-
-#: C/bridges.page:60(td/p)
-msgid "Obfsproxy disguises Tor traffic as random noise. obfs3 bridges work almost everywhere. A few obfs3 bridges have been blocked."
-msgstr ""
-
-#: C/bridges.page:68(td/p)
-msgid "Scramblesuit"
-msgstr ""
-
-#: C/bridges.page:73(td/p)
-msgid "Scramblesuit is an additional tool for the obfsproxy transport. Scramblesuit bridges are designed to be hard to identify and hard to block."
-msgstr ""
-
-#: C/bridges.page:82(td/p)
-msgid "FTE"
-msgstr ""
-
-#: C/bridges.page:87(td/p)
-msgid "Format-Transforming Encryption disguises Tor traffic as web (HTTP) traffic or other types of internet traffic. FTE bridges are effective, but in limited supply."
-msgstr ""
-
-#: C/bridges.page:96(page/p)
-msgid "(Note that flashproxy is a Pluggable Transport, but does not rely on bridges.)"
-msgstr ""
-
-#: C/bridges.page:100(page/p)
-msgid "There are four ways to get a bridge."
-msgstr ""
-
-#: C/bridges.page:106(item/p)
-msgid "Visit <link href=\"https://bridges.torproject.org/\">https://bridges.torproject.org/</link> and follow the instructions."
-msgstr ""
-
-#: C/bridges.page:111(item/p)
-msgid "Email bridges(a)bridges.torproject.org from a gmail or yahoo email address. Put <cmd>get bridges</cmd> in the body for ORPort bridges or <cmd>transport=obfs3</cmd> for obfs3 bridges."
-msgstr ""
-
-#: C/bridges.page:118(item/p)
-msgid "Politely ask a human at help(a)rt.torproject.org if you cannot access either of the first two methods."
-msgstr ""
-
-#: C/bridges.page:124(item/p)
-msgid "Install and configure a Tor instance to be bridge for yourself. The computer acting as a bridge must have uncensored internet access to the Tor network. A full installation guide can be found at <link href=\"https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en\">https://www.torproject.org/projects/obfsproxy-debian-instructions.html.en</link>"
-msgstr ""
-
-#: C/bridges.page:133(page/p)
-msgid "Enter the bridge information you get from any of the above steps in Tor-launcher."
-msgstr ""
-
-#: C/bridges.page:138(page/p)
-msgid "Choose yes when asked if your Internet Service Provider blocks connections to the Tor network. Select 'Use custom bridges' and enter each bridge identifier on its own line."
-msgstr ""
-
-#: C/bridges.page:146(page/p)
-msgid "Click Connect. Using bridges slow down the connection. If the connection fails, the bridges you received may be down. Get more and try again."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:21(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-configure_en-US.png' md5='966f4bafcb829e59b2b84d08144d885e'"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:28(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-wizard_en-US.png' md5='21f80fc3f4e34359bfdc44684d7da09d'"
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/circumvention.page:36(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-provided-bridges_en-US.png' md5='70524dccb698a21bb1d20223461e3272'"
-msgstr ""
-
-#: C/circumvention.page:7(info/title)
-msgctxt "sort"
-msgid "04 Circumvention"
-msgstr ""
-
-#: C/circumvention.page:8(info/desc)
-msgid "What to do if the Tor network is blocked."
-msgstr ""
-
-#: C/circumvention.page:12(page/title)
-msgid "Circumvention"
-msgstr ""
-
-#: C/circumvention.page:14(page/p)
-msgid "Some firewalls can detect and block connections to Tor. The Tor Browser includes some circumvention tools for getting around blocking firewalls. These circumvention tools are called Pluggable Transports. To turn them on, click \"Configure\" in the Tor launcher window."
-msgstr ""
-
-#: C/circumvention.page:23(page/p)
-msgid "Select yes when asked if your internet service provider blocks connections to Tor.\""
-msgstr ""
-
-#: C/circumvention.page:30(page/p)
-msgid "Select \"Connect with provided bridges\". Tor Browser has three Pluggable Transports to choose from. If one fails to get you online, try selecting a different transport."
-msgstr ""
-
-#: C/circumvention.page:38(page/p)
-msgid "If you try all three transports, and none of them get you online, select \"Enter custom bridges\", and enter bridges manually. Read the <link xref=\"bridges\">Getting Bridges</link> section for instructions on getting custom bridges."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/how-tor-works.page:19(media)
-msgctxt "_"
-msgid "external ref='media/how-tor-works.png' md5='6fe4151a88b7a518466f0582e40ccc8c'"
-msgstr ""
-
-#: C/how-tor-works.page:6(info/title)
-msgctxt "sort"
-msgid "01 Tor"
-msgstr ""
-
-#: C/how-tor-works.page:7(info/desc)
-msgid "How Tor works."
-msgstr ""
-
-#: C/how-tor-works.page:11(page/title)
-msgid "Tor"
-msgstr ""
-
-#: C/how-tor-works.page:12(page/p)
-msgid "Tor is a network of virtual tunnels that allows you to improve your privacy and security on the Internet. Tor works by sending your traffic through three random servers (also known as <em>relays</em>) in the Tor network, before the traffic is sent out onto the public Internet"
-msgstr ""
-
-#: C/how-tor-works.page:20(page/p)
-msgid "The image above illustrates a user browsing to different websites over Tor. The green monitors represent relays in the Tor network, while the three keys represent the layers of encryption between the user and each relay."
-msgstr ""
-
-#: C/how-tor-works.page:26(page/p)
-msgid "Tor will anonymize the origin of your traffic, and it will encrypt everything between you and the Tor network. Tor will also encrypt your traffic inside the Tor network, but it cannot encrypt your traffic between the Tor network and its final destination."
-msgstr ""
-
-#: C/how-tor-works.page:32(page/p)
-msgid "If you are communicating sensitive information, for example when logging on to a website with a username and password, make sure that you are using HTTPS (e.g. <input><em>https</em>://torproject.org/</input>, not <input><em>http</em>://torproject.org/</input>)."
-msgstr ""
-
-#: C/index.page:6(page/title)
-msgid "Tor Browser Help"
-msgstr ""
-
-#: C/index.page:7(page/p)
-msgid "Version: UNKNOWN-dirty"
-msgstr ""
-
-#: C/known-issues.page:7(info/desc)
-msgid "A list of known issues."
-msgstr ""
-
-#: C/known-issues.page:8(info/title)
-msgctxt "sort"
-msgid "03 Known Issues"
-msgstr ""
-
-#: C/known-issues.page:12(page/title)
-msgid "Known Issues"
-msgstr ""
-
-#: C/known-issues.page:16(item/p)
-msgid "The following firewall software have been known to interfere with Tor and may need to be temporarily disabled:"
-msgstr ""
-
-#: C/known-issues.page:20(item/p)
-msgid "Webroot SecureAnywhere"
-msgstr ""
-
-#: C/known-issues.page:23(item/p)
-msgid "Kaspersky Internet Security 2012"
-msgstr ""
-
-#: C/known-issues.page:26(item/p)
-msgid "Sophos Antivirus for Mac"
-msgstr ""
-
-#: C/known-issues.page:29(item/p)
-msgid "Microsoft Security Essentials"
-msgstr ""
-
-#: C/known-issues.page:34(item/p)
-msgid "Videos that require Adobe Flash are unavailable. Flash is disabled for security reasons. Most YouTube videos can be played with HTML5 by visiting the video's \"Embed\" → \"Share\" link."
-msgstr ""
-
-#: C/known-issues.page:41(item/p)
-msgid "Tor can not use a bridge if a proxy is set."
-msgstr ""
-
-#: C/known-issues.page:46(item/p)
-msgid "The Tor Browser package is dated January 1, 2000 00:00:00 UTC. This is to ensure that each software build is exactly reproducible."
-msgstr ""
-
-#: C/known-issues.page:52(item/p)
-msgid "To run Tor Browser on Ubuntu, users need to execute a shell script. Open \"Files\" (Unity's explorer), open Preferences → Behavior Tab → Set \"Run executable text files when they are opened\" to \"Ask every time\", then OK. Tor Browser can also be started from the command line by running"
-msgstr ""
-
-#: C/known-issues.page:58(item/code)
-#, no-wrap
-msgid ""
-"\n"
-" ./start-tor-browser\n"
-" "
-msgstr ""
-
-#: C/known-issues.page:61(item/p)
-msgid "from inside the Tor Browser directory."
-msgstr ""
-
-#: C/known-issues.page:66(page/p)
-msgid "If you have an issue with Tor Browser that isn't on this list, feel free to email help(a)rt.torproject.org."
-msgstr ""
-
-#. This is a reference to an external file such as an image or video. When
-#. the file changes, the md5 hash will change to let you know you need to
-#. update your localized copy. The msgstr is not used at all. Set it to
-#. whatever you like once you have updated your copy of the file.
-#: C/troubleshooting.page:19(media)
-msgctxt "_"
-msgid "external ref='media/tor-launcher-connect_en-US.png' md5='03118f523f4cbc7c001da1ddacc9e394'"
-msgstr ""
-
-#: C/troubleshooting.page:7(info/title)
-msgctxt "sort"
-msgid "02 Troubleshooting"
-msgstr ""
-
-#: C/troubleshooting.page:8(info/desc)
-msgid "What to do if Tor Browser doesn't work."
-msgstr ""
-
-#: C/troubleshooting.page:12(page/title)
-msgid "Troubleshooting"
-msgstr ""
-
-#: C/troubleshooting.page:14(page/p)
-msgid "The Tor Browser should get you online automatically after clicking the \"Connect\" button on the start up screen."
-msgstr ""
-
-#: C/troubleshooting.page:21(page/p)
-msgid "If it doesn't connect, there may be a simple fix. Try each of the following:"
-msgstr ""
-
-#: C/troubleshooting.page:27(item/p)
-msgid "Make sure another Tor Browser is not already running. If you're not sure if Tor Browser is running, restart your computer."
-msgstr ""
-
-#: C/troubleshooting.page:31(item/p)
-msgid "'Allow' Tor in your antivirus program."
-msgstr ""
-
-#: C/troubleshooting.page:34(item/p)
-msgid "Temporarily disable your firewall."
-msgstr ""
-
-#: C/troubleshooting.page:37(item/p)
-msgid "Delete Tor Browser and install it again. If updating, do not overwrite your previous Tor Browser files."
-msgstr ""
-
-#: C/troubleshooting.page:42(page/p)
-msgid "If you still can't connect, your internet service provider might be censoring connections to Tor. Follow the instructions in the <link xref=\"circumvention\">Circumvention</link> section."
-msgstr ""
-
-#: C/troubleshooting.page:48(page/p)
-msgid "If the above steps do not address your problem, email help(a)rt.torproject.org with your operating system, the details of your problem, and what you've already tried."
-msgstr ""
-
-#: C/uninstalling.page:7(info/desc)
-msgid "How to remove Tor Browser from your system."
-msgstr ""
-
-#: C/uninstalling.page:8(info/title)
-msgctxt "sort"
-msgid "06 Uninstalling"
-msgstr ""
-
-#: C/uninstalling.page:12(page/title)
-msgid "Uninstalling"
-msgstr ""
-
-#: C/uninstalling.page:14(page/p)
-msgid "The Tor Browser does not affect any of the existing software or settings on your computer. Uninstalling Tor Browser will not affect your system's software or settings either."
-msgstr ""
-
-#: C/uninstalling.page:20(page/p)
-msgid "Removing the Tor Browser from your system is simple:"
-msgstr ""
-
-#: C/uninstalling.page:26(item/p)
-msgid "Locate your Tor Browser folder. The default location is your Desktop."
-msgstr ""
-
-#: C/uninstalling.page:29(item/p)
-msgid "Delete the Tor Browser folder."
-msgstr ""
-
-#: C/uninstalling.page:32(item/p)
-msgid "Empty your Trash"
-msgstr ""
-
-#: C/uninstalling.page:36(page/p)
-msgid "Note that your operating system's standard \"Uninstall\" utility is not used."
-msgstr ""
-
1
0

18 May '14
commit c6776470ec8591056c17ef3c84c0e3d21f85bf3a
Author: Translation commit bot <translation(a)torproject.org>
Date: Sun May 18 18:15:03 2014 +0000
Update translations for bridgedb
---
de/LC_MESSAGES/bridgedb.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/de/LC_MESSAGES/bridgedb.po b/de/LC_MESSAGES/bridgedb.po
index ddb8b46..cac3db0 100644
--- a/de/LC_MESSAGES/bridgedb.po
+++ b/de/LC_MESSAGES/bridgedb.po
@@ -12,7 +12,7 @@ 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-05-16 18:39+0000\n"
-"PO-Revision-Date: 2014-05-18 17:41+0000\n"
+"PO-Revision-Date: 2014-05-18 17:51+0000\n"
"Last-Translator: to_ba\n"
"Language-Team: German (http://www.transifex.com/projects/p/torproject/language/de/)\n"
"MIME-Version: 1.0\n"
1
0