tor-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2011
- 16 participants
- 868 discussions
commit 2de86992bd17a018a3d6efc80944259ffb2d1885
Author: Tomas Touceda <chiiph(a)torproject.org>
Date: Mon Jun 13 11:02:45 2011 -0300
First part of interfacing TorControl
---
.../plugin/prototypes/TorControlPrototype.cpp | 463 ++++++++++++++++++++
.../plugin/prototypes/TorControlPrototype.h | 350 +++++++++++++++
2 files changed, 813 insertions(+), 0 deletions(-)
diff --git a/src/vidalia/plugin/prototypes/TorControlPrototype.cpp b/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
new file mode 100644
index 0000000..75e08d5
--- /dev/null
+++ b/src/vidalia/plugin/prototypes/TorControlPrototype.cpp
@@ -0,0 +1,463 @@
+#include "TorControlPrototype.h"
+
+TorControlPrototype::TorControlPrototype()
+ : QObject(), QScriptable() {}
+
+void
+TorControlPrototype::start(const QString &tor, const QStringList &args)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ obj->start(tor, args);
+}
+
+bool
+TorControlPrototype::stop(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->stop(errmsg);
+}
+
+bool
+TorControlPrototype::isRunning()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->isRunning();
+}
+
+bool
+TorControlPrototype::isVidaliaRunningTor()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->isVidaliaRunningTor();
+}
+
+void
+TorControlPrototype::closeTorStdout()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ obj->closeTorStdout();
+}
+
+void
+TorControlPrototype::connect(const QHostAddress &address, quint16 port)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ obj->connect(address, port);
+}
+
+void
+TorControlPrototype::connect(const QString &path)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ obj->connect(path);
+}
+
+void
+TorControlPrototype::disconnect()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ obj->disconnect();
+}
+
+bool
+TorControlPrototype::isConnected()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->isConnected();
+}
+
+bool
+TorControlPrototype::authenticate(const QByteArray cookie, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->authenticate(cookie, errmsg);
+}
+
+bool
+TorControlPrototype::authenticate(const QString &password = QString(), QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->authenticate(password, errmsg);
+}
+
+ProtocolInfo
+TorControlPrototype::protocolInfo(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->protocolInfo(errmsg);
+}
+
+BootstrapStatus
+TorControlPrototype::bootstrapStatus(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->bootstrapStatus(errmsg);
+}
+
+bool
+TorControlPrototype::isCircuitEstablished()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->isCircuitEstablished();
+}
+
+bool
+TorControlPrototype::getInfo(QHash<QString,QString> &map, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getInfo(map, errmsg);
+}
+
+bool
+TorControlPrototype::getInfo(QString key, QString &val, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getInfo(key, val, errmsg);
+}
+
+QVariantMap
+TorControlPrototype::getInfo(const QStringList &keys, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getInfo(keys, errmsg);
+}
+
+QVariant
+TorControlPrototype::getInfo(const QString &key, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getInfo(key, errmsg);
+}
+
+bool
+TorControlPrototype::signal(TorSignal::Signal sig, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->signal(sig, errmsg);
+}
+
+QHostAddress
+TorControlPrototype::getSocksAddress(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getSocksAddress(errmsg);
+}
+
+QStringList
+TorControlPrototype::getSocksAddressList(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getSocksAddressList(errmsg);
+}
+
+quint16
+TorControlPrototype::getSocksPort(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getSocksPort(errmsg);
+}
+
+QList
+TorControlPrototype::<quint16> getSocksPortList(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->quint16> getSocksPortList(errmsg);
+}
+
+QString
+TorControlPrototype::getTorVersionString()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getTorVersionString();
+}
+
+quint32
+TorControlPrototype::getTorVersion()
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getTorVersion();
+}
+
+bool
+TorControlPrototype::setEvent(TorEvents::Event e, bool add = true, bool set = true, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->setEvent(e, add, set, errmsg);
+}
+
+bool
+TorControlPrototype::setEvents(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->setEvents(errmsg);
+}
+
+bool
+TorControlPrototype::setConf(QHash<QString,QString> map, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->setConf(map, errmsg);
+}
+
+bool
+TorControlPrototype::setConf(QString key, QString value, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ returb obj->setConf(key, value, errmsg);
+}
+
+bool
+TorControlPrototype::setConf(QString keyAndValue, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->setConf(keyAndValue, errmsg);
+}
+
+bool
+TorControlPrototype::getConf(QHash<QString,QString> &map, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getConf(map, errmsg);
+}
+
+bool
+TorControlPrototype::getConf(QHash<QString,QStringList> &map, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getConf(map, errmsg);
+}
+
+bool
+TorControlPrototype::getConf(QString key, QString &value, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getConf(key, value, errmsg);
+}
+
+bool
+TorControlPrototype::getConf(QString key, QStringList &value, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getConf(key, value, errmsg);
+}
+
+QVariantMap
+TorControlPrototype::getConf(const QStringList &keys, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getConf(keys, errmsg);
+}
+
+QVariant
+TorControlPrototype::getConf(const QString &key, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getConf(key, errmsg);
+}
+
+QString
+TorControlPrototype::getHiddenServiceConf(const QString &key, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getHiddenServiceConf(key, errmsg);
+}
+
+bool
+TorControlPrototype::saveConf(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->saveConf(errmsg);
+}
+
+bool
+TorControlPrototype::resetConf(QStringList keys, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->resetConf(keys, errmsg);
+}
+
+bool
+TorControlPrototype::resetConf(QString key, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->resetConf(key, errmsg);
+}
+
+QStringList
+TorControlPrototype::getRouterDescriptorText(const QString &id, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getRouterDescriptorText(id, errmsg);
+}
+
+RouterDescriptor
+TorControlPrototype::getRouterDescriptor(const QString &id, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getRouterDescriptor(id, errmsg);
+}
+
+RouterStatus
+TorControlPrototype::getRouterStatus(const QString &id, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getRouterStatus(id, errmsg);
+}
+
+NetworkStatus
+TorControlPrototype::getNetworkStatus(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getNetworkStatus(errmsg);
+}
+
+DescriptorAnnotations
+TorControlPrototype::getDescriptorAnnotations(const QString &id, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getDescriptorAnnotations(id, errmsg);
+}
+
+CircuitList
+TorControlPrototype::getCircuits(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getCircuits(errmsg);
+}
+
+StreamList
+TorControlPrototype::getStreams(QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getStreams(errmsg);
+}
+
+AddressMap
+TorControlPrototype::getAddressMap(AddressMap::AddressMapType type = AddressMap::AddressMapAll, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->getAddressMap(type, errmsg);
+}
+
+QString
+TorControlPrototype::ipToCountry(const QHostAddress &ip, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->ipToCountry(ip, errmsg);
+}
+
+bool
+TorControlPrototype::closeCircuit(const CircuitId &circId, bool ifUnused = false, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->closeCircuit(circId, ifUnused, errmsg);
+}
+
+bool
+TorControlPrototype::closeStream(const StreamId &streamId, QString *errmsg = 0)
+{
+ TorControl *obj = qscriptvalue_cast<TorControl *>(thisObject());
+
+ if(obj)
+ return obj->closeStream(streamId, errmsg);
+}
diff --git a/src/vidalia/plugin/prototypes/TorControlPrototype.h b/src/vidalia/plugin/prototypes/TorControlPrototype.h
new file mode 100644
index 0000000..0327b74
--- /dev/null
+++ b/src/vidalia/plugin/prototypes/TorControlPrototype.h
@@ -0,0 +1,350 @@
+/*
+** This file is part of Vidalia, and is subject to the license terms in the
+** LICENSE file, found in the top level directory of this distribution. If
+** you did not receive the LICENSE file with this file, you may obtain it
+** from the Vidalia source package distributed by the Vidalia Project at
+** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
+** including this file, may be copied, modified, propagated, or distributed
+** except according to the terms described in the LICENSE file.
+*/
+
+/*
+** \file TorControlPrototype.h
+** \brief Object for interacting with the Tor process and control interface
+*/
+
+#ifndef _TORCONTROLPROTO_H
+#define _TORCONTROLPROTO_H
+
+#include <QtScript>
+
+#include "TorControl.h"
+
+class TorControlPrototype : public QObject, QScriptable
+{
+ Q_OBJECT
+
+public:
+ TorControlPrototype();
+
+ /** Start the Tor process */
+ Q_INVOKABLE void start(const QString &tor, const QStringList &args);
+ /** Stop the Tor process */
+ Q_INVOKABLE bool stop(QString *errmsg = 0);
+ /** Detect if the Tor process is running */
+ Q_INVOKABLE bool isRunning();
+ /** Detects if the Tor process is running under Vidalia. */
+ Q_INVOKABLE bool isVidaliaRunningTor();
+ /** Stops reading log messages from the Tor process's stdout. This has no
+ * effect if isVidaliaRunningTor() is false. */
+ Q_INVOKABLE void closeTorStdout();
+
+ /** Connect to Tor's control socket */
+ Q_INVOKABLE void connect(const QHostAddress &address, quint16 port);
+ Q_INVOKABLE void connect(const QString &path);
+ /** Disconnect from Tor's control socket */
+ Q_INVOKABLE void disconnect();
+ /** Check if we're connected to Tor's control socket */
+ Q_INVOKABLE bool isConnected();
+ /** Sends an authentication cookie to Tor. */
+ Q_INVOKABLE bool authenticate(const QByteArray cookie, QString *errmsg = 0);
+ /** Sends an authentication password to Tor. */
+ Q_INVOKABLE bool authenticate(const QString &password = QString(), QString *errmsg = 0);
+
+ /** Sends a PROTOCOLINFO command to Tor and parses the response. */
+ Q_INVOKABLE ProtocolInfo protocolInfo(QString *errmsg = 0);
+
+ /** Returns the Tor software's current bootstrap phase and status. */
+ Q_INVOKABLE BootstrapStatus bootstrapStatus(QString *errmsg = 0);
+
+ /** Returns true if Tor either has an open circuit or (on Tor >=
+ * 0.2.0.1-alpha) has previously decided it's able to establish a circuit. */
+ Q_INVOKABLE bool isCircuitEstablished();
+
+ /** Sends a GETINFO message to Tor based on the given keys */
+ Q_INVOKABLE bool getInfo(QHash<QString,QString> &map, QString *errmsg = 0);
+ /** Sends a GETINFO message for a single info value to Tor */
+ Q_INVOKABLE bool getInfo(QString key, QString &val, QString *errmsg = 0);
+
+ /** Sends a GETINFO message to Tor using the given list of <b>keys</b> and
+ * returns a QVariantMap containing the specified keys and their values as
+ * returned by Tor. Returns a default constructed QVariantMap on failure. */
+ Q_INVOKABLE QVariantMap getInfo(const QStringList &keys, QString *errmsg = 0);
+ /** Sends a GETINFO message to Tor with a single <b>key</b> and returns a
+ * QVariant containing the value returned by Tor. Returns a default
+ * constructed QVariant on failure. */
+ Q_INVOKABLE QVariant getInfo(const QString &key, QString *errmsg = 0);
+
+ /** Sends a signal to Tor */
+ Q_INVOKABLE bool signal(TorSignal::Signal sig, QString *errmsg = 0);
+
+ /** Returns an address on which Tor is listening for application
+ * requests. If none are available, a null QHostAddress is returned. */
+ Q_INVOKABLE QHostAddress getSocksAddress(QString *errmsg = 0);
+ /** Returns a (possibly empty) list of all currently configured
+ * SocksListenAddress entries. */
+ Q_INVOKABLE QStringList getSocksAddressList(QString *errmsg = 0);
+ /** Returns a valid SOCKS port for Tor, or 0 if Tor is not accepting
+ * application requests. */
+ Q_INVOKABLE quint16 getSocksPort(QString *errmsg = 0);
+ /** Returns a list of all currently configured SOCKS ports. If Tor is not
+ * accepting any application connections, an empty list will be returned. */
+ Q_INVOKABLE QList<quint16> getSocksPortList(QString *errmsg = 0);
+
+ /** Returns Tor's version as a string. */
+ Q_INVOKABLE QString getTorVersionString();
+ /** Returns Tor's version as a numeric value. */
+ Q_INVOKABLE quint32 getTorVersion();
+
+ /** Sets an event and its handler. If add is true, then the event is added,
+ * otherwise it is removed. If set is true, then the given event will be
+ * registered with Tor. */
+ Q_INVOKABLE bool setEvent(TorEvents::Event e, bool add = true, bool set = true,
+ QString *errmsg = 0);
+ /** Register events of interest with Tor */
+ Q_INVOKABLE bool setEvents(QString *errmsg = 0);
+
+ /** Sets each configuration key in <b>map</b> to the value associated with its key. */
+ Q_INVOKABLE bool setConf(QHash<QString,QString> map, QString *errmsg = 0);
+ /** Sets a single configuration key to the given value. */
+ Q_INVOKABLE bool setConf(QString key, QString value, QString *errmsg = 0);
+ /** Sets a single configuration string that is formatted <key=escaped value>. */
+ Q_INVOKABLE bool setConf(QString keyAndValue, QString *errmsg = 0);
+ /** Gets values for a set of configuration keys, each of which has a single
+ * value. */
+ Q_INVOKABLE bool getConf(QHash<QString,QString> &map, QString *errmsg = 0);
+ /** Gets a set of configuration keyvalues and stores them in <b>map</b>. */
+ Q_INVOKABLE bool getConf(QHash<QString,QStringList> &map, QString *errmsg = 0);
+ /** Gets a single configuration value for <b>key</b>. */
+ Q_INVOKABLE bool getConf(QString key, QString &value, QString *errmsg = 0);
+ /** Gets a list of configuration values for <b>key</b>. */
+ Q_INVOKABLE bool getConf(QString key, QStringList &value, QString *errmsg = 0);
+
+ /** Sends a GETCONF message to Tor using the given list of <b>keys</b> and
+ * returns a QVariantMap containing the specified keys and their values as
+ * returned by Tor. Returns a default constructed QVariantMap on failure. */
+ Q_INVOKABLE QVariantMap getConf(const QStringList &keys, QString *errmsg = 0);
+ /** Sends a GETCONF message to Tor with a single <b>key</b> and returns a
+ * QVariant containing the value returned by Tor. Returns a default
+ * constructed QVariant on failure. */
+ Q_INVOKABLE QVariant getConf(const QString &key, QString *errmsg = 0);
+ /** Sends a GETCONF message to Tor with the single key and returns a QString
+ * containing the value returned by Tor */
+ Q_INVOKABLE QString getHiddenServiceConf(const QString &key, QString *errmsg = 0);
+
+ /** Asks Tor to save the current configuration to its torrc */
+ Q_INVOKABLE bool saveConf(QString *errmsg = 0);
+ /** Tells Tor to reset the given configuration keys back to defaults. */
+ Q_INVOKABLE bool resetConf(QStringList keys, QString *errmsg = 0);
+ /** Tells Tor to reset a configuration key back to its default value. */
+ Q_INVOKABLE bool resetConf(QString key, QString *errmsg = 0);
+
+ /** Returns an unparsed router descriptor for the router whose fingerprint
+ * matches <b>id</b>. The returned text can later be parsed by the
+ * RouterDescriptor class. If <b>id</b> is invalid, then an empty
+ * QStringList is returned. */
+ Q_INVOKABLE QStringList getRouterDescriptorText(const QString &id, QString *errmsg = 0);
+ /** Returns the descriptor for the router whose fingerprint matches
+ * <b>id</b>. If <b>id</b> is invalid or the router's descriptor cannot be
+ * parsed, then an invalid RouterDescriptor is returned. */
+ Q_INVOKABLE RouterDescriptor getRouterDescriptor(const QString &id, QString *errmsg = 0);
+ /** Returns the status of the router whose fingerprint matches <b>id</b>. If
+ * <b>id</b> is invalid or the router's status cannot be parsed, then an
+ * invalid RouterStatus is returned. */
+ Q_INVOKABLE RouterStatus getRouterStatus(const QString &id, QString *errmsg = 0);
+ /** Returns a RouterStatus object for every known router in the network. If
+ * the network status document cannot be parsed, then an empty NetworkStatus
+ * is returned. */
+ Q_INVOKABLE NetworkStatus getNetworkStatus(QString *errmsg = 0);
+ /** Returns the annotations for the router whose fingerprint matches
+ * <b>id</b>. If <b>id</b> is invalid or the router's descriptor cannot be
+ * parsed, then an empty DescriptorAnnotations is returned and
+ * <b>errmsg</b> is set if it's not NULL. (Tor >= 0.2.0.13-alpha only) */
+ Q_INVOKABLE DescriptorAnnotations getDescriptorAnnotations(const QString &id,
+ QString *errmsg = 0);
+
+ /** Gets a list of current circuits. */
+ Q_INVOKABLE CircuitList getCircuits(QString *errmsg = 0);
+ /** Gets a list of current streams. */
+ Q_INVOKABLE StreamList getStreams(QString *errmsg = 0);
+
+ /** Gets a list of address mappings of the type specified by <b>type</b>
+ * (defaults to <i>AddressMapAll</i>. */
+ Q_INVOKABLE AddressMap getAddressMap(
+ AddressMap::AddressMapType type = AddressMap::AddressMapAll,
+ QString *errmsg = 0);
+
+ /** Gets the ISO-3166 two-letter country code for <b>ip</b> from Tor.
+ * Returns a default-constructed QString on failure or if a country code
+ * is not known for <b>ip</b>. On failure, <b>errmsg</b> will be set if
+ * it's not NULL. */
+ Q_INVOKABLE QString ipToCountry(const QHostAddress &ip, QString *errmsg = 0);
+
+public slots:
+ /** Closes the circuit specified by <b>circId</b>. If <b>ifUnused</b> is
+ * true, then the circuit will not be closed unless it is unused. */
+ bool closeCircuit(const CircuitId &circId, bool ifUnused = false,
+ QString *errmsg = 0);
+ /** Closes the stream specified by <b>streamId</b>. */
+ bool closeStream(const StreamId &streamId, QString *errmsg = 0);
+
+signals:
+ /** Emitted when the Tor process has started */
+ void started();
+ /** Emitted when the Tor process fails to start. */
+ void startFailed(QString errmsg);
+ /** Emitted when the Tor process has stopped */
+ void stopped(int exitCode, QProcess::ExitStatus exitStatus);
+ /** Emitted when the Tor process has stopped. */
+ void stopped();
+ /** Emitted when the controller has connected to Tor */
+ void connected();
+ /** Emitted when the controller failed to connect to Tor. */
+ void connectFailed(QString errmsg);
+ /** Emitted when the controller has disconnected from Tor */
+ void disconnected();
+ /** Emitted when the control socket is connected and authenticated. */
+ void authenticated();
+ /** Emitted when Tor rejects our authentication attempt. */
+ void authenticationFailed(QString errmsg);
+
+ /** Emitted when Tor writes the message <b>msg</b> to the control port
+ * with message severity <b>level</b>.
+ */
+ void logMessage(tc::Severity level, const QString &msg);
+
+ /** Emitted when Tor sends a bandwidth usage update (roughly once every
+ * second). <b>bytesReceived</b> is the number of bytes read by Tor over
+ * the previous second and <b>bytesWritten</b> is the number of bytes
+ * sent over the same interval.
+ */
+ void bandwidthUpdate(quint64 bytesReceived, quint64 bytesSent);
+
+ /** Emitted when the stream status of <b>stream</b> has changed.
+ */
+ void streamStatusChanged(const Stream &stream);
+
+ /** Emitted when the circuit status of <b>circuit</b> has changed.
+ */
+ void circuitStatusChanged(const Circuit &circuit);
+
+ /** Emitted when Tor has mapped the address <b>from</b> to the address
+ * <b>to</b>. <b>expires</b> indicates the time at which when the address
+ * mapping will no longer be considered valid.
+ */
+ void addressMapped(const QString &from, const QString &to,
+ const QDateTime &expires);
+
+ /** Emitted when Tor has received one or more new router descriptors.
+ * <b>ids</b> contains a list of digests of the new descriptors.
+ */
+ void newDescriptors(const QStringList &ids);
+
+ /** Indicates Tor has been able to successfully establish one or more
+ * circuits.
+ */
+ void circuitEstablished();
+
+ /** Indicates that Tor has decided the user's Tor software <b>version</b>
+ * is no longer recommended for some <b>reason</b>. <b>recommended</b> is
+ * a list of Tor software versions that are considered current.
+ */
+ void dangerousTorVersion(tc::TorVersionStatus reason,
+ const QString &version,
+ const QStringList &recommended);
+
+ /** Emitted during Tor's startup process to indicate how far in its
+ * bootstrapping process it has progressed. <b>status</b> may indicate
+ * the current bootstrapping stage or an error during bootstrapping.
+ */
+ void bootstrapStatusChanged(const BootstrapStatus &status);
+
+ /** Emitted when the user attempts to establish a connection to some
+ * destination on port <b>port</b>, which is a port known to use
+ * plaintext connections (as determined by Tor's WarnPlaintextPorts and
+ * RejectPlaintextPorts torrc options). <b>rejected</b> indicates whether
+ * Tor rejected the connection or permitted it to connect anyway.
+ */
+ void dangerousPort(quint16 port, bool rejected);
+
+ /** Emitted when Tor detects a problem with a SOCKS connection from the
+ * user, such as a bad hostname, dangerous SOCKS protocol type, or a bad
+ * hostname. <b>type</b> indicates the type of error encountered and
+ * <b>destination</b> (if non-empty) specifies the attempted connection
+ * destination address or hostname.
+ */
+ void socksError(tc::SocksError type, const QString &destination);
+
+ /** Emitted when Tor decides the client's external IP address has changed
+ * to <b>ip</b>. If <b>hostname</b> is non-empty, Tor obtained the new
+ * value for <b>ip</b> by resolving <b>hostname</b>.
+ */
+ void externalAddressChanged(const QHostAddress &ip, const QString &hostname);
+
+ /** Indicates that Tor has determined the client's clock is potentially
+ * skewed by <b>skew</b> seconds relative to <b>source</b>.
+ */
+ void clockSkewed(int skew, const QString &source);
+
+ /** Emitted when Tor has encountered an internal bug. <b>reason</b> is
+ * Tor's description of the bug.
+ */
+ void bug(const QString &reason);
+
+ /** Emitted when Tor determines that the user's DNS provider is providing
+ * an address for non-existent domains when it should really be saying
+ * "NXDOMAIN".
+ */
+ void dnsHijacked();
+
+ /** Emitted when Tor determines that the user's DNS provider is providing
+ * a hijacked address even for well-known websites.
+ */
+ void dnsUseless();
+
+ /** Indicates Tor has started testing the reachability of its OR port
+ * using the IP address <b>ip</b> and port <b>port</b>.
+ */
+ void checkingOrPortReachability(const QHostAddress &ip, quint16 port);
+
+ /** Tor has completed testing the reachability of its OR port using
+ * the IP address <b>ip</b> and port <b>port</b>. If the user's OR port
+ * was reachable, <b>reachable</b> will be set to true.
+ */
+ void orPortReachabilityFinished(const QHostAddress &ip, quint16 port,
+ bool reachable);
+
+ /** Indicates Tor has started testing the reachability of its directory
+ * port using the IP address <b>ip</b> and port <b>port</b>.
+ */
+ void checkingDirPortReachability(const QHostAddress &ip, quint16 port);
+
+ /** Tor has completed testing the reachability of its directory port using
+ * the IP address <b>ip</b> and port <b>port</b>. If the user's directory
+ * port was reachable, <b>reachable</b> will be set to true.
+ */
+ void dirPortReachabilityFinished(const QHostAddress &ip, quint16 port,
+ bool reachable);
+
+ /** Emitted when the directory authority with IP address <b>ip</b> and
+ * port <b>port</b> rejected the user's server descriptor. <b>reason</b>
+ * describes why the descriptor was rejected (e.g., malformed, skewed
+ * clock, etc.).
+ */
+ void serverDescriptorRejected(const QHostAddress &ip, quint16 port,
+ const QString &reason);
+
+ /** Emitted when the directory authority with IP address <b>ip</b> and
+ * port <b>port</b> accepted the user's server descriptor.
+ */
+ void serverDescriptorAccepted(const QHostAddress &ip, quint16 port);
+
+ /** Emitted when at least one directory authority has accepted the user's
+ * server descriptor.
+ */
+ void serverDescriptorAccepted();
+};
+
+#endif
+
+
1
0
commit db3a4f43ed310b5e1e1fe778dfe8d6cf3c405ead
Author: Tomas Touceda <chiiph(a)gentoo.org>
Date: Thu Jun 2 14:02:26 2011 -0300
Provide more useful output
---
src/vidalia/plugin/DebugDialog.cpp | 41 +++++++++++++---
src/vidalia/plugin/DebugDialog.h | 11 ++++-
src/vidalia/plugin/DebugDialog.ui | 38 +++++++++++++++-
src/vidalia/plugin/PluginEngine.cpp | 24 ++++++----
src/vidalia/plugin/PluginWrapper.cpp | 83 ++++++++++++++++++++++++++-------
src/vidalia/plugin/PluginWrapper.h | 1 +
6 files changed, 159 insertions(+), 39 deletions(-)
diff --git a/src/vidalia/plugin/DebugDialog.cpp b/src/vidalia/plugin/DebugDialog.cpp
index b05fbe0..df2aa1e 100644
--- a/src/vidalia/plugin/DebugDialog.cpp
+++ b/src/vidalia/plugin/DebugDialog.cpp
@@ -1,28 +1,53 @@
#include "DebugDialog.h"
-QStringList DebugDialog::buffer;
+QStringList DebugDialog::outputBuffer;
+QStringList DebugDialog::syntaxBuffer;
+QStringList DebugDialog::exceptBuffer;
DebugDialog::DebugDialog(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
- foreach(QString line, buffer)
- ui.textEdit->setPlainText(QString("%1\n%2")
- .arg(ui.textEdit->toPlainText())
- .arg(line));
+ fillText(ui.tedOutput, outputBuffer);
+ fillText(ui.tedSyntax, syntaxBuffer);
+ fillText(ui.tedExceptions, exceptBuffer);
}
DebugDialog::~DebugDialog() {}
void
-DebugDialog::pDebug(const QString &msg)
+DebugDialog::fillText(QTextEdit *tedit, QStringList buffer)
+{
+ foreach(QString line, buffer) {
+ tedit->setPlainText(QString("%1\n%2")
+ .arg(tedit->toPlainText())
+ .arg(line));
+ }
+}
+
+void
+DebugDialog::outputDebug(const QString &msg)
+{
+ outputBuffer << msg;
+}
+
+void
+DebugDialog::syntaxDebug(const QString &msg)
+{
+ syntaxBuffer << msg;
+}
+
+void
+DebugDialog::exceptDebug(const QString &msg)
{
- buffer << msg;
+ exceptBuffer << msg;
}
void
DebugDialog::clear()
{
- buffer.clear();
+ outputBuffer.clear();
+ syntaxBuffer.clear();
+ exceptBuffer.clear();
}
diff --git a/src/vidalia/plugin/DebugDialog.h b/src/vidalia/plugin/DebugDialog.h
index ec69c3e..76b3bb6 100644
--- a/src/vidalia/plugin/DebugDialog.h
+++ b/src/vidalia/plugin/DebugDialog.h
@@ -13,11 +13,18 @@ class DebugDialog : public QDialog
DebugDialog(QWidget *parent = 0);
~DebugDialog();
- static void pDebug(const QString &msg);
+ void fillText(QTextEdit *tedit, QStringList buffer);
+
+ static void outputDebug(const QString &msg);
+ static void syntaxDebug(const QString &msg);
+ static void exceptDebug(const QString &msg);
+
static void clear();
private:
- static QStringList buffer;
+ static QStringList outputBuffer;
+ static QStringList syntaxBuffer;
+ static QStringList exceptBuffer;
Ui::DebugDialog ui;
};
diff --git a/src/vidalia/plugin/DebugDialog.ui b/src/vidalia/plugin/DebugDialog.ui
index 1ad0d2f..1107c3a 100644
--- a/src/vidalia/plugin/DebugDialog.ui
+++ b/src/vidalia/plugin/DebugDialog.ui
@@ -18,8 +18,42 @@
<normaloff>:/images/16x16/applications-system.png</normaloff>:/images/16x16/applications-system.png</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
- <item row="0" column="1" rowspan="2">
- <widget class="QTextEdit" name="textEdit"/>
+ <item row="0" column="0">
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="outputTab">
+ <attribute name="title">
+ <string>Plugin Output</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTextEdit" name="tedOutput"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="syntaxTab">
+ <attribute name="title">
+ <string>Syntax Errors</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QTextEdit" name="tedSyntax"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="errorTab">
+ <attribute name="title">
+ <string>Exceptions</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QTextEdit" name="tedExceptions"/>
+ </item>
+ </layout>
+ </widget>
+ </widget>
</item>
</layout>
</widget>
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
index bad9c65..883dc24 100644
--- a/src/vidalia/plugin/PluginEngine.cpp
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -21,16 +21,18 @@ PluginEngine::~PluginEngine()
void
PluginEngine::loadAllPlugins()
{
- DebugDialog::pDebug("loadAllPlugins()");
+ DebugDialog::outputDebug("Loading all plugins...");
VidaliaSettings settings;
QDir path = QDir(settings.pluginPath());
- qWarning() << "PluginPath" << path.absolutePath();
+ DebugDialog::outputDebug(QString("PluginPath=%1").arg(path.absolutePath()));
foreach(QString pdir, path.entryList(QDir::NoDotAndDotDot|QDir::AllDirs)) {
- qWarning() << "pdir" << pdir;
- QFileInfo finfo(QString("%1%2%3").arg(path.absolutePath()).arg(QDir::separator()).arg(pdir));
+ QFileInfo finfo(QString("%1%2%3")
+ .arg(path.absolutePath())
+ .arg(QDir::separator())
+ .arg(pdir));
if(finfo.isDir()) {
tryLoadPlugin(finfo.filePath());
@@ -41,18 +43,22 @@ PluginEngine::loadAllPlugins()
void
PluginEngine::tryLoadPlugin(QDir path)
{
- qWarning() << "tryLoadPlugin()" << path.absolutePath();
-
QStringList files = path.entryList();
- if(!files.contains("info.xml"))
+ if(!files.contains("info.xml")) {
+ DebugDialog::outputDebug(tr("WARNING: %1 doesn't have an info file.")
+ .arg(path.absolutePath()));
return;
+ }
- PluginWrapper *wrapper = new PluginWrapper(QString("%1%2info.xml").arg(path.absolutePath()).arg(QDir::separator()), this);
+ PluginWrapper *wrapper = new PluginWrapper(QString("%1%2info.xml")
+ .arg(path.absolutePath())
+ .arg(QDir::separator()), this);
// if it's persistent, start it right away
- if(wrapper->isPersistent())
+ if(wrapper->isPersistent()) {
wrapper->start();
+ }
wrappers << wrapper;
diff --git a/src/vidalia/plugin/PluginWrapper.cpp b/src/vidalia/plugin/PluginWrapper.cpp
index 8e839fa..2736dbc 100644
--- a/src/vidalia/plugin/PluginWrapper.cpp
+++ b/src/vidalia/plugin/PluginWrapper.cpp
@@ -1,5 +1,6 @@
#include "PluginWrapper.h"
#include "PluginEngine.h"
+#include "DebugDialog.h"
#include <QtXml>
@@ -12,13 +13,25 @@ PluginWrapper::PluginWrapper(const QString &info_path, PluginEngine *engine, QOb
processInfo(info_path);
foreach(QString path, _files) {
- qWarning() << path;
+ DebugDialog::outputDebug(tr("%1: Processing...").arg(name()));
+
QFile file(path);
if(file.open(QIODevice::ReadOnly)) {
- _engine->evaluate(file.readAll());
- qWarning() << "evaluated";
+ QString contents = file.readAll();
+ QScriptSyntaxCheckResult res = QScriptEngine::checkSyntax(contents);
+ if(res.state() == QScriptSyntaxCheckResult::Valid) {
+ DebugDialog::outputDebug("Everything's ok, evaluating...");
+ _engine->evaluate(contents);
+ } else {
+ DebugDialog::syntaxDebug(tr("%4: ERROR: Line: %1 - Column: %2\n%3")
+ .arg(res.errorLineNumber())
+ .arg(res.errorColumnNumber())
+ .arg(res.errorMessage())
+ .arg(name()));
+ }
} else
- qWarning() << "Error opening file";
+ DebugDialog::outputDebug(tr("%1: Error opening file %2")
+ .arg(name()).arg(path));
}
}
@@ -27,17 +40,23 @@ PluginWrapper::~PluginWrapper() {}
void
PluginWrapper::processInfo(const QString &path)
{
- qWarning() << "processInfo()";
-
QDomDocument info("Plugin Info");
QFile file(path);
if(!file.open(QIODevice::ReadOnly)) {
- qWarning() << "Problem opening xml file";
+ DebugDialog::outputDebug(tr("%2: ERROR: Cannot open %1")
+ .arg(path).arg(name()));
return;
}
- if(!info.setContent(&file)) {
- qWarning() << "Problem setting contents";
+ QString errMsg;
+ int errLine, errCol;
+
+ if(!info.setContent(&file, false, &errMsg, &errLine, &errCol)) {
+ DebugDialog::syntaxDebug(tr("%2: ERROR: Parsing %1")
+ .arg(file.fileName()).arg(name()));
+ DebugDialog::syntaxDebug(tr("Line: %1 - Column: %2\nMessage: %3")
+ .arg(errLine).arg(errCol).arg(errMsg));
+
file.close();
return;
}
@@ -82,29 +101,55 @@ PluginWrapper::processInfo(const QString &path)
void
PluginWrapper::start()
{
+ DebugDialog::outputDebug(tr("%1: Starting...").arg(name()));
_engine->evaluate(QString("%1.start()").arg(nspace()));
+ checkExceptions();
}
void
PluginWrapper::stop()
{
+ DebugDialog::outputDebug(tr("%1: Stoping...").arg(name()));
_engine->evaluate(QString("%1.stop()").arg(nspace()));
+ checkExceptions();
}
VidaliaTab *
PluginWrapper::buildGUI()
{
- if(!hasGUI())
+ if(!hasGUI()) {
+ DebugDialog::outputDebug(tr("%1: WARNING: doesn't have a GUI, and buildGUI() was called")
+ .arg(name()));
+ if(checkExceptions())
+ return NULL;
+ }
+
+ VidaliaTab *tab = qscriptvalue_cast<VidaliaTab *>(
+ _engine->evaluate(QString("%1.buildGUI()").arg(nspace())));
+
+ if(checkExceptions())
return NULL;
- VidaliaTab *tab = qscriptvalue_cast<VidaliaTab *>(_engine->evaluate(QString("%1.buildGUI()").arg(nspace())));
+
+ return tab;
+}
+
+bool
+PluginWrapper::checkExceptions()
+{
if(_engine->hasUncaughtException()) {
- qWarning() << "Exception:";
- qWarning() << _engine->uncaughtExceptionLineNumber();
+ DebugDialog::exceptDebug(tr("%2:\n*** Exception in line %1")
+ .arg(_engine->uncaughtExceptionLineNumber())
+ .arg(name()));
+ DebugDialog::exceptDebug(tr("*** Backtrace:"));
+ foreach(QString line, _engine->uncaughtExceptionBacktrace())
+ DebugDialog::exceptDebug(line);
- return NULL;
+ _engine->clearExceptions();
+
+ return true;
}
- qWarning() << "Casted tab:" << tab << nspace();
- return tab;
+
+ return false;
}
bool
@@ -122,6 +167,8 @@ PluginWrapper::isPersistent()
QString
PluginWrapper::name() const
{
+ if(_name.isEmpty())
+ return tr("(untitled)");
return _name;
}
@@ -173,6 +220,6 @@ PluginWrapper::emitPluginTab()
if(tab)
emit pluginTab(tab);
else
- // TODO: make this more than a console print
- qWarning() << "Error: buildGUI() failed for plugin" << name();
+ DebugDialog::exceptDebug(tr("Error: buildGUI() failed for plugin %1")
+ .arg(name()));
}
diff --git a/src/vidalia/plugin/PluginWrapper.h b/src/vidalia/plugin/PluginWrapper.h
index d99538c..15f7853 100644
--- a/src/vidalia/plugin/PluginWrapper.h
+++ b/src/vidalia/plugin/PluginWrapper.h
@@ -38,6 +38,7 @@ class PluginWrapper : public QObject {
protected:
void processInfo(const QString &path);
+ bool checkExceptions();
PluginEngine *_engine;
QString _name, _date, _author;
1
0
commit 1f6d58a5568782e79fdbb17a6c73a20f1ea91075
Author: Tomas Touceda <chiiph(a)gentoo.org>
Date: Thu Jun 2 00:23:20 2011 -0300
Creates a simple debug output dialog
Every problem, whether exception or syntax problem, will be displayed in here.
---
src/vidalia/CMakeLists.txt | 3 +++
src/vidalia/MainWindow.cpp | 13 +++++++++++++
src/vidalia/MainWindow.h | 4 ++++
src/vidalia/plugin/DebugDialog.cpp | 28 ++++++++++++++++++++++++++++
src/vidalia/plugin/DebugDialog.h | 26 ++++++++++++++++++++++++++
src/vidalia/plugin/DebugDialog.ui | 30 ++++++++++++++++++++++++++++++
src/vidalia/plugin/PluginEngine.cpp | 3 ++-
7 files changed, 106 insertions(+), 1 deletions(-)
diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt
index 4cbe458..7dac60e 100644
--- a/src/vidalia/CMakeLists.txt
+++ b/src/vidalia/CMakeLists.txt
@@ -86,11 +86,13 @@ qt4_wrap_cpp(vidalia_SRCS
set(vidalia_SRCS ${vidalia_SRCS}
plugin/PluginEngine.cpp
plugin/PluginWrapper.cpp
+ plugin/DebugDialog.cpp
plugin/prototypes/VidaliaTabPrototype.cpp
)
qt4_wrap_cpp(vidalia_SRCS
plugin/PluginEngine.h
plugin/PluginWrapper.h
+ plugin/DebugDialog.h
plugin/prototypes/VidaliaTabPrototype.h
)
@@ -216,6 +218,7 @@ qt4_wrap_ui(vidalia_SRCS
help/browser/HelpBrowser.ui
network/NetViewer.ui
network/RouterInfoDialog.ui
+ plugin/DebugDialog.ui
)
## Add the resource files (icons, etc.)
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index bd72346..bcc3538 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -38,6 +38,7 @@
#include "procutil.h"
#include "PluginWrapper.h"
+#include "DebugDialog.h"
#include <QtGui>
@@ -153,6 +154,7 @@ MainWindow::createActions()
_actionAbout = new QAction(QIcon(IMG_ABOUT), tr("About"), this);
_actionStartStopTor = new QAction(QIcon(IMG_START_TOR_16), tr("Start Tor"), this);
_actionExit = new QAction(QIcon(IMG_EXIT), tr("Exit"), this);
+ _actionDebugDialog = new QAction(tr("Debug output"), this);
}
/** Creates the menu bar */
@@ -184,6 +186,8 @@ MainWindow::createMenuBar()
foreach(QAction *action, _engine->getAllActions()) {
pluginsMenu->addAction(action);
}
+ pluginsMenu->addSeparator();
+ pluginsMenu->addAction(_actionDebugDialog);
QMenu *helpMenu = menu->addMenu(tr("Help"));
helpMenu->addAction(_actionVidaliaHelp);
@@ -334,6 +338,8 @@ MainWindow::createConnections()
connect(_actionStatus, SIGNAL(triggered()), this, SLOT(showStatusTab()));
connect(_actionNetworkMap, SIGNAL(triggered()), this, SLOT(showNetViewerTab()));
+ connect(_actionDebugDialog, SIGNAL(triggered()), this, SLOT(showDebugDialog()));
+
/* Catch signals when the application is running or shutting down */
connect(vApp, SIGNAL(running()), this, SLOT(running()));
connect(vApp, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuit()));
@@ -1644,6 +1650,13 @@ MainWindow::showNetViewerTab()
addTab(&_netViewer);
}
+void
+MainWindow::showDebugDialog()
+{
+ DebugDialog dlg;
+ dlg.exec();
+}
+
#if defined(USE_MINIUPNPC)
/** Called when a UPnP error occurs. */
void
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index 8172f71..21ab1a2 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -138,6 +138,9 @@ private slots:
void showHelpDialog();
/** Called when a child window requests the given help <b>topic</b>. */
void showHelpDialog(const QString &topic);
+
+ /** Displays the debug output dialog for plugins */
+ void showDebugDialog();
/** Adds a new tab to the MainWindow */
void addTab(VidaliaTab *tab);
@@ -301,6 +304,7 @@ private:
QAction *_actionVidaliaHelp;
QAction *_actionAbout;
QAction *_actionExit;
+ QAction *_actionDebugDialog;
Ui::MainWindow ui; /**< Qt Designer generated object. */
diff --git a/src/vidalia/plugin/DebugDialog.cpp b/src/vidalia/plugin/DebugDialog.cpp
new file mode 100644
index 0000000..b05fbe0
--- /dev/null
+++ b/src/vidalia/plugin/DebugDialog.cpp
@@ -0,0 +1,28 @@
+#include "DebugDialog.h"
+
+QStringList DebugDialog::buffer;
+
+DebugDialog::DebugDialog(QWidget *parent)
+ : QDialog(parent)
+{
+ ui.setupUi(this);
+
+ foreach(QString line, buffer)
+ ui.textEdit->setPlainText(QString("%1\n%2")
+ .arg(ui.textEdit->toPlainText())
+ .arg(line));
+}
+
+DebugDialog::~DebugDialog() {}
+
+void
+DebugDialog::pDebug(const QString &msg)
+{
+ buffer << msg;
+}
+
+void
+DebugDialog::clear()
+{
+ buffer.clear();
+}
diff --git a/src/vidalia/plugin/DebugDialog.h b/src/vidalia/plugin/DebugDialog.h
new file mode 100644
index 0000000..ec69c3e
--- /dev/null
+++ b/src/vidalia/plugin/DebugDialog.h
@@ -0,0 +1,26 @@
+#ifndef DEBUGDIALOG_H
+#define DEBUGDIALOG_H
+
+#include <QtGui>
+
+#include "ui_DebugDialog.h"
+
+class DebugDialog : public QDialog
+{
+ Q_OBJECT
+
+ public:
+ DebugDialog(QWidget *parent = 0);
+ ~DebugDialog();
+
+ static void pDebug(const QString &msg);
+ static void clear();
+
+ private:
+ static QStringList buffer;
+
+ Ui::DebugDialog ui;
+};
+
+#endif
+
diff --git a/src/vidalia/plugin/DebugDialog.ui b/src/vidalia/plugin/DebugDialog.ui
new file mode 100644
index 0000000..1ad0d2f
--- /dev/null
+++ b/src/vidalia/plugin/DebugDialog.ui
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DebugDialog</class>
+ <widget class="QDialog" name="DebugDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>491</width>
+ <height>254</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Plugin debug output</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="../res/vidalia.qrc">
+ <normaloff>:/images/16x16/applications-system.png</normaloff>:/images/16x16/applications-system.png</iconset>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="1" rowspan="2">
+ <widget class="QTextEdit" name="textEdit"/>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../res/vidalia.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
index c7b74ea..bad9c65 100644
--- a/src/vidalia/plugin/PluginEngine.cpp
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -1,6 +1,7 @@
#include "PluginEngine.h"
#include "VidaliaSettings.h"
#include "PluginWrapper.h"
+#include "DebugDialog.h"
PluginEngine::PluginEngine(QObject *parent)
: QScriptEngine(parent)
@@ -20,7 +21,7 @@ PluginEngine::~PluginEngine()
void
PluginEngine::loadAllPlugins()
{
- qWarning() << "loadAllPlugins()";
+ DebugDialog::pDebug("loadAllPlugins()");
VidaliaSettings settings;
QDir path = QDir(settings.pluginPath());
1
0

02 Jul '11
commit 38044c9518ef6335b9499043c3dca965d000e9e6
Author: Tomas Touceda <chiiph(a)gentoo.org>
Date: Wed Jun 1 23:44:10 2011 -0300
Improve communication between modules
Takes out the hacky casts and parent handling for a more Qt-ish way of
doing this.
---
src/vidalia/MainWindow.cpp | 12 +++---------
src/vidalia/MainWindow.h | 4 ++--
src/vidalia/plugin/PluginEngine.cpp | 23 ++++++++++++++---------
src/vidalia/plugin/PluginEngine.h | 10 ++++++++++
src/vidalia/plugin/PluginWrapper.cpp | 23 ++++++++++++++++++++++-
src/vidalia/plugin/PluginWrapper.h | 6 ++++++
6 files changed, 57 insertions(+), 21 deletions(-)
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index 931df1c..bd72346 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -183,7 +183,6 @@ MainWindow::createMenuBar()
QMenu *pluginsMenu = menu->addMenu(tr("Plugins"));
foreach(QAction *action, _engine->getAllActions()) {
pluginsMenu->addAction(action);
- connect(action, SIGNAL(triggered()), this, SLOT(showPluginTab()));
}
QMenu *helpMenu = menu->addMenu(tr("Help"));
@@ -414,6 +413,9 @@ MainWindow::createConnections()
_proxyProcess = new HelperProcess(this);
connect(_proxyProcess, SIGNAL(startFailed(QString)),
this, SLOT(onProxyFailed(QString)));
+
+ connect(_engine, SIGNAL(pluginTab(VidaliaTab *)),
+ this, SLOT(addTab(VidaliaTab *)));
}
/** Called when the application is closing, by selecting "Exit" from the tray
@@ -1593,14 +1595,6 @@ MainWindow::delTab(int index)
}
void
-MainWindow::showPluginTab()
-{
- QAction *act = qobject_cast<QAction *>(sender());
- PluginWrapper *wrapper = qobject_cast<PluginWrapper *>(act->parent());
- addTab(wrapper->buildGUI());
-}
-
-void
MainWindow::showStatusTab()
{
addTab(&_statusTab);
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index e5366b8..8172f71 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -144,8 +144,8 @@ private slots:
/** Deletes the tab at index if it exists and it isn't the Status tab */
void delTab(int index = -1);
- /** Handles adding a new tab corresponding to a plugin */
- void showPluginTab();
+// /** Handles adding a new tab corresponding to a plugin */
+// void showPluginTab();
/** Called when the web browser or IM client have stopped */
void onSubprocessFinished(int exitCode, QProcess::ExitStatus exitStatus);
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
index fe85883..c7b74ea 100644
--- a/src/vidalia/plugin/PluginEngine.cpp
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -5,19 +5,17 @@
PluginEngine::PluginEngine(QObject *parent)
: QScriptEngine(parent)
{
- // load prototypes
- VidaliaTabPrototype vtabproto;
- QScriptValue vtabscript = newQObject(&vtabproto, QScriptEngine::ScriptOwnership);
- setDefaultPrototype(qMetaTypeId<VidaliaTab *>(), vtabscript);
-
- // load constructors
- QScriptValue vtabctor = newFunction(VidaliaTabPrototype::constructor, vtabscript);
- globalObject().setProperty("VidaliaTab", vtabctor);
+ ADD_CLASS("VidaliaTab", VidaliaTabPrototype, VidaliaTab *,
+ VidaliaTabPrototype::constructor)
loadAllPlugins();
}
-PluginEngine::~PluginEngine() {}
+PluginEngine::~PluginEngine()
+{
+ foreach(PluginWrapper *wrapper, wrappers)
+ wrapper->stop();
+}
void
PluginEngine::loadAllPlugins()
@@ -50,7 +48,14 @@ PluginEngine::tryLoadPlugin(QDir path)
return;
PluginWrapper *wrapper = new PluginWrapper(QString("%1%2info.xml").arg(path.absolutePath()).arg(QDir::separator()), this);
+
+ // if it's persistent, start it right away
+ if(wrapper->isPersistent())
+ wrapper->start();
+
wrappers << wrapper;
+
+ connect(wrapper, SIGNAL(pluginTab(VidaliaTab *)), this, SIGNAL(pluginTab(VidaliaTab *)));
}
QList<QAction *>
diff --git a/src/vidalia/plugin/PluginEngine.h b/src/vidalia/plugin/PluginEngine.h
index 09bff23..7876803 100644
--- a/src/vidalia/plugin/PluginEngine.h
+++ b/src/vidalia/plugin/PluginEngine.h
@@ -8,6 +8,13 @@
class PluginWrapper;
+#define ADD_CLASS(name, protoType, absType, ctor) \
+ protoType __proto; \
+ QScriptValue __script = newQObject(&__proto, QScriptEngine::ScriptOwnership); \
+ setDefaultPrototype(qMetaTypeId<absType>(), __script); \
+ QScriptValue __ctor = newFunction(ctor, __script); \
+ globalObject().setProperty(name, __ctor);
+
class PluginEngine : public QScriptEngine {
Q_OBJECT
@@ -17,6 +24,9 @@ class PluginEngine : public QScriptEngine {
QList<QAction *> getAllActions();
+ signals:
+ void pluginTab(VidaliaTab *);
+
protected:
void loadAllPlugins();
void tryLoadPlugin(QDir path);
diff --git a/src/vidalia/plugin/PluginWrapper.cpp b/src/vidalia/plugin/PluginWrapper.cpp
index b06b863..8e839fa 100644
--- a/src/vidalia/plugin/PluginWrapper.cpp
+++ b/src/vidalia/plugin/PluginWrapper.cpp
@@ -100,6 +100,8 @@ PluginWrapper::buildGUI()
if(_engine->hasUncaughtException()) {
qWarning() << "Exception:";
qWarning() << _engine->uncaughtExceptionLineNumber();
+
+ return NULL;
}
qWarning() << "Casted tab:" << tab << nspace();
return tab;
@@ -150,8 +152,27 @@ PluginWrapper::files() const
QAction *
PluginWrapper::menuAction()
{
+ _action = new QAction(_name, this);
+
if(hasGUI()) {
- _action = new QAction(_name, this);
+ connect(_action, SIGNAL(triggered()), this, SLOT(emitPluginTab()));
+ }
+
+ // if it hasn't been started yet
+ if(!isPersistent()) {
+ connect(_action, SIGNAL(triggered()), this, SLOT(start()));
}
+
return _action;
}
+
+void
+PluginWrapper::emitPluginTab()
+{
+ VidaliaTab *tab = buildGUI();
+ if(tab)
+ emit pluginTab(tab);
+ else
+ // TODO: make this more than a console print
+ qWarning() << "Error: buildGUI() failed for plugin" << name();
+}
diff --git a/src/vidalia/plugin/PluginWrapper.h b/src/vidalia/plugin/PluginWrapper.h
index 1c7ad8f..d99538c 100644
--- a/src/vidalia/plugin/PluginWrapper.h
+++ b/src/vidalia/plugin/PluginWrapper.h
@@ -25,11 +25,17 @@ class PluginWrapper : public QObject {
QAction *menuAction();
+ signals:
+ void pluginTab(VidaliaTab *);
+
public slots:
void start();
void stop();
VidaliaTab *buildGUI();
+ private slots:
+ void emitPluginTab();
+
protected:
void processInfo(const QString &path);
1
0

[vidalia/alpha] Add first draft of the plugin framework documentation
by chiiph@torproject.org 02 Jul '11
by chiiph@torproject.org 02 Jul '11
02 Jul '11
commit 5bed9056139a2d33042995f1f0e7838fb43c9a3d
Author: Tomas Touceda <chiiph(a)gentoo.org>
Date: Tue May 17 13:50:31 2011 -0300
Add first draft of the plugin framework documentation
---
doc/plugin-framework.txt | 153 ++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 153 insertions(+), 0 deletions(-)
diff --git a/doc/plugin-framework.txt b/doc/plugin-framework.txt
new file mode 100644
index 0000000..e00ab8c
--- /dev/null
+++ b/doc/plugin-framework.txt
@@ -0,0 +1,153 @@
+Plugin Framework specification
+
+1. Directory structure:
+
+ Each plugin will live inside its own directory, separated from all the
+ other plugins.
+ The directory will contain the following:
+ info.xml *
+ <file>.js **
+ <subdir>/ ***
+
+ * The plugin description will live inside an XML file named info.xml,
+ its specification will be specified later.
+
+ ** Each source code file that the plugin uses will have a "js"
+ extension. The plugin may contain any other kind of files, along with
+ other source code files.
+
+ *** The plugin may contain any sort of directory dispositions. The
+ developer can reference files within subdirectories freely. The main
+ file can live anywhere within the plugin directory, as long as its
+ relative path is specified correctly in the info.xml file.
+
+2. Definition file:
+
+ The definition file for a plugin will be a XML file with the following DTD:
+
+ <!DOCTYPE VidaliaPlugin [
+ <!ENTITY name (#CDATA)>
+ <!ENTITY date (#CDATA)>
+ <!ENTITY author (#CDATA)>
+ <!ENTITY type (EMPTY)>
+ <!ATTLIST type persistent CDATA "false">
+ <!ATTLIST type gui CDATA "false">
+ <!ENTITY files (file+)>
+ <!ENTITY file (#CDATA)>
+ <!ENTITY namespace (#CDATA)>
+ ]>
+
+ Short description:
+ - Name, date and author are self explanatory.
+ - Type:
+ - Persistent: A plugin is persistent if it starts when Vidalia starts,
+ and it doesn't matter if the GUI (if it has one) is visible or not, the
+ plugin code is in execution.
+ - GUI: True if the plugin has a GUI.
+ - Files: Plugins may contain several source code files. The different
+ functions that must be implemented for it to work may be divided into
+ several files, or just one. Whatever the case may be, the files that the
+ plugin engine has to load must be specified in here. The plugin may use
+ other files, which don't need to be listed.
+ - Namespace: Each plugin will have its own namespace to avoid function
+ name collisions (the main functions will be named the same)
+
+3. Plugin functions:
+
+ Each plugin must implement the following functions:
+ start() : void
+ stop() : void
+ buildGUI() : VidaliaTab *
+
+ If the plugin isn't a GUI one, a default implementation will be added
+ that returns QScriptValue::NullValue.
+ Plugins may use several different files to implement its functionality.
+ To include files within other files use:
+
+ include("path/to/file.js")
+
+ This will be implemented by Vidalia's engine, it's not a native include
+ call. Another possibility would be to just list the file in the info.xml
+ file, and the engine will load it automatically and in order.
+
+4. Building an interface for a class to be used in a plugin:
+
+ To provide any class to be used in a plugin, there are two main parts to
+ implement: the constructor, and the prototype:
+ - Constructor: each constructable object in a plugin need to have
+ a static constructor function implemented with the following
+ signature:
+
+ QScriptValue f(QScriptContext *, QScriptEngine *)
+
+ - Prototype: A prototype is a wrapper for a metatype's methods. This
+ methods are what will be visible inside the plugin for a given
+ object.
+
+ The prototype class must inherit from QObject and QScriptable.
+ All types used in the plugin must be handled this way, and must be
+ declared as a Qt Metatype. Each interface must handle the metatype
+ declaration.
+
+5. Settings:
+
+ For specifying where the plugins live, there will be a new item in
+ Vidalia's configuration file: PluginPath. Which will contain the absolute
+ path of the plugins.
+
+6. Plugin engine:
+
+ All plugins will leave in the same environment (QScriptEngine). When
+ Vidalia starts, it starts the plugin engine.
+ Here's a bit of pseudo-code to get an idea of the loading process.
+
+ 6.1. Startup:
+
+ foreach provided_class: (1)
+ load_prototype (2)
+ load_constructor (3)
+
+ scan_plugin_directory (4)
+ foreach directory:
+ info = load_info_file (5)
+ wrapper = plugin_wrapper(info) (6)
+ if info.persistent:
+ wrapper.start() (7)
+ if info.gui:
+ plugin_menu.addAction(wrapper.menu_action()) (8)
+
+ (1) This loop will be probably hardcoded, since there isn't any way to
+ iterate through every class that we want to provide for the plugins.
+ (2) First we need to load the prototype for the given metatype.
+ (3) Then we can add a constructor for the metatype as a function of the
+ global script engine interpreter.
+ (4) Scan the PluginPath for directories that contain the info.xml
+ file.
+ (5) Interpret the info file to see what kind of plugin we are dealing
+ with.
+ (6) A plugin wrapper is an object that abstracts the actual calls to
+ the methods we know the plugin must implement with its corresponding
+ namespace.
+ (7) If it's a persistent plugin, then start it.
+ (8) If it's a gui plugin, add the entry to the plugin menu. If the
+ plugin is also persistent, then the menu action will be linked to
+ a show() function instead of the start(), since the plugin will be
+ already loaded.
+
+ 6.2. Quit:
+
+ foreach plugin:
+ wrapper.stop()
+
+7. Things to consider:
+
+ - Will the fact that all the plugins live in the same environment affect
+ in terms of security? or at least the workflow of each individual
+ plugin?
+ Possible solution: One instance of QScriptEngine for each plugin (kind
+ of a sandbox). But what will be the performance drawbacks to this?
+ - Is there the need to connect signals emitted from the plugin to
+ Vidalia? If so, this seems to be a nice implementation:
+ http://gitorious.org/qtscriptsignalhandler
+ - Do we want to have all files listed in the info.xml file too? May be we
+ can use that to have some kind of sanity check.
1
0
commit 92f39c6d275d07b9a49fc1a412c6482551190831
Author: Tomas Touceda <chiiph(a)torproject.org>
Date: Wed Jun 1 17:02:07 2011 -0300
Plugin framework: initial commit
It introduces the basic structure of the plugin management, not the actual
API. There's some refactoring to do, but the basic layout is working.
---
CMakeLists.txt | 2 +-
src/vidalia/CMakeLists.txt | 13 ++
src/vidalia/MainWindow.cpp | 24 +++-
src/vidalia/MainWindow.h | 7 +
src/vidalia/config/VidaliaSettings.cpp | 13 ++
src/vidalia/config/VidaliaSettings.h | 5 +
src/vidalia/plugin/PluginEngine.cpp | 64 ++++++++
src/vidalia/plugin/PluginEngine.h | 28 ++++
src/vidalia/plugin/PluginWrapper.cpp | 157 ++++++++++++++++++++
src/vidalia/plugin/PluginWrapper.h | 46 ++++++
.../plugin/prototypes/VidaliaTabPrototype.cpp | 10 ++
.../plugin/prototypes/VidaliaTabPrototype.h | 21 +++
12 files changed, 388 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dfd8f3b..0c07d0d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -37,10 +37,10 @@ include(FindQt4)
find_package(Qt4 REQUIRED)
set(QT_USE_QTNETWORK true)
set(QT_USE_QTXML true)
+set(QT_USE_QTSCRIPT true)
if (USE_MARBLE)
set(QT_USE_QTSVG true)
set(QT_USE_QTWEBKIT true)
- set(QT_USE_QTSCRIPT true)
set(QT_USE_QTDBUS true)
endif(USE_MARBLE)
include(${QT_USE_FILE})
diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt
index 5811320..4cbe458 100644
--- a/src/vidalia/CMakeLists.txt
+++ b/src/vidalia/CMakeLists.txt
@@ -20,6 +20,8 @@ include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/help/browser
${CMAKE_CURRENT_SOURCE_DIR}/log
${CMAKE_CURRENT_SOURCE_DIR}/network
+ ${CMAKE_CURRENT_SOURCE_DIR}/plugin
+ ${CMAKE_CURRENT_SOURCE_DIR}/plugin/prototypes
${MARBLE_INCLUDE_DIR}
)
@@ -80,6 +82,17 @@ qt4_wrap_cpp(vidalia_SRCS
bwgraph/BandwidthGraph.h
bwgraph/GraphFrame.h
)
+## Plugin framework sources
+set(vidalia_SRCS ${vidalia_SRCS}
+ plugin/PluginEngine.cpp
+ plugin/PluginWrapper.cpp
+ plugin/prototypes/VidaliaTabPrototype.cpp
+)
+qt4_wrap_cpp(vidalia_SRCS
+ plugin/PluginEngine.h
+ plugin/PluginWrapper.h
+ plugin/prototypes/VidaliaTabPrototype.h
+)
## Configuration dialog sources
set(vidalia_SRCS ${vidalia_SRCS}
diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp
index 70e8044..931df1c 100644
--- a/src/vidalia/MainWindow.cpp
+++ b/src/vidalia/MainWindow.cpp
@@ -37,6 +37,8 @@
#include "stringutil.h"
#include "procutil.h"
+#include "PluginWrapper.h"
+
#include <QtGui>
#define IMG_BWGRAPH ":/images/16x16/utilities-system-monitor.png"
@@ -100,6 +102,8 @@ MainWindow::MainWindow()
/* Create a new TorControl object, used to communicate with Tor */
_torControl = Vidalia::torControl();
+ _engine = new PluginEngine();
+
createGUI();
createConnections();
@@ -176,7 +180,11 @@ MainWindow::createMenuBar()
viewMenu->addSeparator();
viewMenu->addAction(_actionConfigure);
-// QMenu *pluginsMenu = menu->addMenu(tr("Plugins"));
+ QMenu *pluginsMenu = menu->addMenu(tr("Plugins"));
+ foreach(QAction *action, _engine->getAllActions()) {
+ pluginsMenu->addAction(action);
+ connect(action, SIGNAL(triggered()), this, SLOT(showPluginTab()));
+ }
QMenu *helpMenu = menu->addMenu(tr("Help"));
helpMenu->addAction(_actionVidaliaHelp);
@@ -1539,6 +1547,12 @@ MainWindow::addTab(VidaliaTab *tab)
* instanse passed */
if(_tabMap.contains(tab->getTitle())) {
ui.tabWidget->setCurrentIndex(_tabMap.indexOf(tab->getTitle()));
+
+ /** If we are trying to open the exact same tab twice
+ * don't do anything */
+ if(tab == ui.tabWidget->widget(_tabMap.indexOf(tab->getTitle())))
+ return;
+
/** Exception for tabs that need to be always created */
if (tab != _messageLog &&
tab != &_statusTab &&
@@ -1579,6 +1593,14 @@ MainWindow::delTab(int index)
}
void
+MainWindow::showPluginTab()
+{
+ QAction *act = qobject_cast<QAction *>(sender());
+ PluginWrapper *wrapper = qobject_cast<PluginWrapper *>(act->parent());
+ addTab(wrapper->buildGUI());
+}
+
+void
MainWindow::showStatusTab()
{
addTab(&_statusTab);
diff --git a/src/vidalia/MainWindow.h b/src/vidalia/MainWindow.h
index 7d386d5..e5366b8 100644
--- a/src/vidalia/MainWindow.h
+++ b/src/vidalia/MainWindow.h
@@ -36,6 +36,8 @@
#include "TorControl.h"
+#include "PluginEngine.h"
+
#include <QMainWindow>
#include <QTimer>
#include <QSystemTrayIcon>
@@ -142,6 +144,9 @@ private slots:
/** Deletes the tab at index if it exists and it isn't the Status tab */
void delTab(int index = -1);
+ /** Handles adding a new tab corresponding to a plugin */
+ void showPluginTab();
+
/** Called when the web browser or IM client have stopped */
void onSubprocessFinished(int exitCode, QProcess::ExitStatus exitStatus);
/** Called periodically to check if the browser is running. If it is not,
@@ -304,6 +309,8 @@ private:
NetViewer _netViewer; /**< Network map that draws circuits */
QStringList _tabMap; /**< Map to handle opened tabs */
BandwidthGraph *_graph; /**< Graph that draws bandwidth usage */
+
+ PluginEngine *_engine;
};
#endif
diff --git a/src/vidalia/config/VidaliaSettings.cpp b/src/vidalia/config/VidaliaSettings.cpp
index 0812b03..aa4d18b 100644
--- a/src/vidalia/config/VidaliaSettings.cpp
+++ b/src/vidalia/config/VidaliaSettings.cpp
@@ -39,6 +39,7 @@
#define SETTING_LAST_UPDATE_CHECK "LastUpdateCheck"
#define SETTING_USE_LOCAL_GEOIP_DATABASE "UseLocalGeoIpDatabase"
#define SETTING_LOCAL_GEOIP_DATABASE "LocalGeoIpDatabase"
+#define SETTING_PLUGIN_PATH "PluginPath"
#if defined(Q_OS_WIN32)
#define STARTUP_REG_KEY "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
@@ -82,6 +83,7 @@ VidaliaSettings::VidaliaSettings()
setDefault(SETTING_LAST_UPDATE_CHECK, QDateTime());
setDefault(SETTING_USE_LOCAL_GEOIP_DATABASE, false);
setDefault(SETTING_LOCAL_GEOIP_DATABASE, "");
+ setDefault(SETTING_PLUGIN_PATH, vApp->dataDirectory());
}
/** Gets the currently preferred language code for Vidalia. */
@@ -321,3 +323,14 @@ VidaliaSettings::setLocalGeoIpDatabase(const QString &databaseFile)
setValue(SETTING_LOCAL_GEOIP_DATABASE, databaseFile);
}
+QString
+VidaliaSettings::pluginPath() const
+{
+ return QDir::convertSeparators(value(SETTING_PLUGIN_PATH).toString());
+}
+
+void
+VidaliaSettings::setPluginPath(const QString &path)
+{
+ setValue(SETTING_PLUGIN_PATH, path);
+}
diff --git a/src/vidalia/config/VidaliaSettings.h b/src/vidalia/config/VidaliaSettings.h
index 2667b12..029657f 100644
--- a/src/vidalia/config/VidaliaSettings.h
+++ b/src/vidalia/config/VidaliaSettings.h
@@ -125,6 +125,11 @@ public:
QString localGeoIpDatabase() const;
/** Sets the file to use as a local GeoIP database. */
void setLocalGeoIpDatabase(const QString &databaseFile);
+
+ /** Returns the path where the plugins live */
+ QString pluginPath() const;
+ /** Sets the path where the plugins live */
+ void setPluginPath(const QString &path);
};
#endif
diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp
new file mode 100644
index 0000000..fe85883
--- /dev/null
+++ b/src/vidalia/plugin/PluginEngine.cpp
@@ -0,0 +1,64 @@
+#include "PluginEngine.h"
+#include "VidaliaSettings.h"
+#include "PluginWrapper.h"
+
+PluginEngine::PluginEngine(QObject *parent)
+ : QScriptEngine(parent)
+{
+ // load prototypes
+ VidaliaTabPrototype vtabproto;
+ QScriptValue vtabscript = newQObject(&vtabproto, QScriptEngine::ScriptOwnership);
+ setDefaultPrototype(qMetaTypeId<VidaliaTab *>(), vtabscript);
+
+ // load constructors
+ QScriptValue vtabctor = newFunction(VidaliaTabPrototype::constructor, vtabscript);
+ globalObject().setProperty("VidaliaTab", vtabctor);
+
+ loadAllPlugins();
+}
+
+PluginEngine::~PluginEngine() {}
+
+void
+PluginEngine::loadAllPlugins()
+{
+ qWarning() << "loadAllPlugins()";
+
+ VidaliaSettings settings;
+ QDir path = QDir(settings.pluginPath());
+
+ qWarning() << "PluginPath" << path.absolutePath();
+
+ foreach(QString pdir, path.entryList(QDir::NoDotAndDotDot|QDir::AllDirs)) {
+ qWarning() << "pdir" << pdir;
+ QFileInfo finfo(QString("%1%2%3").arg(path.absolutePath()).arg(QDir::separator()).arg(pdir));
+
+ if(finfo.isDir()) {
+ tryLoadPlugin(finfo.filePath());
+ }
+ }
+}
+
+void
+PluginEngine::tryLoadPlugin(QDir path)
+{
+ qWarning() << "tryLoadPlugin()" << path.absolutePath();
+
+ QStringList files = path.entryList();
+
+ if(!files.contains("info.xml"))
+ return;
+
+ PluginWrapper *wrapper = new PluginWrapper(QString("%1%2info.xml").arg(path.absolutePath()).arg(QDir::separator()), this);
+ wrappers << wrapper;
+}
+
+QList<QAction *>
+PluginEngine::getAllActions()
+{
+ QList<QAction *> actions;
+ foreach(PluginWrapper *wrapper, wrappers)
+ actions << wrapper->menuAction();
+
+ return actions;
+}
diff --git a/src/vidalia/plugin/PluginEngine.h b/src/vidalia/plugin/PluginEngine.h
new file mode 100644
index 0000000..09bff23
--- /dev/null
+++ b/src/vidalia/plugin/PluginEngine.h
@@ -0,0 +1,28 @@
+#ifndef PLUGINENGINE_H
+#define PLUGINENGINE_H
+
+#include <QtGui>
+#include <QtScript>
+
+#include "VidaliaTabPrototype.h"
+
+class PluginWrapper;
+
+class PluginEngine : public QScriptEngine {
+ Q_OBJECT
+
+ public:
+ PluginEngine(QObject *parent = 0);
+ ~PluginEngine();
+
+ QList<QAction *> getAllActions();
+
+ protected:
+ void loadAllPlugins();
+ void tryLoadPlugin(QDir path);
+
+ QList<PluginWrapper *> wrappers;
+};
+
+#endif
+
diff --git a/src/vidalia/plugin/PluginWrapper.cpp b/src/vidalia/plugin/PluginWrapper.cpp
new file mode 100644
index 0000000..b06b863
--- /dev/null
+++ b/src/vidalia/plugin/PluginWrapper.cpp
@@ -0,0 +1,157 @@
+#include "PluginWrapper.h"
+#include "PluginEngine.h"
+
+#include <QtXml>
+
+PluginWrapper::PluginWrapper(const QString &info_path, PluginEngine *engine, QObject *parent)
+ : QObject(parent), _engine(engine)
+{
+ _action = 0;
+ _gui = false;
+ _persistent = false;
+ processInfo(info_path);
+
+ foreach(QString path, _files) {
+ qWarning() << path;
+ QFile file(path);
+ if(file.open(QIODevice::ReadOnly)) {
+ _engine->evaluate(file.readAll());
+ qWarning() << "evaluated";
+ } else
+ qWarning() << "Error opening file";
+ }
+}
+
+PluginWrapper::~PluginWrapper() {}
+
+void
+PluginWrapper::processInfo(const QString &path)
+{
+ qWarning() << "processInfo()";
+
+ QDomDocument info("Plugin Info");
+ QFile file(path);
+ if(!file.open(QIODevice::ReadOnly)) {
+ qWarning() << "Problem opening xml file";
+ return;
+ }
+
+ if(!info.setContent(&file)) {
+ qWarning() << "Problem setting contents";
+ file.close();
+ return;
+ }
+
+ QDomElement root = info.documentElement();
+
+ if(root.tagName() != "VidaliaPlugin") {
+ return;
+ }
+
+ QDomNode n = root.firstChild();
+ while(!n.isNull()) {
+ QDomElement e = n.toElement();
+ if(!e.isNull()) {
+ if(e.tagName() == "name")
+ _name = e.text();
+ else if(e.tagName() == "author")
+ _author = e.text();
+ else if(e.tagName() == "date")
+ _date = e.text();
+ else if(e.tagName() == "type") {
+ _persistent = (e.attribute("persistent", "false") == "true");
+ _gui = (e.attribute("gui", "false") == "true");
+ } else if(e.tagName() == "files") {
+ QDomNode froot = e.firstChild();
+ while(!froot.isNull()) {
+ QDomElement fe = froot.toElement();
+ if(fe.tagName() == "file")
+ _files << QString("%1%2%3").arg(QFileInfo(path).path()).arg(QDir::separator()).arg(fe.text());
+ froot = froot.nextSibling();
+ }
+ } else if(e.tagName() == "namespace") {
+ _nspace = e.text();
+ }
+ }
+ n = n.nextSibling();
+ }
+
+ file.close();
+}
+
+void
+PluginWrapper::start()
+{
+ _engine->evaluate(QString("%1.start()").arg(nspace()));
+}
+
+void
+PluginWrapper::stop()
+{
+ _engine->evaluate(QString("%1.stop()").arg(nspace()));
+}
+
+VidaliaTab *
+PluginWrapper::buildGUI()
+{
+ if(!hasGUI())
+ return NULL;
+ VidaliaTab *tab = qscriptvalue_cast<VidaliaTab *>(_engine->evaluate(QString("%1.buildGUI()").arg(nspace())));
+ if(_engine->hasUncaughtException()) {
+ qWarning() << "Exception:";
+ qWarning() << _engine->uncaughtExceptionLineNumber();
+ }
+ qWarning() << "Casted tab:" << tab << nspace();
+ return tab;
+}
+
+bool
+PluginWrapper::hasGUI()
+{
+ return _gui;
+}
+
+bool
+PluginWrapper::isPersistent()
+{
+ return _persistent;
+}
+
+QString
+PluginWrapper::name() const
+{
+ return _name;
+}
+
+QString
+PluginWrapper::date() const
+{
+ return _date;
+}
+
+QString
+PluginWrapper::author() const
+{
+ return _author;
+}
+
+QString
+PluginWrapper::nspace() const
+{
+ return _nspace;
+}
+
+QStringList
+PluginWrapper::files() const
+{
+ return _files;
+}
+
+QAction *
+PluginWrapper::menuAction()
+{
+ if(hasGUI()) {
+ _action = new QAction(_name, this);
+ }
+ return _action;
+}
diff --git a/src/vidalia/plugin/PluginWrapper.h b/src/vidalia/plugin/PluginWrapper.h
new file mode 100644
index 0000000..1c7ad8f
--- /dev/null
+++ b/src/vidalia/plugin/PluginWrapper.h
@@ -0,0 +1,46 @@
+#ifndef PLUGINWRAPPER_H
+#define PLUGINWRAPPER_H
+
+#include <QtCore>
+
+#include "VidaliaTab.h"
+
+class PluginEngine;
+
+class PluginWrapper : public QObject {
+ Q_OBJECT
+
+ public:
+ PluginWrapper(const QString &info_path, PluginEngine *engine, QObject *parent = 0);
+ ~PluginWrapper();
+
+ bool hasGUI();
+ bool isPersistent();
+
+ QString name() const;
+ QString date() const;
+ QString author() const;
+ QString nspace() const;
+ QStringList files() const;
+
+ QAction *menuAction();
+
+ public slots:
+ void start();
+ void stop();
+ VidaliaTab *buildGUI();
+
+ protected:
+ void processInfo(const QString &path);
+
+ PluginEngine *_engine;
+ QString _name, _date, _author;
+ bool _persistent, _gui;
+ QStringList _files;
+ QString _nspace;
+
+ QAction *_action;
+};
+
+#endif
+
diff --git a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp
new file mode 100644
index 0000000..58170ef
--- /dev/null
+++ b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.cpp
@@ -0,0 +1,10 @@
+#include "VidaliaTabPrototype.h"
+
+VidaliaTabPrototype::VidaliaTabPrototype(QObject *parent)
+ : QObject(parent)
+{}
+
+QScriptValue VidaliaTabPrototype::constructor(QScriptContext *context, QScriptEngine *engine)
+{
+ return engine->newQObject(new VidaliaTab(QString("titulooo"), QString("nombreee")), QScriptEngine::ScriptOwnership);
+}
diff --git a/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h
new file mode 100644
index 0000000..dbd89cd
--- /dev/null
+++ b/src/vidalia/plugin/prototypes/VidaliaTabPrototype.h
@@ -0,0 +1,21 @@
+#ifndef VIDALIATABPROT_H
+#define VIDALIATABPROT_H
+
+#include <QtGui>
+#include <QtScript>
+
+#include "VidaliaTab.h"
+
+class VidaliaTabPrototype : public QObject, public QScriptable
+{
+ Q_OBJECT
+
+ public:
+ VidaliaTabPrototype(QObject *parent = 0);
+ static QScriptValue constructor(QScriptContext *context, QScriptEngine *engine);
+};
+
+Q_DECLARE_METATYPE(VidaliaTab *);
+
+#endif
+
1
0

r24855: {website} Update website with new torbutton version. (in website/trunk: include torbutton)
by Mike Perry 02 Jul '11
by Mike Perry 02 Jul '11
02 Jul '11
Author: mikeperry
Date: 2011-07-02 01:09:57 +0000 (Sat, 02 Jul 2011)
New Revision: 24855
Modified:
website/trunk/include/versions.wmi
website/trunk/torbutton/update.rdf
Log:
Update website with new torbutton version.
Modified: website/trunk/include/versions.wmi
===================================================================
--- website/trunk/include/versions.wmi 2011-07-01 22:45:37 UTC (rev 24854)
+++ website/trunk/include/versions.wmi 2011-07-02 01:09:57 UTC (rev 24855)
@@ -84,8 +84,8 @@
<define-tag file-source-alpha whitespace=delete>tor-<version-alpha>.tar.gz</define-tag>
<define-tag package-source-alpha whitespace=delete>/dist/<file-source-alpha></define-tag>
-<define-tag version-torbutton whitespace=delete>1.2.5 (08 April 2010)</define-tag>
-<define-tag version-hash-torbutton whitespace=delete>sha1:e84592877593ad6119e829ac7199fd19333e101e</define-tag>
+<define-tag version-torbutton whitespace=delete>1.4.0 (30 June 2011)</define-tag>
+<define-tag version-hash-torbutton whitespace=delete>sha1:4df99e70b2991bb51ea70d0c217961174b24a98e</define-tag>
-<define-tag version-torbutton-alpha whitespace=delete>1.3.3-alpha (01 May 2011)</define-tag>
+<define-tag version-torbutton-alpha whitespace=delete>None</define-tag>
<define-tag version-hash-torbutton-alpha whitespace=delete>sha1:c7323cd408ebee28ee23b6a91fe056d59de668f5</define-tag>
Modified: website/trunk/torbutton/update.rdf
===================================================================
(Binary files differ)
1
0
commit e34e4818a9665987cc95ab39ff92ec11de4940dc
Author: Mike Perry <mikeperry-git(a)fscked.org>
Date: Fri Jul 1 17:29:37 2011 -0700
Bump version.
---
src/install.rdf | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/install.rdf b/src/install.rdf
index 0d4c9f7..f3451b6 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry & Kory Kirk</em:creator>
<em:id>{e0204bd5-9d31-402b-a99d-a6aa8ffebdca}</em:id>
- <em:version>1.4.0rc1-pre1</em:version>
+ <em:version>1.4.0</em:version>
<em:homepageURL>https://www.torproject.org/torbutton/</em:homepageURL>
<em:optionsURL>chrome://torbutton/content/preferences.xul</em:optionsURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0

02 Jul '11
commit 67d177b7eaf60b6b66ed40813edc461da7fe46ef
Author: intrigeri <intrigeri(a)boum.org>
Date: Sun Jun 19 23:05:01 2011 +0200
T(A)ILS was renamed to Tails a while ago.
---
src/chrome/locale/af/torbutton.properties | 2 +-
src/chrome/locale/ak/torbutton.properties | 2 +-
src/chrome/locale/am/torbutton.properties | 2 +-
src/chrome/locale/ar/torbutton.properties | 2 +-
src/chrome/locale/arn/torbutton.properties | 2 +-
src/chrome/locale/ast/torbutton.properties | 2 +-
src/chrome/locale/az/torbutton.properties | 2 +-
src/chrome/locale/be/torbutton.properties | 2 +-
src/chrome/locale/bg/torbutton.properties | 2 +-
src/chrome/locale/bn-IN/torbutton.properties | 2 +-
src/chrome/locale/bn/torbutton.properties | 2 +-
src/chrome/locale/bo/torbutton.properties | 2 +-
src/chrome/locale/br/torbutton.properties | 2 +-
src/chrome/locale/bs/torbutton.properties | 2 +-
src/chrome/locale/ca/torbutton.properties | 2 +-
src/chrome/locale/cs/torbutton.properties | 2 +-
src/chrome/locale/csb/torbutton.properties | 2 +-
src/chrome/locale/cy/torbutton.properties | 2 +-
src/chrome/locale/da/torbutton.properties | 2 +-
src/chrome/locale/de/torbutton.properties | 2 +-
src/chrome/locale/dz/torbutton.properties | 2 +-
src/chrome/locale/el/torbutton.properties | 2 +-
src/chrome/locale/en/torbutton.properties | 2 +-
src/chrome/locale/eo/torbutton.properties | 2 +-
src/chrome/locale/es/torbutton.properties | 2 +-
src/chrome/locale/et/torbutton.properties | 2 +-
src/chrome/locale/eu/torbutton.properties | 2 +-
src/chrome/locale/fa/torbutton.properties | 2 +-
src/chrome/locale/fi/torbutton.properties | 2 +-
src/chrome/locale/fil/torbutton.properties | 2 +-
src/chrome/locale/fo/torbutton.properties | 2 +-
src/chrome/locale/fr/torbutton.properties | 2 +-
src/chrome/locale/fur/torbutton.properties | 2 +-
src/chrome/locale/fy/torbutton.properties | 2 +-
src/chrome/locale/ga/torbutton.properties | 2 +-
src/chrome/locale/gl/torbutton.properties | 2 +-
src/chrome/locale/gu/torbutton.properties | 2 +-
src/chrome/locale/gun/torbutton.properties | 2 +-
src/chrome/locale/ha/torbutton.properties | 2 +-
src/chrome/locale/he/torbutton.properties | 2 +-
src/chrome/locale/hi/torbutton.properties | 2 +-
src/chrome/locale/hr/torbutton.properties | 2 +-
src/chrome/locale/ht/torbutton.properties | 2 +-
src/chrome/locale/hu/torbutton.properties | 2 +-
src/chrome/locale/hy/torbutton.properties | 2 +-
src/chrome/locale/id/torbutton.properties | 2 +-
src/chrome/locale/is/torbutton.properties | 2 +-
src/chrome/locale/it/torbutton.properties | 2 +-
src/chrome/locale/ja/torbutton.properties | 2 +-
src/chrome/locale/jv/torbutton.properties | 2 +-
src/chrome/locale/ka/torbutton.properties | 2 +-
src/chrome/locale/km/torbutton.properties | 2 +-
src/chrome/locale/kn/torbutton.properties | 2 +-
src/chrome/locale/ko/torbutton.properties | 2 +-
src/chrome/locale/ku/torbutton.properties | 2 +-
src/chrome/locale/kw/torbutton.properties | 2 +-
src/chrome/locale/ky/torbutton.properties | 2 +-
src/chrome/locale/lb/torbutton.properties | 2 +-
src/chrome/locale/lg/torbutton.properties | 2 +-
src/chrome/locale/ln/torbutton.properties | 2 +-
src/chrome/locale/lo/torbutton.properties | 2 +-
src/chrome/locale/lt/torbutton.properties | 2 +-
src/chrome/locale/lv/torbutton.properties | 2 +-
src/chrome/locale/mg/torbutton.properties | 2 +-
src/chrome/locale/mi/torbutton.properties | 2 +-
src/chrome/locale/mk/torbutton.properties | 2 +-
src/chrome/locale/ml/torbutton.properties | 2 +-
src/chrome/locale/mn/torbutton.properties | 2 +-
src/chrome/locale/mr/torbutton.properties | 2 +-
src/chrome/locale/ms/torbutton.properties | 2 +-
src/chrome/locale/mt/torbutton.properties | 2 +-
src/chrome/locale/my/torbutton.properties | 2 +-
src/chrome/locale/nah/torbutton.properties | 2 +-
src/chrome/locale/nap/torbutton.properties | 2 +-
src/chrome/locale/nb/torbutton.properties | 2 +-
src/chrome/locale/ne/torbutton.properties | 2 +-
src/chrome/locale/nl/torbutton.properties | 2 +-
src/chrome/locale/nn/torbutton.properties | 2 +-
src/chrome/locale/nso/torbutton.properties | 2 +-
src/chrome/locale/oc/torbutton.properties | 2 +-
src/chrome/locale/or/torbutton.properties | 2 +-
src/chrome/locale/pa/torbutton.properties | 2 +-
src/chrome/locale/pap/torbutton.properties | 2 +-
src/chrome/locale/pl/torbutton.properties | 2 +-
src/chrome/locale/pms/torbutton.properties | 2 +-
src/chrome/locale/ps/torbutton.properties | 2 +-
src/chrome/locale/pt-BR/torbutton.properties | 2 +-
src/chrome/locale/pt/torbutton.properties | 2 +-
src/chrome/locale/ro/torbutton.properties | 2 +-
src/chrome/locale/ru/torbutton.properties | 2 +-
src/chrome/locale/sco/torbutton.properties | 2 +-
src/chrome/locale/sk/torbutton.properties | 2 +-
src/chrome/locale/sl/torbutton.properties | 2 +-
src/chrome/locale/so/torbutton.properties | 2 +-
src/chrome/locale/son/torbutton.properties | 2 +-
src/chrome/locale/sq/torbutton.properties | 2 +-
src/chrome/locale/sr/torbutton.properties | 2 +-
src/chrome/locale/st/torbutton.properties | 2 +-
src/chrome/locale/su/torbutton.properties | 2 +-
src/chrome/locale/sv/torbutton.properties | 2 +-
src/chrome/locale/sw/torbutton.properties | 2 +-
src/chrome/locale/ta/torbutton.properties | 2 +-
src/chrome/locale/te/torbutton.properties | 2 +-
src/chrome/locale/tg/torbutton.properties | 2 +-
src/chrome/locale/th/torbutton.properties | 2 +-
src/chrome/locale/ti/torbutton.properties | 2 +-
src/chrome/locale/tk/torbutton.properties | 2 +-
src/chrome/locale/tr/torbutton.properties | 2 +-
src/chrome/locale/uk/torbutton.properties | 2 +-
src/chrome/locale/ur/torbutton.properties | 2 +-
src/chrome/locale/ve/torbutton.properties | 2 +-
src/chrome/locale/vi/torbutton.properties | 2 +-
src/chrome/locale/wa/torbutton.properties | 2 +-
src/chrome/locale/wo/torbutton.properties | 2 +-
src/chrome/locale/zh-CN/torbutton.properties | 2 +-
src/chrome/locale/zh-HK/torbutton.properties | 2 +-
src/chrome/locale/zh-TW/torbutton.properties | 2 +-
src/chrome/locale/zu/torbutton.properties | 2 +-
118 files changed, 118 insertions(+), 118 deletions(-)
diff --git a/src/chrome/locale/af/torbutton.properties b/src/chrome/locale/af/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/af/torbutton.properties
+++ b/src/chrome/locale/af/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ak/torbutton.properties b/src/chrome/locale/ak/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ak/torbutton.properties
+++ b/src/chrome/locale/ak/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/am/torbutton.properties b/src/chrome/locale/am/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/am/torbutton.properties
+++ b/src/chrome/locale/am/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ar/torbutton.properties b/src/chrome/locale/ar/torbutton.properties
index 503819b..4d1ac15 100644
--- a/src/chrome/locale/ar/torbutton.properties
+++ b/src/chrome/locale/ar/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (أساسي)
torbutton.popup.external.title = تحميل محتوى خارجي؟
torbutton.popup.external.app = هناك حاجة لاستخدام تطبيق خارجي للتعامل مع:\n\n
torbutton.popup.external.note = \n\nملاحظة: التطبيقات الخارجية ليست آمنة مع تور بشكل افتراضي ويمكن أن تكشف هويتك!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = إطلاق التطبيق
torbutton.popup.cancel = إلغاء
torbutton.popup.dontask = دائماً أطلق التطبيقات ابتداءً من الآن
diff --git a/src/chrome/locale/arn/torbutton.properties b/src/chrome/locale/arn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/arn/torbutton.properties
+++ b/src/chrome/locale/arn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ast/torbutton.properties b/src/chrome/locale/ast/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ast/torbutton.properties
+++ b/src/chrome/locale/ast/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/az/torbutton.properties b/src/chrome/locale/az/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/az/torbutton.properties
+++ b/src/chrome/locale/az/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/be/torbutton.properties b/src/chrome/locale/be/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/be/torbutton.properties
+++ b/src/chrome/locale/be/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bg/torbutton.properties b/src/chrome/locale/bg/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bg/torbutton.properties
+++ b/src/chrome/locale/bg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bn-IN/torbutton.properties b/src/chrome/locale/bn-IN/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bn-IN/torbutton.properties
+++ b/src/chrome/locale/bn-IN/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bn/torbutton.properties b/src/chrome/locale/bn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bn/torbutton.properties
+++ b/src/chrome/locale/bn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bo/torbutton.properties b/src/chrome/locale/bo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bo/torbutton.properties
+++ b/src/chrome/locale/bo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/br/torbutton.properties b/src/chrome/locale/br/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/br/torbutton.properties
+++ b/src/chrome/locale/br/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/bs/torbutton.properties b/src/chrome/locale/bs/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/bs/torbutton.properties
+++ b/src/chrome/locale/bs/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ca/torbutton.properties b/src/chrome/locale/ca/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ca/torbutton.properties
+++ b/src/chrome/locale/ca/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/cs/torbutton.properties b/src/chrome/locale/cs/torbutton.properties
index 1652ad1..082bc04 100644
--- a/src/chrome/locale/cs/torbutton.properties
+++ b/src/chrome/locale/cs/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/csb/torbutton.properties b/src/chrome/locale/csb/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/csb/torbutton.properties
+++ b/src/chrome/locale/csb/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/cy/torbutton.properties b/src/chrome/locale/cy/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/cy/torbutton.properties
+++ b/src/chrome/locale/cy/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/da/torbutton.properties b/src/chrome/locale/da/torbutton.properties
index 5f837a9..7b218d3 100644
--- a/src/chrome/locale/da/torbutton.properties
+++ b/src/chrome/locale/da/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (afgørende)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/de/torbutton.properties b/src/chrome/locale/de/torbutton.properties
index 010b7dc..856a572 100644
--- a/src/chrome/locale/de/torbutton.properties
+++ b/src/chrome/locale/de/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (kritisch)
torbutton.popup.external.title = Externen Inhalt laden?
torbutton.popup.external.app = Eine externe Applikation wird benötigt, um mit dem folgenden Objekt umzugehen:\n\n
torbutton.popup.external.note = \n\nAnmerkung: Externe Applikationen sind im Allgemeinen NICHT Tor gesichert und können Sie verraten!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Applikation starten
torbutton.popup.cancel = Abbrechen
torbutton.popup.dontask = Von nun an immer Applikationen laden
diff --git a/src/chrome/locale/dz/torbutton.properties b/src/chrome/locale/dz/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/dz/torbutton.properties
+++ b/src/chrome/locale/dz/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/el/torbutton.properties b/src/chrome/locale/el/torbutton.properties
index 44f50a7..ef6916c 100644
--- a/src/chrome/locale/el/torbutton.properties
+++ b/src/chrome/locale/el/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (κρισιμο)
torbutton.popup.external.title = Να φορτωθεί εξωτερικό περιεχόμενο;
torbutton.popup.external.app = Μια εξωτερική εφαρμογή είναι απαραίτητη για τον σωστό χειρισμό:\n\n
torbutton.popup.external.note = \n\nΣΗΜΕΙΩΣΗ: Οι εξωτερικές εφαρμογές ΔΕΝ είναι εξορισμού ασφαλής για το Tor και μπορούν να σας αποκαλύψουν!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Εκτέλεση εφαρμογής
torbutton.popup.cancel = Άκυρον
torbutton.popup.dontask = Από τώρα και στο εξής να εκτελούνται πάντοτε εφαρμογές
diff --git a/src/chrome/locale/en/torbutton.properties b/src/chrome/locale/en/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/en/torbutton.properties
+++ b/src/chrome/locale/en/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/eo/torbutton.properties b/src/chrome/locale/eo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/eo/torbutton.properties
+++ b/src/chrome/locale/eo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/es/torbutton.properties b/src/chrome/locale/es/torbutton.properties
index bbcfbc5..4f10dfc 100644
--- a/src/chrome/locale/es/torbutton.properties
+++ b/src/chrome/locale/es/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Cargar contenido externo?
torbutton.popup.external.app = Una aplicación externa es necesaria para manejar:\n\n
torbutton.popup.external.note = \n\nNOTA: Las aplicaciones externasa NO son de uso seguro para Tor por defecto y podrían desenmascararlo!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Iniciar la aplicación
torbutton.popup.cancel = Cancelar
torbutton.popup.dontask = A partir de ahora, siempre iniciar la aplicación
diff --git a/src/chrome/locale/et/torbutton.properties b/src/chrome/locale/et/torbutton.properties
index 738c69d..dd55b46 100644
--- a/src/chrome/locale/et/torbutton.properties
+++ b/src/chrome/locale/et/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (ülioluline)
torbutton.popup.external.title = Lae välist sisu?
torbutton.popup.external.app = Välist rakendust on vaja, et käsitseda:\n\n
torbutton.popup.external.note = \n\nTeadaanne: välised rakendused ei ole vaikimisi Toriga koos kasutades turvalised ning võivad sind paljastada.\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Käivita rakendus
torbutton.popup.cancel = Katkesta
torbutton.popup.dontask = Alati käivita rakendusi edaspidi
diff --git a/src/chrome/locale/eu/torbutton.properties b/src/chrome/locale/eu/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/eu/torbutton.properties
+++ b/src/chrome/locale/eu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fa/torbutton.properties b/src/chrome/locale/fa/torbutton.properties
index 28253c3..7f3c630 100644
--- a/src/chrome/locale/fa/torbutton.properties
+++ b/src/chrome/locale/fa/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (بسيار مهم)
torbutton.popup.external.title = محتویات خارجی بارگزاری شوند؟
torbutton.popup.external.app = یک برنامه خارجی باید وارد عمل شود:\n\n
torbutton.popup.external.note = \n\nنکته: برنامه های خارجی توسط تُر به طور پیشفرض امن نشده اند و ممکن است هویت اصلی شما را آشکار کنند!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = اجرای برنامه
torbutton.popup.cancel = لغو
torbutton.popup.dontask = از حالا به بعد هر برنامه ای را اجرا کن
diff --git a/src/chrome/locale/fi/torbutton.properties b/src/chrome/locale/fi/torbutton.properties
index c098d75..4678368 100644
--- a/src/chrome/locale/fi/torbutton.properties
+++ b/src/chrome/locale/fi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (kriittinen)
torbutton.popup.external.title = Ladataanko ulkopuolinen sisältö?
torbutton.popup.external.app = Tarvitaan ulkoinen sovellus:\n\n
torbutton.popup.external.note = \n\nHUOM: Ulkoiset sovellukset eivät ole oletusarvoisesti Tor turvallisia ja saattavat poistaa Tor suojauksesi!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Käynnistä sovellus
torbutton.popup.cancel = Peruuta
torbutton.popup.dontask = Käynistä sovellus joka kerta tästä eteenpäin
diff --git a/src/chrome/locale/fil/torbutton.properties b/src/chrome/locale/fil/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fil/torbutton.properties
+++ b/src/chrome/locale/fil/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fo/torbutton.properties b/src/chrome/locale/fo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fo/torbutton.properties
+++ b/src/chrome/locale/fo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fr/torbutton.properties b/src/chrome/locale/fr/torbutton.properties
index 0189322..c2a8108 100644
--- a/src/chrome/locale/fr/torbutton.properties
+++ b/src/chrome/locale/fr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (indispensable)
torbutton.popup.external.title = Charger un contenu externe ?
torbutton.popup.external.app = Une application externe est requise pour gérer:\n\n
torbutton.popup.external.note = \n\nNOTE: Les applicatiosn externes ne sont pas saines par défaut pour Tor et peuvent vous démasquer !\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Lancer l'application
torbutton.popup.cancel = Annuler
torbutton.popup.dontask = Toujours lancer les applications à partir de maintenant
diff --git a/src/chrome/locale/fur/torbutton.properties b/src/chrome/locale/fur/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fur/torbutton.properties
+++ b/src/chrome/locale/fur/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/fy/torbutton.properties b/src/chrome/locale/fy/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/fy/torbutton.properties
+++ b/src/chrome/locale/fy/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ga/torbutton.properties b/src/chrome/locale/ga/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ga/torbutton.properties
+++ b/src/chrome/locale/ga/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/gl/torbutton.properties b/src/chrome/locale/gl/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/gl/torbutton.properties
+++ b/src/chrome/locale/gl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/gu/torbutton.properties b/src/chrome/locale/gu/torbutton.properties
index 9397f4d..467b240 100644
--- a/src/chrome/locale/gu/torbutton.properties
+++ b/src/chrome/locale/gu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = કાર્યક્રમ શરુ કરો
torbutton.popup.cancel = રદ્ કરો
torbutton.popup.dontask = હવે પછી હંમેશા કાર્યક્રમ શરુ કરો
diff --git a/src/chrome/locale/gun/torbutton.properties b/src/chrome/locale/gun/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/gun/torbutton.properties
+++ b/src/chrome/locale/gun/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ha/torbutton.properties b/src/chrome/locale/ha/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ha/torbutton.properties
+++ b/src/chrome/locale/ha/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/he/torbutton.properties b/src/chrome/locale/he/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/he/torbutton.properties
+++ b/src/chrome/locale/he/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hi/torbutton.properties b/src/chrome/locale/hi/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/hi/torbutton.properties
+++ b/src/chrome/locale/hi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hr/torbutton.properties b/src/chrome/locale/hr/torbutton.properties
index 5f91488..54d853f 100644
--- a/src/chrome/locale/hr/torbutton.properties
+++ b/src/chrome/locale/hr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ht/torbutton.properties b/src/chrome/locale/ht/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ht/torbutton.properties
+++ b/src/chrome/locale/ht/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hu/torbutton.properties b/src/chrome/locale/hu/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/hu/torbutton.properties
+++ b/src/chrome/locale/hu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/hy/torbutton.properties b/src/chrome/locale/hy/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/hy/torbutton.properties
+++ b/src/chrome/locale/hy/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/id/torbutton.properties b/src/chrome/locale/id/torbutton.properties
index a15f1c3..206c8a9 100644
--- a/src/chrome/locale/id/torbutton.properties
+++ b/src/chrome/locale/id/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (krusial)
torbutton.popup.external.title = Muat konten eksternal?
torbutton.popup.external.app = Sebuah aplikasi eksternal butuh untuk ditangani:\n\n
torbutton.popup.external.note = \n\nCATATAN: secara default, aplikasi eksternal tidaklah aman untuk Tor dan dapat membuka penyamaran Anda!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Luncurkan aplikasi.
torbutton.popup.cancel = Batal
torbutton.popup.dontask = Selalu luncurkan aplikasi mulai dari sekarang
diff --git a/src/chrome/locale/is/torbutton.properties b/src/chrome/locale/is/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/is/torbutton.properties
+++ b/src/chrome/locale/is/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/it/torbutton.properties b/src/chrome/locale/it/torbutton.properties
index cb5c1b6..d852b5c 100644
--- a/src/chrome/locale/it/torbutton.properties
+++ b/src/chrome/locale/it/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (essenziale)
torbutton.popup.external.title = Caricare il contenuto esterno?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Lanciare l'applicazione
torbutton.popup.cancel = Annulla
torbutton.popup.dontask = Da adesso lanciare sempre le applicazioni
diff --git a/src/chrome/locale/ja/torbutton.properties b/src/chrome/locale/ja/torbutton.properties
index b3686bc..4741521 100644
--- a/src/chrome/locale/ja/torbutton.properties
+++ b/src/chrome/locale/ja/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (重要)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = アプリケーション起動
torbutton.popup.cancel = キャンセル
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/jv/torbutton.properties b/src/chrome/locale/jv/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/jv/torbutton.properties
+++ b/src/chrome/locale/jv/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ka/torbutton.properties b/src/chrome/locale/ka/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ka/torbutton.properties
+++ b/src/chrome/locale/ka/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/km/torbutton.properties b/src/chrome/locale/km/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/km/torbutton.properties
+++ b/src/chrome/locale/km/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/kn/torbutton.properties b/src/chrome/locale/kn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/kn/torbutton.properties
+++ b/src/chrome/locale/kn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ko/torbutton.properties b/src/chrome/locale/ko/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ko/torbutton.properties
+++ b/src/chrome/locale/ko/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ku/torbutton.properties b/src/chrome/locale/ku/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ku/torbutton.properties
+++ b/src/chrome/locale/ku/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/kw/torbutton.properties b/src/chrome/locale/kw/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/kw/torbutton.properties
+++ b/src/chrome/locale/kw/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ky/torbutton.properties b/src/chrome/locale/ky/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ky/torbutton.properties
+++ b/src/chrome/locale/ky/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lb/torbutton.properties b/src/chrome/locale/lb/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lb/torbutton.properties
+++ b/src/chrome/locale/lb/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lg/torbutton.properties b/src/chrome/locale/lg/torbutton.properties
index f991f5a..6ccd278 100644
--- a/src/chrome/locale/lg/torbutton.properties
+++ b/src/chrome/locale/lg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ln/torbutton.properties b/src/chrome/locale/ln/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ln/torbutton.properties
+++ b/src/chrome/locale/ln/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lo/torbutton.properties b/src/chrome/locale/lo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lo/torbutton.properties
+++ b/src/chrome/locale/lo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lt/torbutton.properties b/src/chrome/locale/lt/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lt/torbutton.properties
+++ b/src/chrome/locale/lt/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/lv/torbutton.properties b/src/chrome/locale/lv/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/lv/torbutton.properties
+++ b/src/chrome/locale/lv/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mg/torbutton.properties b/src/chrome/locale/mg/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mg/torbutton.properties
+++ b/src/chrome/locale/mg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mi/torbutton.properties b/src/chrome/locale/mi/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mi/torbutton.properties
+++ b/src/chrome/locale/mi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mk/torbutton.properties b/src/chrome/locale/mk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mk/torbutton.properties
+++ b/src/chrome/locale/mk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ml/torbutton.properties b/src/chrome/locale/ml/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ml/torbutton.properties
+++ b/src/chrome/locale/ml/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mn/torbutton.properties b/src/chrome/locale/mn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mn/torbutton.properties
+++ b/src/chrome/locale/mn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mr/torbutton.properties b/src/chrome/locale/mr/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mr/torbutton.properties
+++ b/src/chrome/locale/mr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ms/torbutton.properties b/src/chrome/locale/ms/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ms/torbutton.properties
+++ b/src/chrome/locale/ms/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/mt/torbutton.properties b/src/chrome/locale/mt/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/mt/torbutton.properties
+++ b/src/chrome/locale/mt/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/my/torbutton.properties b/src/chrome/locale/my/torbutton.properties
index 3f80a83..046400d 100644
--- a/src/chrome/locale/my/torbutton.properties
+++ b/src/chrome/locale/my/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (အေရးၾကီးပါသည္)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nah/torbutton.properties b/src/chrome/locale/nah/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nah/torbutton.properties
+++ b/src/chrome/locale/nah/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nap/torbutton.properties b/src/chrome/locale/nap/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nap/torbutton.properties
+++ b/src/chrome/locale/nap/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nb/torbutton.properties b/src/chrome/locale/nb/torbutton.properties
index 89ca137..2789d5d 100644
--- a/src/chrome/locale/nb/torbutton.properties
+++ b/src/chrome/locale/nb/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (avgjørende)
torbutton.popup.external.title = Laste eksternt innhold?
torbutton.popup.external.app = Et eksternt program er nødvendig for å håndtere:\n\n
torbutton.popup.external.note = \n\nMERK: Eksterne program er IKKE Tor-sikker som standard og kan røpe deg!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Start program
torbutton.popup.cancel = Avbryt
torbutton.popup.dontask = Start alltid programmer fra nå av
diff --git a/src/chrome/locale/ne/torbutton.properties b/src/chrome/locale/ne/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ne/torbutton.properties
+++ b/src/chrome/locale/ne/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nl/torbutton.properties b/src/chrome/locale/nl/torbutton.properties
index 99839be..9409233 100644
--- a/src/chrome/locale/nl/torbutton.properties
+++ b/src/chrome/locale/nl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (cruciaal)
torbutton.popup.external.title = Externe inhoud laden ?
torbutton.popup.external.app = Een externe toepassing is nodig voor : \n\n
torbutton.popup.external.note = \n\n Opmerking : Externe toepassingen zijn NIET veilig en kunnen U ontmaskeren.\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Toepassing starten
torbutton.popup.cancel = Annuleren
torbutton.popup.dontask = Vanaf nu steeds de toepassing starten
diff --git a/src/chrome/locale/nn/torbutton.properties b/src/chrome/locale/nn/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nn/torbutton.properties
+++ b/src/chrome/locale/nn/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/nso/torbutton.properties b/src/chrome/locale/nso/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/nso/torbutton.properties
+++ b/src/chrome/locale/nso/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/oc/torbutton.properties b/src/chrome/locale/oc/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/oc/torbutton.properties
+++ b/src/chrome/locale/oc/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/or/torbutton.properties b/src/chrome/locale/or/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/or/torbutton.properties
+++ b/src/chrome/locale/or/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pa/torbutton.properties b/src/chrome/locale/pa/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/pa/torbutton.properties
+++ b/src/chrome/locale/pa/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pap/torbutton.properties b/src/chrome/locale/pap/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/pap/torbutton.properties
+++ b/src/chrome/locale/pap/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pl/torbutton.properties b/src/chrome/locale/pl/torbutton.properties
index 4fecbca..a950dfd 100644
--- a/src/chrome/locale/pl/torbutton.properties
+++ b/src/chrome/locale/pl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (wymagane)
torbutton.popup.external.title = Załadować zewnętrzną zawartość?
torbutton.popup.external.app = Zawnętrzna aplikacja jest wymagana, aby obsłużyć:\n\n
torbutton.popup.external.note = \n\nUWAGA: Zewnętrzne aplikacje NIE są domyślnie bezpieczne przy używaniu Tora i mogą Cię odkryć!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Uruchom aplikację
torbutton.popup.cancel = Anuluj
torbutton.popup.dontask = Od teraz zawsze uruchamiaj aplikacje
diff --git a/src/chrome/locale/pms/torbutton.properties b/src/chrome/locale/pms/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/pms/torbutton.properties
+++ b/src/chrome/locale/pms/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ps/torbutton.properties b/src/chrome/locale/ps/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ps/torbutton.properties
+++ b/src/chrome/locale/ps/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pt-BR/torbutton.properties b/src/chrome/locale/pt-BR/torbutton.properties
index 099b93e..55b8769 100644
--- a/src/chrome/locale/pt-BR/torbutton.properties
+++ b/src/chrome/locale/pt-BR/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Carregar conteúdo externo?
torbutton.popup.external.app = Uma aplicação externa é necessária para manipular:\n\n
torbutton.popup.external.note = \n\nNOTA: Aplicações externas NÃO são seguras por padrão e podem desmascarar você!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Rode a aplicação
torbutton.popup.cancel = Cancelado
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/pt/torbutton.properties b/src/chrome/locale/pt/torbutton.properties
index 2aea198..5e64dbc 100644
--- a/src/chrome/locale/pt/torbutton.properties
+++ b/src/chrome/locale/pt/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Carregar conteúdo externo?
torbutton.popup.external.app = Uma aplicação externa é necessário para abrir:\n\n
torbutton.popup.external.note = \n\nNota: Aplicações externas ao Tor NÃO são seguras, e podem dar a conhecer a sua origem!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Correr aplicação
torbutton.popup.cancel = Cancelar
torbutton.popup.dontask = Sempre correr aplicações daqui para a frente
diff --git a/src/chrome/locale/ro/torbutton.properties b/src/chrome/locale/ro/torbutton.properties
index 255855c..fed7b97 100644
--- a/src/chrome/locale/ro/torbutton.properties
+++ b/src/chrome/locale/ro/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (critic)
torbutton.popup.external.title = Să încarc conținutul extern?
torbutton.popup.external.app = O aplicaţie externă este necesară să se ocupe de:\n\n
torbutton.popup.external.note = \n\nObservatie: Aplicatiile externe NU sunt sigure cu setările implicite Tor, şi vă pot demasca!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Pornește aplicația
torbutton.popup.cancel = Anulare
torbutton.popup.dontask = Întotdeauna lansează aplicaţii de acum încolo
diff --git a/src/chrome/locale/ru/torbutton.properties b/src/chrome/locale/ru/torbutton.properties
index 2f070b6..35a6c0d 100644
--- a/src/chrome/locale/ru/torbutton.properties
+++ b/src/chrome/locale/ru/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (критично)
torbutton.popup.external.title = Загрузить внешние данные?
torbutton.popup.external.app = Внешняя прикладная программа необходима для обработки:\n\n
torbutton.popup.external.note = \n\nПРИМЕЧАНИЕ: Внешние приложения НЕ ЯВЛЯЮТСЯ безопасными для Tor по умолчанию, и могут разоблачить вас!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Запустить приложение
torbutton.popup.cancel = Отменить
torbutton.popup.dontask = В будущем всегда запускать приложения
diff --git a/src/chrome/locale/sco/torbutton.properties b/src/chrome/locale/sco/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sco/torbutton.properties
+++ b/src/chrome/locale/sco/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sk/torbutton.properties b/src/chrome/locale/sk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sk/torbutton.properties
+++ b/src/chrome/locale/sk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sl/torbutton.properties b/src/chrome/locale/sl/torbutton.properties
index d239c1b..72a63f0 100644
--- a/src/chrome/locale/sl/torbutton.properties
+++ b/src/chrome/locale/sl/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (obvezno)
torbutton.popup.external.title = Naloži zunanje vsebine?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Zaženi program
torbutton.popup.cancel = Prekliči
torbutton.popup.dontask = Vedno zaženi program.
diff --git a/src/chrome/locale/so/torbutton.properties b/src/chrome/locale/so/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/so/torbutton.properties
+++ b/src/chrome/locale/so/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/son/torbutton.properties b/src/chrome/locale/son/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/son/torbutton.properties
+++ b/src/chrome/locale/son/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sq/torbutton.properties b/src/chrome/locale/sq/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sq/torbutton.properties
+++ b/src/chrome/locale/sq/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sr/torbutton.properties b/src/chrome/locale/sr/torbutton.properties
index 5a98e20..af42627 100644
--- a/src/chrome/locale/sr/torbutton.properties
+++ b/src/chrome/locale/sr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (пресудно)
torbutton.popup.external.title = Да ли желите да учитате спољни садржај?
torbutton.popup.external.app = Потребан је спољни програм за руковање:\n\n
torbutton.popup.external.note = \n\nНапомена: спољни програми не гарантују безбедност и могу Вас открити!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Покрени програм
torbutton.popup.cancel = Откажи
torbutton.popup.dontask = Увек покрећи програме од сада па надаље
diff --git a/src/chrome/locale/st/torbutton.properties b/src/chrome/locale/st/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/st/torbutton.properties
+++ b/src/chrome/locale/st/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/su/torbutton.properties b/src/chrome/locale/su/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/su/torbutton.properties
+++ b/src/chrome/locale/su/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sv/torbutton.properties b/src/chrome/locale/sv/torbutton.properties
index 2758ae3..de09829 100644
--- a/src/chrome/locale/sv/torbutton.properties
+++ b/src/chrome/locale/sv/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (kritiskt)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Starta program
torbutton.popup.cancel = Avbryt
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/sw/torbutton.properties b/src/chrome/locale/sw/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/sw/torbutton.properties
+++ b/src/chrome/locale/sw/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ta/torbutton.properties b/src/chrome/locale/ta/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ta/torbutton.properties
+++ b/src/chrome/locale/ta/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/te/torbutton.properties b/src/chrome/locale/te/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/te/torbutton.properties
+++ b/src/chrome/locale/te/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/tg/torbutton.properties b/src/chrome/locale/tg/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/tg/torbutton.properties
+++ b/src/chrome/locale/tg/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/th/torbutton.properties b/src/chrome/locale/th/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/th/torbutton.properties
+++ b/src/chrome/locale/th/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ti/torbutton.properties b/src/chrome/locale/ti/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ti/torbutton.properties
+++ b/src/chrome/locale/ti/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/tk/torbutton.properties b/src/chrome/locale/tk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/tk/torbutton.properties
+++ b/src/chrome/locale/tk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/tr/torbutton.properties b/src/chrome/locale/tr/torbutton.properties
index f4025f8..a74fd3f 100644
--- a/src/chrome/locale/tr/torbutton.properties
+++ b/src/chrome/locale/tr/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial =
torbutton.popup.external.title =
torbutton.popup.external.app = Kullanmak için harici bir uygulama seç:\n\n
torbutton.popup.external.note = \n\nNOT: Başka bir uyguluma sizin için güvenli olmayabilir!\n\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Uygulamayı çalıştır\n
torbutton.popup.cancel = İptal\n
torbutton.popup.dontask = Şu andan itibaren uygulamayı sürekli çalıştır\r\n
diff --git a/src/chrome/locale/uk/torbutton.properties b/src/chrome/locale/uk/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/uk/torbutton.properties
+++ b/src/chrome/locale/uk/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ur/torbutton.properties b/src/chrome/locale/ur/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ur/torbutton.properties
+++ b/src/chrome/locale/ur/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/ve/torbutton.properties b/src/chrome/locale/ve/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/ve/torbutton.properties
+++ b/src/chrome/locale/ve/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/vi/torbutton.properties b/src/chrome/locale/vi/torbutton.properties
index 3d3b3d1..e3c6718 100644
--- a/src/chrome/locale/vi/torbutton.properties
+++ b/src/chrome/locale/vi/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (cấp thiết)
torbutton.popup.external.title = Nạp nội dung bên ngoài?
torbutton.popup.external.app = Một ứng dụng bên ngoài cần có để xử lý:\n\n
torbutton.popup.external.note = \n\nLƯU Ý: Các ứng dụng bên ngoài không an toàn cho Tor theo mặc định và có thể làm lộ chân tướng bạn!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Khởi chạy ứng dụng
torbutton.popup.cancel = Hủy bỏ
torbutton.popup.dontask = Luôn luôn khởi chạy các ứng dụng kể từ bây giờ
diff --git a/src/chrome/locale/wa/torbutton.properties b/src/chrome/locale/wa/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/wa/torbutton.properties
+++ b/src/chrome/locale/wa/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/wo/torbutton.properties b/src/chrome/locale/wo/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/wo/torbutton.properties
+++ b/src/chrome/locale/wo/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/zh-CN/torbutton.properties b/src/chrome/locale/zh-CN/torbutton.properties
index 22226db..23b1c29 100644
--- a/src/chrome/locale/zh-CN/torbutton.properties
+++ b/src/chrome/locale/zh-CN/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (重要)
torbutton.popup.external.title = 载入外部内容?
torbutton.popup.external.app = 需要外部程序来处理:\n\n
torbutton.popup.external.note = \n\n注意:Tor 不能使外部程序的访问安全,可能泄露您的身份!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = 启动程序
torbutton.popup.cancel = 取消
torbutton.popup.dontask = 此后总是启动程序
diff --git a/src/chrome/locale/zh-HK/torbutton.properties b/src/chrome/locale/zh-HK/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/zh-HK/torbutton.properties
+++ b/src/chrome/locale/zh-HK/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/zh-TW/torbutton.properties b/src/chrome/locale/zh-TW/torbutton.properties
index 6405783..0009dca 100644
--- a/src/chrome/locale/zh-TW/torbutton.properties
+++ b/src/chrome/locale/zh-TW/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
diff --git a/src/chrome/locale/zu/torbutton.properties b/src/chrome/locale/zu/torbutton.properties
index 4116270..2399f53 100644
--- a/src/chrome/locale/zu/torbutton.properties
+++ b/src/chrome/locale/zu/torbutton.properties
@@ -24,7 +24,7 @@ torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Load external content?
torbutton.popup.external.app = An external application is needed to handle:\n\n
torbutton.popup.external.note = \n\nNOTE: External applications are NOT Tor safe by default and can unmask you!\n
-torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like T(A)ILS LiveCD or torsocks.\n
+torbutton.popup.external.suggest = \nIf this file is untrusted, you should either save it to view while offline or in a VM,\nor consider using a transparent Tor proxy like Tails LiveCD or torsocks.\n
torbutton.popup.launch = Launch application
torbutton.popup.cancel = Cancel
torbutton.popup.dontask = Always launch applications from now on
1
0

02 Jul '11
commit c43d54eeedec37b980bdd8878d1e1852e7479f88
Author: Mike Perry <mikeperry-git(a)fscked.org>
Date: Fri Jul 1 17:31:13 2011 -0700
The tails patch had a bug number.
---
src/CHANGELOG | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index 2e09080..464cade 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -13,11 +13,11 @@
* bug #1282: Set fixed window size for each new window.
* bug #3508: Apply Stanford SafeCache patch (thanks Edward, Collin et al).
* bug #2361: Make about window work again on FF4+.
+ * bug #3436: T(A)ILS was renamed to Tails.
* bugfix: Fix a transparent context menu issue on Linux FF4+.
* misc: Squelch exception from app launcher in error console.
* misc: Make DuckDuckGo the default Google Captcha redirect destination.
* misc: Make it harder to accidentally toggle torbutton.
- * misc: T(A)ILS was renamed to Tails.
1.3.3-alpha
01 May 2011
1
0